<?xml version="1.0" encoding="UTF-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>React Blog</title><link>https://react.dev/blog</link><atom:link href="http://rss.144-124-237-35.sslip.io/react/blog" rel="self" type="application/rss+xml"></atom:link><description>React Blog - Powered by AtomRSS</description><generator>AtomRSS</generator><webMaster>contact@atomgroup.dev (AtomRSS)</webMaster><language>en-US</language><lastBuildDate>Sat, 08 Aug 2026 05:01:01 GMT</lastBuildDate><ttl>5</ttl><item><title>The React Foundation: A New Home for React Hosted by the Linux Foundation</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;February 24, 2026 by &lt;a href=&quot;https://x.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div style=&quot;display:flex;justify-content:center;margin-bottom:1rem;margin-left:7rem;margin-right:7rem&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-foundation/react_foundation_logo.png&quot;&gt;&lt;img class=&quot;w-full light-image&quot; src=&quot;https://react.dev/images/blog/react-foundation/react_foundation_logo.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-foundation/react_foundation_logo_dark.png&quot;&gt;&lt;img class=&quot;w-full dark-image&quot; src=&quot;https://react.dev/images/blog/react-foundation/react_foundation_logo_dark.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;/div&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The React Foundation has officially launched, hosted by the Linux Foundation.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/07/introducing-the-react-foundation&quot;&gt;In October&lt;/a&gt;, we announced our intent to form the React Foundation. Today, we’re excited to share that the React Foundation has officially launched.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React, React Native, and supporting projects like JSX are no longer owned by Meta — they are now owned by the React Foundation, an independent foundation hosted by the Linux Foundation. You can read more in the &lt;a href=&quot;https://www.linuxfoundation.org/press/linux-foundation-announces-the-formation-of-the-react-foundation&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Linux Foundation’s press release&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;founding-members&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Founding Members &lt;a href=&quot;https://react.dev/blog/2026/02/24/the-react-foundation#founding-members&quot; aria-label=&quot;Link for Founding Members &quot; title=&quot;Link for Founding Members &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The React Foundation has eight Platinum founding members: &lt;strong class=&quot;font-bold&quot;&gt;Amazon&lt;/strong&gt;, &lt;strong class=&quot;font-bold&quot;&gt;Callstack&lt;/strong&gt;, &lt;strong class=&quot;font-bold&quot;&gt;Expo&lt;/strong&gt;, &lt;strong class=&quot;font-bold&quot;&gt;Huawei&lt;/strong&gt;, &lt;strong class=&quot;font-bold&quot;&gt;Meta&lt;/strong&gt;, &lt;strong class=&quot;font-bold&quot;&gt;Microsoft&lt;/strong&gt;, &lt;strong class=&quot;font-bold&quot;&gt;Software Mansion&lt;/strong&gt;, and &lt;strong class=&quot;font-bold&quot;&gt;Vercel&lt;/strong&gt;. &lt;strong class=&quot;font-bold&quot;&gt;Huawei&lt;/strong&gt; has joined since &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/07/introducing-the-react-foundation&quot;&gt;our announcement in October&lt;/a&gt;. The React Foundation will be governed by a board of directors composed of representatives from each member, with &lt;a href=&quot;https://sethwebster.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Seth Webster&lt;/a&gt; serving as executive director.&lt;/p&gt;
&lt;div style=&quot;display:flex;justify-content:center;margin:2rem&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-foundation/react_foundation_member_logos_updated.png&quot;&gt;&lt;img class=&quot;w-full light-image&quot; src=&quot;https://react.dev/images/blog/react-foundation/react_foundation_member_logos_updated.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-foundation/react_foundation_member_logos_dark_updated.png&quot;&gt;&lt;img class=&quot;w-full dark-image&quot; src=&quot;https://react.dev/images/blog/react-foundation/react_foundation_member_logos_dark_updated.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;/div&gt;
&lt;h3 id=&quot;new-provisional-leadership-council&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New Provisional Leadership Council &lt;a href=&quot;https://react.dev/blog/2026/02/24/the-react-foundation#new-provisional-leadership-council&quot; aria-label=&quot;Link for New Provisional Leadership Council &quot; title=&quot;Link for New Provisional Leadership Council &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React’s technical governance will always be independent from the React Foundation board — React’s technical direction will continue to be set by the people who contribute to and maintain React. We have formed a provisional leadership council to determine this structure. We will share an update in the coming months.&lt;/p&gt;
&lt;h3 id=&quot;next-steps&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Next Steps &lt;a href=&quot;https://react.dev/blog/2026/02/24/the-react-foundation#next-steps&quot; aria-label=&quot;Link for Next Steps &quot; title=&quot;Link for Next Steps &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;There is still work to do to complete the transition. In the coming months we will be:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Finalizing the technical governance structure for React&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Transferring repositories, websites, and other infrastructure to the React Foundation&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Exploring programs to support the React ecosystem&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Kicking off planning for the next React Conf&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We will share updates as this work progresses.&lt;/p&gt;
&lt;h3 id=&quot;thank-you&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Thank You &lt;a href=&quot;https://react.dev/blog/2026/02/24/the-react-foundation#thank-you&quot; aria-label=&quot;Link for Thank You &quot; title=&quot;Link for Thank You &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;None of this would be possible without the thousands of contributors who have shaped React over the past decade. Thank you to our founding members, to every contributor who has opened a pull request, filed an issue, or helped someone learn React, and to the millions of developers who build with React every day. The React Foundation exists because of this community, and we’re looking forward to building its future together.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;Blog&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;Denial of Service and Source Code Exposure in React Server Components&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2026/02/24/the-react-foundation</link><guid isPermaLink="false">https://react.dev/blog/2026/02/24/the-react-foundation</guid><pubDate>Mon, 23 Feb 2026 16:00:00 GMT</pubDate></item><item><title>Denial of Service and Source Code Exposure in React Server Components</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;December 11, 2025 by &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/team&quot;&gt;The React Team&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;Updated January 26, 2026.&lt;/em&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Security researchers have found and disclosed two additional vulnerabilities in React Server Components while attempting to exploit the patches in last week’s critical vulnerability.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;These new vulnerabilities do not allow for Remote Code Execution.&lt;/strong&gt; The patch for React2Shell remains effective at mitigating the Remote Code Execution exploit.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The new vulnerabilities are disclosed as:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Denial of Service - High Severity&lt;/strong&gt;: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55184&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-55184&lt;/a&gt;, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-67779&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-67779&lt;/a&gt;, and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-23864&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2026-23864&lt;/a&gt; (CVSS 7.5)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Source Code Exposure - Medium Severity&lt;/strong&gt;: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55183&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-55183&lt;/a&gt; (CVSS 5.3)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We recommend upgrading immediately due to the severity of the newly disclosed vulnerabilities.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;the-patches-published-earlier-are-vulnerable&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;The patches published earlier are vulnerable. &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#the-patches-published-earlier-are-vulnerable&quot; aria-label=&quot;Link for The patches published earlier are vulnerable. &quot; title=&quot;Link for The patches published earlier are vulnerable. &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you already updated for the previous vulnerabilities, you will need to update again.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you updated to 19.0.3, 19.1.4, and 19.2.3, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#additional-fix-published&quot;&gt;these are incomplete&lt;/a&gt;, and you will need to update again.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Please see &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-instructions&quot;&gt;the instructions in the previous post&lt;/a&gt; for upgrade steps.&lt;/p&gt;&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;Updated January 26, 2026.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Further details of these vulnerabilities will be provided after the rollout of the fixes are complete.&lt;/p&gt;
&lt;h2 id=&quot;immediate-action-required&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Immediate Action Required &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#immediate-action-required&quot; aria-label=&quot;Link for Immediate Action Required &quot; title=&quot;Link for Immediate Action Required &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;These vulnerabilities are present in the same packages and versions as &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components&quot;&gt;CVE-2025-55182&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This includes 19.0.0, 19.0.1, 19.0.2, 19.0.3, 19.1.0, 19.1.1, 19.1.2, 19.1.3, 19.2.0, 19.2.1, 19.2.2, and 19.2.3 of:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/react-server-dom-webpack&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react-server-dom-webpack&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/react-server-dom-parcel&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react-server-dom-parcel&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/react-server-dom-turbopack?activeTab=readme&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react-server-dom-turbopack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Fixes were backported to versions 19.0.4, 19.1.5, and 19.2.4. If you are using any of the above packages please upgrade to any of the fixed versions immediately.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As before, if your app’s React code does not use a server, your app is not affected by these vulnerabilities. If your app does not use a framework, bundler, or bundler plugin that supports React Server Components, your app is not affected by these vulnerabilities.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;its-common-for-critical-cves-to-uncover-followup-vulnerabilities&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;It’s common for critical CVEs to uncover follow‑up vulnerabilities. &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#its-common-for-critical-cves-to-uncover-followup-vulnerabilities&quot; aria-label=&quot;Link for It’s common for critical CVEs to uncover follow‑up vulnerabilities. &quot; title=&quot;Link for It’s common for critical CVEs to uncover follow‑up vulnerabilities. &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When a critical vulnerability is disclosed, researchers scrutinize adjacent code paths looking for variant exploit techniques to test whether the initial mitigation can be bypassed.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This pattern shows up across the industry, not just in JavaScript. For example, after &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/cve-2021-44228&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Log4Shell&lt;/a&gt;, additional CVEs (&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/cve-2021-45046&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/cve-2021-45105&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;2&lt;/a&gt;) were reported as the community probed the original fix.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Additional disclosures can be frustrating, but they are generally a sign of a healthy response cycle.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;affected-frameworks-and-bundlers&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Affected frameworks and bundlers &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#affected-frameworks-and-bundlers&quot; aria-label=&quot;Link for Affected frameworks and bundlers &quot; title=&quot;Link for Affected frameworks and bundlers &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Some React frameworks and bundlers depended on, had peer dependencies for, or included the vulnerable React packages. The following React frameworks &amp;amp; bundlers are affected: &lt;a href=&quot;https://www.npmjs.com/package/next&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;next&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/react-router&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react-router&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/waku&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;waku&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/@parcel/rsc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@parcel/rsc&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/@vitejs/plugin-rsc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@vite/rsc-plugin&lt;/a&gt;, and &lt;a href=&quot;https://www.npmjs.com/package/rwsdk&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;rwsdk&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Please see &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-instructions&quot;&gt;the instructions in the previous post&lt;/a&gt; for upgrade steps.&lt;/p&gt;
&lt;h3 id=&quot;hosting-provider-mitigations&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Hosting Provider Mitigations &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#hosting-provider-mitigations&quot; aria-label=&quot;Link for Hosting Provider Mitigations &quot; title=&quot;Link for Hosting Provider Mitigations &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As before, we have worked with a number of hosting providers to apply temporary mitigations.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You should not depend on these to secure your app, and still update immediately.&lt;/p&gt;
&lt;h3 id=&quot;react-native&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Native &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#react-native&quot; aria-label=&quot;Link for React Native &quot; title=&quot;Link for React Native &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For React Native users not using a monorepo or &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;, your &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt; version should be pinned in your &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;package.json&lt;/code&gt;, and there are no additional steps needed.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you are using React Native in a monorepo, you should update &lt;em&gt;only&lt;/em&gt; the impacted packages if they are installed:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server-dom-webpack&lt;/code&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server-dom-parcel&lt;/code&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server-dom-turbopack&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This is required to mitigate the security advisories, but you do not need to update &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt; so this will not cause the version mismatch error in React Native.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See &lt;a href=&quot;https://github.com/react/react-native/issues/54772#issuecomment-3617929832&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;this issue&lt;/a&gt; for more information.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;high-severity-multiple-denial-of-service&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;High Severity: Multiple Denial of Service &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#high-severity-multiple-denial-of-service&quot; aria-label=&quot;Link for High Severity: Multiple Denial of Service &quot; title=&quot;Link for High Severity: Multiple Denial of Service &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;CVEs:&lt;/strong&gt; &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-23864&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2026-23864&lt;/a&gt;
&lt;strong class=&quot;font-bold&quot;&gt;Base Score:&lt;/strong&gt; 7.5 (High)
&lt;strong class=&quot;font-bold&quot;&gt;Date&lt;/strong&gt;: January 26, 2026&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Security researchers discovered additional DoS vulnerabilities still exist in React Server Components.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The vulnerabilities are triggered by sending specially crafted HTTP requests to Server Function endpoints, and could lead to server crashes, out-of-memory exceptions or excessive CPU usage; depending on the vulnerable code path being exercised, the application configuration and application code.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The patches published January 26th mitigate these DoS vulnerabilities.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;additional-fix-published&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Additional fixes published &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#additional-fix-published&quot; aria-label=&quot;Link for Additional fixes published &quot; title=&quot;Link for Additional fixes published &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The original fix addressing the DoS in &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55184&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-55184&lt;/a&gt; was incomplete.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This left previous versions vulnerable. Versions 19.0.4, 19.1.5, 19.2.4 are safe.&lt;/p&gt;&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;Updated January 26, 2026.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;high-severity-denial-of-service&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;High Severity: Denial of Service &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#high-severity-denial-of-service&quot; aria-label=&quot;Link for High Severity: Denial of Service &quot; title=&quot;Link for High Severity: Denial of Service &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;CVEs:&lt;/strong&gt; &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55184&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-55184&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-67779&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-67779&lt;/a&gt;
&lt;strong class=&quot;font-bold&quot;&gt;Base Score:&lt;/strong&gt; 7.5 (High)&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Security researchers have discovered that a malicious HTTP request can be crafted and sent to any Server Functions endpoint that, when deserialized by React, can cause an infinite loop that hangs the server process and consumes CPU. Even if your app does not implement any React Server Function endpoints it may still be vulnerable if your app supports React Server Components.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This creates a vulnerability vector where an attacker may be able to deny users from accessing the product, and potentially have a  performance impact on the server environment.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The patches published today mitigate by preventing the infinite loop.&lt;/p&gt;
&lt;h2 id=&quot;low-severity-source-code-exposure&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Medium Severity: Source Code Exposure &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#low-severity-source-code-exposure&quot; aria-label=&quot;Link for Medium Severity: Source Code Exposure &quot; title=&quot;Link for Medium Severity: Source Code Exposure &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;CVE:&lt;/strong&gt; &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55183&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-55183&lt;/a&gt;
&lt;strong class=&quot;font-bold&quot;&gt;Base Score&lt;/strong&gt;: 5.3 (Medium)&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;A security researcher has discovered that a malicious HTTP request sent to a vulnerable Server Function may unsafely return the source code of any Server Function. Exploitation requires the existence of a Server Function which explicitly or implicitly exposes a stringified argument:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;use server&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;serverFunction&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;conn&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;db&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;createConnection&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;SECRET KEY&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;user&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;conn&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;createUser&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-comment&quot;&gt;// implicitly stringified, leaked in db&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;   &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;user&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;   &lt;span class=&quot;sp-syntax-property&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;`Hello, &lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;!`&lt;/span&gt; &lt;span class=&quot;sp-syntax-comment&quot;&gt;// explicitly stringified, leaked in reply&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;An attacker may be able to leak the following:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;$@1&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;f&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;b&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;Wy43RxUKdxmr5iuBzJ1pN&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;tva1sfodwq&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;Hello, async function(a){console.log(\&quot;serverFunction\&quot;);let b=i.createConnection(\&quot;SECRET KEY\&quot;);return{id:(await b.createUser(a)).id,message:`Hello, ${a}!`}}!&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The patches published today prevent stringifying the Server Function source code.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;only-secrets-in-source-code-may-be-exposed&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Only secrets in source code may be exposed. &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#only-secrets-in-source-code-may-be-exposed&quot; aria-label=&quot;Link for Only secrets in source code may be exposed. &quot; title=&quot;Link for Only secrets in source code may be exposed. &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Secrets hardcoded in source code may be exposed, but runtime secrets such as &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;process.env.SECRET&lt;/code&gt; are not affected.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The scope of the exposed code is limited to the code inside the Server Function, which may include other functions depending on the amount of inlining your bundler provides.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Always verify against production bundles.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;timeline&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Timeline &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#timeline&quot; aria-label=&quot;Link for Timeline &quot; title=&quot;Link for Timeline &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;December 3rd&lt;/strong&gt;: Leak reported to Vercel and &lt;a href=&quot;https://bugbounty.meta.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Meta Bug Bounty&lt;/a&gt; by &lt;a href=&quot;https://github.com/AndrewMohawk&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Andrew MacPherson&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;December 4th&lt;/strong&gt;: Initial DoS reported to &lt;a href=&quot;https://bugbounty.meta.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Meta Bug Bounty&lt;/a&gt; by &lt;a href=&quot;https://ryotak.net/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RyotaK&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;December 6th&lt;/strong&gt;: Both issues confirmed by the React team, and the team began investigating.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;December 7th&lt;/strong&gt;: Initial fixes created and the React team began verifying and planning new patch.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;December 8th&lt;/strong&gt;: Affected hosting providers and open source projects notified.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;December 10th&lt;/strong&gt;: Hosting provider mitigations in place and patches verified.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;December 11th&lt;/strong&gt;: Additional DoS reported to &lt;a href=&quot;https://bugbounty.meta.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Meta Bug Bounty&lt;/a&gt; by Shinsaku Nomura.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;December 11th&lt;/strong&gt;: Patches published and publicly disclosed as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55183&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-55183&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55184&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-55184&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;December 11th&lt;/strong&gt;: Missing DoS case found internally, patched and publicly disclosed as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-67779&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-67779&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;January 26th&lt;/strong&gt;: Additional DoS cases found, patched, and publicly disclosed as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-23864&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2026-23864&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;attribution&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Attribution &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components#attribution&quot; aria-label=&quot;Link for Attribution &quot; title=&quot;Link for Attribution &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to &lt;a href=&quot;https://github.com/AndrewMohawk&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Andrew MacPherson (AndrewMohawk)&lt;/a&gt; for reporting the Source Code Exposure, &lt;a href=&quot;https://ryotak.net/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RyotaK&lt;/a&gt; from GMO Flatt Security Inc and Shinsaku Nomura of Bitforest Co., Ltd. for reporting the Denial of Service vulnerabilities. Thank you to &lt;a href=&quot;https://x.com/mufeedvh&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mufeed VH&lt;/a&gt; from &lt;a href=&quot;https://winfunc.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Winfunc Research&lt;/a&gt;, &lt;a href=&quot;https://jviide.iki.fi/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joachim Viide&lt;/a&gt;, &lt;a href=&quot;https://ryotak.net/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RyotaK&lt;/a&gt; from &lt;a href=&quot;https://flatt.tech/en/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;GMO Flatt Security Inc&lt;/a&gt; and Xiangwei Zhang of Tencent Security YUNDING LAB for reporting the additional DoS vulnerabilities.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2026/02/24/the-react-foundation&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;The React Foundation: A New Home for React Hosted by the Linux Foundation&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;Critical Security Vulnerability in React Server Components&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components</link><guid isPermaLink="false">https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components</guid><pubDate>Wed, 10 Dec 2025 16:00:00 GMT</pubDate></item><item><title>Critical Security Vulnerability in React Server Components</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;December 3, 2025 by &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/team&quot;&gt;The React Team&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;There is an unauthenticated remote code execution vulnerability in React Server Components.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We recommend upgrading immediately.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;On November 29th, Lachlan Davidson reported a security vulnerability in React that allows unauthenticated remote code execution by exploiting a flaw in how React decodes payloads sent to React Server Function endpoints.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Even if your app does not implement any React Server Function endpoints it may still be vulnerable if your app supports React Server Components.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This vulnerability was disclosed as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55182&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-55182&lt;/a&gt; and is rated CVSS 10.0.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The vulnerability is present in versions 19.0, 19.1.0, 19.1.1, and 19.2.0 of:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/react-server-dom-webpack&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react-server-dom-webpack&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/react-server-dom-parcel&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react-server-dom-parcel&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/react-server-dom-turbopack?activeTab=readme&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react-server-dom-turbopack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;immediate-action-required&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Immediate Action Required &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#immediate-action-required&quot; aria-label=&quot;Link for Immediate Action Required &quot; title=&quot;Link for Immediate Action Required &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;A fix was introduced in versions &lt;a href=&quot;https://github.com/react/react/releases/tag/v19.0.1&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;19.0.1&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/releases/tag/v19.1.2&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;19.1.2&lt;/a&gt;, and &lt;a href=&quot;https://github.com/react/react/releases/tag/v19.2.1&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;19.2.1&lt;/a&gt;. If you are using any of the above packages please upgrade to any of the fixed versions immediately.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If your app’s React code does not use a server, your app is not affected by this vulnerability. If your app does not use a framework, bundler, or bundler plugin that supports React Server Components, your app is not affected by this vulnerability.&lt;/p&gt;
&lt;h3 id=&quot;affected-frameworks-and-bundlers&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Affected frameworks and bundlers &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#affected-frameworks-and-bundlers&quot; aria-label=&quot;Link for Affected frameworks and bundlers &quot; title=&quot;Link for Affected frameworks and bundlers &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Some React frameworks and bundlers depended on, had peer dependencies for, or included the vulnerable React packages. The following React frameworks &amp;amp; bundlers are affected: &lt;a href=&quot;https://www.npmjs.com/package/next&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;next&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/react-router&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react-router&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/waku&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;waku&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/@parcel/rsc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@parcel/rsc&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/@vitejs/plugin-rsc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@vitejs/plugin-rsc&lt;/a&gt;, and &lt;a href=&quot;https://www.npmjs.com/package/rwsdk&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;rwsdk&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-instructions&quot;&gt;update instructions below&lt;/a&gt; for how to upgrade to these patches.&lt;/p&gt;
&lt;h3 id=&quot;hosting-provider-mitigations&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Hosting Provider Mitigations &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#hosting-provider-mitigations&quot; aria-label=&quot;Link for Hosting Provider Mitigations &quot; title=&quot;Link for Hosting Provider Mitigations &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We have worked with a number of hosting providers to apply temporary mitigations.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You should not depend on these to secure your app, and still update immediately.&lt;/p&gt;
&lt;h3 id=&quot;vulnerability-overview&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Vulnerability overview &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#vulnerability-overview&quot; aria-label=&quot;Link for Vulnerability overview &quot; title=&quot;Link for Vulnerability overview &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a href=&quot;https://react.dev/reference/rsc/server-functions&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Server Functions&lt;/a&gt; allow a client to call a function on a server. React provides integration points and tools that frameworks and bundlers use to help React code run on both the client and the server. React translates requests on the client into HTTP requests which are forwarded to a server. On the server, React translates the HTTP request into a function call and returns the needed data to the client.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;An unauthenticated attacker could craft a malicious HTTP request to any Server Function endpoint that, when deserialized by React, achieves remote code execution on the server. Further details of the vulnerability will be provided after the rollout of the fix is complete.&lt;/p&gt;
&lt;h2 id=&quot;update-instructions&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Update Instructions &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-instructions&quot; aria-label=&quot;Link for Update Instructions &quot; title=&quot;Link for Update Instructions &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;These instructions have been updated to include the new vulnerabilities:&lt;/p&gt;&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Denial of Service - High Severity&lt;/strong&gt;: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55184&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-55184&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-67779&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-67779&lt;/a&gt; (CVSS 7.5)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Source Code Exposure - Medium Severity&lt;/strong&gt;: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55183&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2025-55183&lt;/a&gt; (CVSS 5.3)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Denial of Service - High Severity&lt;/strong&gt;: January 26, 2026 &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-23864&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CVE-2026-23864&lt;/a&gt; (CVSS 7.5)&lt;/li&gt;
&lt;/ul&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components&quot;&gt;follow-up blog post&lt;/a&gt; for more info.&lt;/p&gt;&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;Updated January 26, 2026.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;update-next-js&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Next.js &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-next-js&quot; aria-label=&quot;Link for Next.js &quot; title=&quot;Link for Next.js &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;All users should upgrade to the latest patched version in their release line:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@14&lt;span class=&quot;sp-syntax-static&quot;&gt;.2&lt;/span&gt;.&lt;span class=&quot;sp-syntax-static&quot;&gt;35&lt;/span&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// for 13.3.x, 13.4.x, 13.5.x, 14.x&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@&lt;span class=&quot;sp-syntax-static&quot;&gt;15.0&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;.8&lt;/span&gt;   &lt;span class=&quot;sp-syntax-comment&quot;&gt;// for 15.0.x&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@15&lt;span class=&quot;sp-syntax-static&quot;&gt;.1&lt;/span&gt;.&lt;span class=&quot;sp-syntax-static&quot;&gt;12&lt;/span&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// for 15.1.x&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@&lt;span class=&quot;sp-syntax-static&quot;&gt;15.2&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;.9&lt;/span&gt;   &lt;span class=&quot;sp-syntax-comment&quot;&gt;// for 15.2.x&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@15&lt;span class=&quot;sp-syntax-static&quot;&gt;.3&lt;/span&gt;.&lt;span class=&quot;sp-syntax-static&quot;&gt;9&lt;/span&gt;   &lt;span class=&quot;sp-syntax-comment&quot;&gt;// for 15.3.x&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@&lt;span class=&quot;sp-syntax-static&quot;&gt;15.4&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;.11&lt;/span&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// for 15.4.x&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@15&lt;span class=&quot;sp-syntax-static&quot;&gt;.5&lt;/span&gt;.&lt;span class=&quot;sp-syntax-static&quot;&gt;10&lt;/span&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// for 15.5.x&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@&lt;span class=&quot;sp-syntax-static&quot;&gt;16.0&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;.11&lt;/span&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// for 16.0.x&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@16&lt;span class=&quot;sp-syntax-static&quot;&gt;.1&lt;/span&gt;.&lt;span class=&quot;sp-syntax-static&quot;&gt;5&lt;/span&gt;   &lt;span class=&quot;sp-syntax-comment&quot;&gt;// for 16.1.x&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@&lt;span class=&quot;sp-syntax-static&quot;&gt;15.6&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;.0&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;canary&lt;/span&gt;.&lt;span class=&quot;sp-syntax-static&quot;&gt;60&lt;/span&gt;   &lt;span class=&quot;sp-syntax-comment&quot;&gt;// for 15.x canary releases&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@&lt;span class=&quot;sp-syntax-static&quot;&gt;16.1&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;.0&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;canary&lt;/span&gt;.&lt;span class=&quot;sp-syntax-static&quot;&gt;19&lt;/span&gt;   &lt;span class=&quot;sp-syntax-comment&quot;&gt;// for 16.x canary releases&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;15.0.8, 15.1.12, 15.2.9, 15.3.9, 15.4.10, 15.5.10, 15.6.0-canary.61, 16.0.11, 16.1.5&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you are on version &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;13.3&lt;/code&gt; or later version of Next.js 13 (&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;13.3.x&lt;/code&gt;, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;13.4.x&lt;/code&gt;, or &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;13.5.x&lt;/code&gt;) please upgrade to version &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;14.2.35&lt;/code&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you are on &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;next@14.3.0-canary.77&lt;/code&gt; or a later canary release, downgrade to the latest stable 14.x release:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;next&lt;/span&gt;@14&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See the &lt;a href=&quot;https://nextjs.org/blog/security-update-2025-12-11&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Next.js blog&lt;/a&gt; for the latest update instructions and the &lt;a href=&quot;https://nextjs.org/blog/CVE-2025-66478&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;previous changelog&lt;/a&gt; for more info.&lt;/p&gt;
&lt;h3 id=&quot;update-react-router&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Router &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-react-router&quot; aria-label=&quot;Link for React Router &quot; title=&quot;Link for React Router &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you are using React Router’s unstable RSC APIs, you should upgrade the following package.json dependencies if they exist:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;server&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;parcel&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;server&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;webpack&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;vitejs&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;/plugin-rsc@latest&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h3 id=&quot;expo&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Expo &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#expo&quot; aria-label=&quot;Link for Expo &quot; title=&quot;Link for Expo &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To learn more about mitigating, read the article on &lt;a href=&quot;https://expo.dev/changelog/mitigating-critical-security-vulnerability-in-react-server-components&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;expo.dev/changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;update-redwood-sdk&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Redwood SDK &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-redwood-sdk&quot; aria-label=&quot;Link for Redwood SDK &quot; title=&quot;Link for Redwood SDK &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Ensure you are on rwsdk&amp;gt;=1.0.0-alpha.0&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For the latest beta version:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;rwsdk&lt;/span&gt;@latest&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Upgrade to the latest &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server-dom-webpack&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;server&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;webpack&lt;/span&gt;@latest&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See &lt;a href=&quot;https://docs.rwsdk.com/migrating/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Redwood docs&lt;/a&gt; for more migration instructions.&lt;/p&gt;
&lt;h3 id=&quot;update-waku&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Waku &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-waku&quot; aria-label=&quot;Link for Waku &quot; title=&quot;Link for Waku &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Upgrade to the latest &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server-dom-webpack&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;server&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;webpack&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; waku@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See &lt;a href=&quot;https://github.com/wakujs/waku/discussions/1823&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Waku announcement&lt;/a&gt; for more migration instructions.&lt;/p&gt;
&lt;h3 id=&quot;vitejs-plugin-rsc&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;@vitejs/plugin-rsc&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#vitejs-plugin-rsc&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Upgrade to the latest RSC plugin:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; @&lt;span class=&quot;sp-syntax-plain&quot;&gt;vitejs&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;/plugin-rsc@latest&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h3 id=&quot;update-react-server-dom-parcel&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server-dom-parcel&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-react-server-dom-parcel&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Update to the latest version:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;server&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;parcel&lt;/span&gt;@latest&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h3 id=&quot;update-react-server-dom-turbopack&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server-dom-turbopack&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-react-server-dom-turbopack&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Update to the latest version:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;server&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;turbopack&lt;/span&gt;@latest&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h3 id=&quot;update-react-server-dom-webpack&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server-dom-webpack&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-react-server-dom-webpack&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Update to the latest version:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;server&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;webpack&lt;/span&gt;@latest&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h3 id=&quot;react-native&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Native &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#react-native&quot; aria-label=&quot;Link for React Native &quot; title=&quot;Link for React Native &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For React Native users not using a monorepo or &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;, your &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt; version should be pinned in your &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;package.json&lt;/code&gt;, and there are no additional steps needed.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you are using React Native in a monorepo, you should update &lt;em&gt;only&lt;/em&gt; the impacted packages if they are installed:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server-dom-webpack&lt;/code&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server-dom-parcel&lt;/code&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server-dom-turbopack&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This is required to mitigate the security advisory, but you do not need to update &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt; so this will not cause the version mismatch error in React Native.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See &lt;a href=&quot;https://github.com/react/react-native/issues/54772#issuecomment-3617929832&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;this issue&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h2 id=&quot;timeline&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Timeline &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#timeline&quot; aria-label=&quot;Link for Timeline &quot; title=&quot;Link for Timeline &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;November 29th&lt;/strong&gt;: Lachlan Davidson reported the security vulnerability via &lt;a href=&quot;https://bugbounty.meta.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Meta Bug Bounty&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;November 30th&lt;/strong&gt;: Meta security researchers confirmed and began working with the React team on a fix.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;December 1st&lt;/strong&gt;: A fix was created and the React team began working with affected hosting providers and open source projects to validate the fix, implement mitigations and roll out the fix&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;December 3rd&lt;/strong&gt;: The fix was published to npm and the publicly disclosed as CVE-2025-55182.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;attribution&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Attribution &lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#attribution&quot; aria-label=&quot;Link for Attribution &quot; title=&quot;Link for Attribution &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to &lt;a href=&quot;https://github.com/lachlan2k&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lachlan Davidson&lt;/a&gt; for discovering, reporting, and working to help fix this vulnerability.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;Denial of Service and Source Code Exposure in React Server Components&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2025/10/16/react-conf-2025-recap&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Conf 2025 Recap&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components</link><guid isPermaLink="false">https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components</guid><pubDate>Tue, 02 Dec 2025 16:00:00 GMT</pubDate></item><item><title>React Conf 2025 Recap</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Oct 16, 2025 by &lt;a href=&quot;https://x.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt; and &lt;a href=&quot;https://bsky.app/profile/ricky.fm&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ricky Hanlon&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Last week we hosted React Conf 2025 where we announced the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/07/introducing-the-react-foundation&quot;&gt;React Foundation&lt;/a&gt; and showcased new features coming to React and React Native.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Conf 2025 was held on October 7-8, 2025, in Henderson, Nevada.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The entire &lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=1067s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;day 1&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=2299s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;day 2&lt;/a&gt; streams are available online, and you can view photos from the event &lt;a href=&quot;https://conf.react.dev/photos&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In this post, we’ll summarize the talks and announcements from the event.&lt;/p&gt;
&lt;h2 id=&quot;day-1-keynote&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Day 1 Keynote &lt;a href=&quot;https://react.dev/blog/2025/10/16/react-conf-2025-recap#day-1-keynote&quot; aria-label=&quot;Link for Day 1 Keynote &quot; title=&quot;Link for Day 1 Keynote &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;Watch the full day 1 stream &lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=1067s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;here.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the day 1 keynote, Joe Savona shared the updates from the team and community since the last React Conf and highlights from React 19.0 and 19.1.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Mofei Zhang highlighted the new features in React 19.2 including:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://react.dev/reference/react/Activity&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity /&amp;gt;&lt;/code&gt;&lt;/a&gt;  — a new component to manage visibility.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://react.dev/reference/react/useEffectEvent&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffectEvent&lt;/code&gt;&lt;/a&gt; to fire events from Effects.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://react.dev/reference/dev-tools/react-performance-tracks&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Performance Tracks&lt;/a&gt; — a new profiling tool in DevTools.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#partial-pre-rendering&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Partial Pre-Rendering&lt;/a&gt; to pre-render part of an app ahead of time, and resume rendering it later.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Jack Pope announced new features in Canary including:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://react.dev/reference/react/ViewTransition&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition /&amp;gt;&lt;/code&gt;&lt;/a&gt; — a new component to animate page transitions.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://react.dev/reference/react/Fragment#fragmentinstance&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Fragment Refs&lt;/a&gt; — a new way to interact with the DOM nodes wrapped by a Fragment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Lauren Tan announced &lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Compiler v1.0&lt;/a&gt; and recommended all apps use React Compiler for benefits like:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler/introduction#what-does-react-compiler-do&quot;&gt;Automatic memoization&lt;/a&gt; that understands React code.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler/installation#eslint-integration&quot;&gt;New lint rules&lt;/a&gt; powered by React Compiler to teach best practices.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler/installation#basic-setup&quot;&gt;Default support&lt;/a&gt; for new apps in Vite, Next.js, and Expo.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler/incremental-adoption&quot;&gt;Migration guides&lt;/a&gt; for existing apps migrating to React Compiler.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Finally, Seth Webster announced the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/07/introducing-the-react-foundation&quot;&gt;React Foundation&lt;/a&gt; to steward React’s open source development and community.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Watch day 1 here:&lt;/p&gt;
&lt;div class=&quot;relative h-0 overflow-hidden pt-[56.25%]&quot;&gt;&lt;iframe class=&quot;absolute inset-0 w-full h-full&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; title=&quot;YouTube video player&quot; src=&quot;https://www.youtube.com/embed/zyVRg2QR6LA?si=z-8t_xCc12HwGJH_&amp;amp;t=1067s&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id=&quot;day-2-keynote&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Day 2 Keynote &lt;a href=&quot;https://react.dev/blog/2025/10/16/react-conf-2025-recap#day-2-keynote&quot; aria-label=&quot;Link for Day 2 Keynote &quot; title=&quot;Link for Day 2 Keynote &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;Watch the full day 2 stream &lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=2299s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;here.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Jorge Cohen and Nicola Corti kicked off day 2 highlighting React Native’s incredible growth with 4M weekly downloads (100% growth YoY), and some notable app migrations from Shopify, Zalando, and HelloFresh, award-winning apps like RISE, RUNNA, and Partyful, and AI apps from Mistral, Replit, and v0.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Riccardo Cipolleschi shared two major announcements for React Native:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://reactnative.dev/blog/2025/10/08/react-native-0.82#new-architecture-only&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Native 0.82 will be New Architecture only&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://reactnative.dev/blog/2025/10/08/react-native-0.82#experimental-hermes-v1&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Experimental Hermes V1 support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Ruben Norte and Alex Hunt finished out the keynote by announcing:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://reactnative.dev/blog/2025/10/08/react-native-0.82#dom-node-apis&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;New web-aligned DOM APIs&lt;/a&gt; for improved compatibility with React on the web.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://reactnative.dev/blog/2025/10/08/react-native-0.82#web-performance-apis-canary&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;New Performance APIs&lt;/a&gt; with a new network panel and desktop app.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Watch day 2 here:&lt;/p&gt;
&lt;div class=&quot;relative h-0 overflow-hidden pt-[56.25%]&quot;&gt;&lt;iframe class=&quot;absolute inset-0 w-full h-full&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; title=&quot;YouTube video player&quot; src=&quot;https://www.youtube.com/embed/p9OcztRyDl0?si=qPTHftsUE07cjZpS&amp;amp;t=2299s&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id=&quot;react-team-talks&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React team talks &lt;a href=&quot;https://react.dev/blog/2025/10/16/react-conf-2025-recap#react-team-talks&quot; aria-label=&quot;Link for React team talks &quot; title=&quot;Link for React team talks &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Throughout the conference, there were talks from the React team including:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=10907s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Async React Part I&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=29073s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Part II&lt;/a&gt; &lt;a href=&quot;https://x.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;(Ricky Hanlon)&lt;/a&gt; showed what’s possible using the last 10 years of innovation.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=20274s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Exploring React Performance&lt;/a&gt; &lt;a href=&quot;https://x.com/en_js&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;(Joe Savona)&lt;/a&gt; showed the results of our React performance research.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=10382s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Reimagining Lists in React Native&lt;/a&gt; &lt;a href=&quot;https://x.com/lunaleaps&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;(Luna Wei)&lt;/a&gt; introduced Virtual View, a new primitive for lists that manages visibility with mode-based rendering (hidden/pre-render/visible).&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=8276s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Profiling with React Performance tracks&lt;/a&gt; &lt;a href=&quot;https://x.com/ruslanlesiutin&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;(Ruslan Lesiutin)&lt;/a&gt; showed how to use the new React Performance Tracks to debug performance issues and build great apps.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=9026s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Strict DOM&lt;/a&gt; &lt;a href=&quot;https://nicolasgallagher.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;(Nicolas Gallagher)&lt;/a&gt; talked about Meta’s approach to using web code on native.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=4870s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;View Transitions and Activity&lt;/a&gt; &lt;a href=&quot;https://x.com/chancethedev&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;(Chance Strickland)&lt;/a&gt; — Chance worked with the React team to showcase how to use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity /&amp;gt;&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition /&amp;gt;&lt;/code&gt; to build fast, native-feeling animations.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=9525s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;In case you missed the memo&lt;/a&gt; &lt;a href=&quot;https://bsky.app/profile/codey.bsky.social&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;(Cody Olsen)&lt;/a&gt; - Cody worked with the React team to adopt the Compiler at Sanity Studio, and shared how it went.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;react-framework-talks&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React framework talks &lt;a href=&quot;https://react.dev/blog/2025/10/16/react-conf-2025-recap#react-framework-talks&quot; aria-label=&quot;Link for React framework talks &quot; title=&quot;Link for React framework talks &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The second half of day 2 had a series of talks from React Framework teams including:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=5737s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Native, Amplified&lt;/a&gt; by &lt;a href=&quot;https://x.com/giolaq&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Giovanni Laquidara&lt;/a&gt; and &lt;a href=&quot;https://x.com/efahsl&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Eric Fahsl&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=18213s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Everywhere: Bringing React Into Native Apps&lt;/a&gt; by &lt;a href=&quot;https://x.com/grabbou&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mike Grabowski&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=19538s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;How Parcel Bundles React Server Components&lt;/a&gt; by &lt;a href=&quot;https://x.com/devonovett&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Devon Govett&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=20640s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Designing Page Transitions&lt;/a&gt; by &lt;a href=&quot;https://x.com/delba_oliveira&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Delba de Oliveira&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=21350s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Build Fast, Deploy Faster — Expo in 2025&lt;/a&gt; by &lt;a href=&quot;https://x.com/baconbrix&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Evan Bacon&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=22367s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;The React Router’s take on RSC&lt;/a&gt; by &lt;a href=&quot;https://x.com/kentcdodds&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Kent C. Dodds&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=24992s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RedwoodSDK: Web Standards Meet Full-Stack React&lt;/a&gt; by &lt;a href=&quot;https://x.com/appfactory&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Peter Pistorius&lt;/a&gt; and &lt;a href=&quot;https://x.com/aurorascharff&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Aurora Scharff&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=26065s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;TanStack Start&lt;/a&gt; by &lt;a href=&quot;https://x.com/tannerlinsley&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Tanner Linsley&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;q-and-a&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Q&amp;amp;A &lt;a href=&quot;https://react.dev/blog/2025/10/16/react-conf-2025-recap#q-and-a&quot; aria-label=&quot;Link for Q&amp;amp;A &quot; title=&quot;Link for Q&amp;amp;A &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;There were three Q&amp;amp;A panels during the conference:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=26304s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Team at Meta Q&amp;amp;A&lt;/a&gt; hosted by &lt;a href=&quot;https://x.com/shrutikapoor08&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Shruti Kapoor&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=p9OcztRyDl0&amp;amp;t=26812s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Frameworks Q&amp;amp;A&lt;/a&gt; hosted by &lt;a href=&quot;https://x.com/jherr&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jack Herrington&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=18741s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React and AI Panel&lt;/a&gt; hosted by &lt;a href=&quot;https://x.com/leerob&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lee Robinson&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;and-more&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;And more… &lt;a href=&quot;https://react.dev/blog/2025/10/16/react-conf-2025-recap#and-more&quot; aria-label=&quot;Link for And more… &quot; title=&quot;Link for And more… &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We also heard talks from the community including:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=24204s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Building an MCP Server&lt;/a&gt; by &lt;a href=&quot;https://x.com/JamesSwintonDev&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;James Swinton&lt;/a&gt; (&lt;a href=&quot;https://www.ag-grid.com/?utm_source=react-conf&amp;amp;utm_medium=react-conf-homepage&amp;amp;utm_campaign=react-conf-sponsorship-2025&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;AG Grid&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=25521s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Modern Emails using React&lt;/a&gt; by &lt;a href=&quot;https://x.com/zenorocha&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Zeno Rocha&lt;/a&gt; (&lt;a href=&quot;https://resend.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Resend&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=24917s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Why React Native Apps Make All the Money&lt;/a&gt; by &lt;a href=&quot;https://x.com/plahteenlahti&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Perttu Lähteenlahti&lt;/a&gt; (&lt;a href=&quot;https://www.revenuecat.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RevenueCat&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zyVRg2QR6LA&amp;amp;t=23400s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;The invisible craft of great UX&lt;/a&gt; by &lt;a href=&quot;https://x.com/michaldudak&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Michał Dudak&lt;/a&gt; (&lt;a href=&quot;https://mui.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;MUI&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;thanks&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Thanks &lt;a href=&quot;https://react.dev/blog/2025/10/16/react-conf-2025-recap#thanks&quot; aria-label=&quot;Link for Thanks &quot; title=&quot;Link for Thanks &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to all the staff, speakers, and participants, who made React Conf 2025 possible. There are too many to list, but we want to thank a few in particular.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to &lt;a href=&quot;https://x.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt; for planning the entire event and building the conference website.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to &lt;a href=&quot;https://x.com/chantastic&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Michael Chan&lt;/a&gt; for MCing React Conf with incredible dedication and energy, delivering thoughtful speaker intros, fun jokes, and genuine enthusiasm throughout the event. Thank you to &lt;a href=&quot;https://x.com/JorgeWritesCode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jorge Cohen&lt;/a&gt; for hosting the livestream, interviewing each speaker, and bringing the in-person React Conf experience online.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to &lt;a href=&quot;https://x.com/mat_kornacki&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mateusz Kornacki&lt;/a&gt;, &lt;a href=&quot;https://x.com/grabbou&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mike Grabowski&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/krzysztoflisakakris/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Kris Lis&lt;/a&gt; and the team at &lt;a href=&quot;https://www.callstack.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Callstack&lt;/a&gt; for co-organizing React Conf and providing design, engineering, and marketing support. Thank you to the &lt;a href=&quot;https://zeroslopeevents.com/contact-us/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;ZeroSlope team&lt;/a&gt;: Sunny Leggett, Tracey Harrison, Tara Larish, Whitney Pogue, and Brianne Smythia for helping to organize the event.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to &lt;a href=&quot;https://github.com/jorge-cab&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jorge Cabiedes Acosta&lt;/a&gt;, &lt;a href=&quot;https://x.com/gweterings&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Gijs Weterings&lt;/a&gt;, &lt;a href=&quot;https://x.com/yungsters&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Tim Yung&lt;/a&gt;, and &lt;a href=&quot;https://x.com/someextent&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jason Bonta&lt;/a&gt; for bringing questions from the Discord to the livestream. Thank you to &lt;a href=&quot;https://github.com/lynnshaoyu&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lynn Yu&lt;/a&gt; for leading the moderation of the Discord. Thank you to &lt;a href=&quot;https://x.com/sethwebster&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Seth Webster&lt;/a&gt; for welcoming us each day; and to &lt;a href=&quot;https://x.com/vjeux&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Christopher Chedeau&lt;/a&gt;, &lt;a href=&quot;https://x.com/fkgozali&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Kevin Gozali&lt;/a&gt;, and &lt;a href=&quot;https://x.com/Javache&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Pieter De Baets&lt;/a&gt; for joining us with a special message during the after-party.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to &lt;a href=&quot;https://x.com/kadikraman&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Kadi Kraman&lt;/a&gt;, &lt;a href=&quot;https://x.com/betomoedano&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Beto&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/in/nicolas-solerieu/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Nicolas Solerieu&lt;/a&gt; for building the conference mobile app. Thank you &lt;a href=&quot;https://x.com/wojteg1337&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Wojtek Szafraniec&lt;/a&gt; for help with the conference website. Thank you to &lt;a href=&quot;https://www.mustachepower.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mustache&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://cornerstoneav.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Cornerstone&lt;/a&gt; for the visuals, stage, and sound; and to the Westin Hotel for hosting us.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to all the sponsors who made the event possible: &lt;a href=&quot;https://www.developer.amazon.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Amazon&lt;/a&gt;, &lt;a href=&quot;https://mui.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;MUI&lt;/a&gt;, &lt;a href=&quot;https://vercel.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Vercel&lt;/a&gt;, &lt;a href=&quot;https://expo.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Expo&lt;/a&gt;, &lt;a href=&quot;https://rwsdk.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RedwoodSDK&lt;/a&gt;, &lt;a href=&quot;https://www.ag-grid.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ag Grid&lt;/a&gt;, &lt;a href=&quot;https://www.revenuecat.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RevenueCat&lt;/a&gt;, &lt;a href=&quot;https://resend.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Resend&lt;/a&gt;, &lt;a href=&quot;https://www.mux.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mux&lt;/a&gt;, &lt;a href=&quot;https://www.oldmissioncapital.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Old Mission&lt;/a&gt;, &lt;a href=&quot;https://arcjet.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Arcjet&lt;/a&gt;, &lt;a href=&quot;https://infinite.red/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Infinite Red&lt;/a&gt;, and &lt;a href=&quot;https://renderatl.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RenderATL&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to all the speakers who shared their knowledge and experience with the community.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Finally, thank you to everyone who attended in person and online to show what makes React, React. React is more than a library, it is a community, and it was inspiring to see everyone come together to share and learn together.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See you next time!&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;Critical Security Vulnerability in React Server Components&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Compiler v1.0&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2025/10/16/react-conf-2025-recap</link><guid isPermaLink="false">https://react.dev/blog/2025/10/16/react-conf-2025-recap</guid><pubDate>Wed, 15 Oct 2025 16:00:00 GMT</pubDate></item><item><title>React Compiler v1.0</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Oct 7, 2025 by &lt;a href=&quot;https://x.com/potetotes&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lauren Tan&lt;/a&gt;, &lt;a href=&quot;https://x.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joe Savona&lt;/a&gt;, and &lt;a href=&quot;https://x.com/zmofei&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mofei Zhang&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The React team is excited to share new updates:&lt;/p&gt;&lt;/div&gt;
&lt;ol class=&quot;ms-6 my-3 list-decimal&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;React Compiler 1.0 is available today.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Compiler-powered lint rules ship in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;eslint-plugin-react-hooks&lt;/code&gt;’s &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;recommended&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;recommended-latest&lt;/code&gt; preset.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;We’ve published an incremental adoption guide, and partnered with Expo, Vite, and Next.js so new apps can start with the compiler enabled.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We are releasing the compiler’s first stable release today. React Compiler works on both React and React Native, and automatically optimizes components and hooks without requiring rewrites. The compiler has been battle tested on major apps at Meta and is fully production-ready.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler&quot;&gt;React Compiler&lt;/a&gt; is a build-time tool that optimizes your React app through automatic memoization. Last year, we published React Compiler’s &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release&quot;&gt;first beta&lt;/a&gt; and received lots of great feedback and contributions. We’re excited about the wins we’ve seen from folks adopting the compiler (see case studies from &lt;a href=&quot;https://github.com/reactwg/react-compiler/discussions/33&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sanity Studio&lt;/a&gt; and &lt;a href=&quot;https://github.com/reactwg/react-compiler/discussions/52&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Wakelet&lt;/a&gt;) and are excited to bring the compiler to more users in the React community.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This release is the culmination of a huge and complex engineering effort spanning almost a decade. The React team’s first exploration into compilers started with &lt;a href=&quot;https://github.com/facebookarchive/prepack&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Prepack&lt;/a&gt; in 2017. While this project was eventually shut down, there were many learnings that informed the team on the design of Hooks, which were designed with a future compiler in mind. In 2021, &lt;a href=&quot;https://x.com/Huxpro&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Xuan Huang&lt;/a&gt; demoed the &lt;a href=&quot;https://www.youtube.com/watch?v=lGEMwh32soc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;first iteration&lt;/a&gt; of a new take on React Compiler.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Although this first version of the new React Compiler was eventually rewritten, the first prototype gave us increased confidence that this was a tractable problem, and the learnings that an alternative compiler architecture could precisely give us the memoization characteristics we wanted. &lt;a href=&quot;https://x.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joe Savona&lt;/a&gt;, &lt;a href=&quot;https://x.com/_gsathya&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sathya Gunasekaran&lt;/a&gt;, &lt;a href=&quot;https://x.com/zmofei&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mofei Zhang&lt;/a&gt;, and &lt;a href=&quot;https://x.com/potetotes&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lauren Tan&lt;/a&gt; worked through our first rewrite, moving the compiler’s architecture into a Control Flow Graph (CFG) based High-Level Intermediate Representation (HIR). This paved the way for much more precise analysis and even type inference within React Compiler. Since then, many significant portions of the compiler have been rewritten, with each rewrite informed by our learnings from the previous attempt. And we have received significant help and contributions from many members of the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/team&quot;&gt;React team&lt;/a&gt; along the way.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This stable release is our first of many. The compiler will continue to evolve and improve, and we expect to see it become a new foundation and era for the next decade and more of React.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can jump straight to the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler&quot;&gt;quickstart&lt;/a&gt;, or read on for the highlights from React Conf 2025.&lt;/p&gt;
&lt;details class=&quot;my-12 rounded-2xl shadow-inner-border dark:shadow-inner-border-dark relative dark:bg-opacity-20 dark:bg-purple-60 bg-purple-5&quot;&gt;&lt;summary class=&quot;list-none p-8&quot; tabindex=&quot;-1&quot;&gt;&lt;h5 class=&quot;mb-4 uppercase font-bold flex items-center text-sm dark:text-purple-30 text-purple-50&quot;&gt;&lt;svg class=&quot;inline me-2 dark:text-purple-30 text-purple-40&quot; width=&quot;1.5em&quot; height=&quot;1.5em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M34.7409 59.7228L32.9567 58.9094C27.2672 56.3157 20.7328 56.3157 15.0433 58.9094C12.6018 60.0224 9.39163 59.0275 8.44602 56.0621C7.45647 52.9589 5.99975 46.5898 6 35.9997C6.00029 23.5648 8.00803 18.3599 9.11099 16.4196C9.67795 15.4222 10.5255 14.8455 11.2254 14.5264L12.0179 14.1651C19.6351 10.6926 28.4011 10.6738 36 14.1733C43.5989 10.6738 52.3649 10.6926 59.9821 14.1651L60.7746 14.5264C61.4745 14.8455 62.3221 15.4222 62.889 16.4196C63.992 18.3599 65.9997 23.5648 66 35.9997C66.0002 46.5898 64.5435 52.9589 63.554 56.0621C62.6084 59.0275 59.3982 60.0224 56.9567 58.9094C51.2672 56.3157 44.7328 56.3157 39.0433 58.9094L37.2591 59.7228C37.1986 59.7508 37.1373 59.7767 37.0753 59.8004C36.4484 60.0411 35.7556 60.0653 35.1102 59.8648C34.9847 59.8258 34.8613 59.7784 34.7409 59.7228ZM14.5068 19.6246C20.3733 16.9501 27.0874 16.8775 33 19.4067V52.473C26.7613 50.32 19.9378 50.471 13.7811 52.9261C13.0005 49.9843 11.9998 44.547 12 35.9998C12.0002 25.5786 13.4879 21.1893 14.1179 19.8018L14.5068 19.6246ZM39 52.473C45.2387 50.32 52.0622 50.471 58.2189 52.9261C58.9995 49.9843 60.0002 44.547 60 35.9998C59.9998 25.5786 58.5121 21.1893 57.8821 19.8018L57.4932 19.6246C51.6267 16.9501 44.9126 16.8775 39 19.4067V52.473Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Deep Dive&lt;/h5&gt;&lt;div class=&quot;mb-4&quot;&gt;&lt;h4 id=&quot;how-does-react-compiler-work&quot; class=&quot;mdx-heading text-xl font-bold text-primary dark:text-primary-dark text-xl font-display font-bold leading-9 my-4&quot;&gt;How does React Compiler work? &lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1#how-does-react-compiler-work&quot; aria-label=&quot;Link for How does React Compiler work? &quot; title=&quot;Link for How does React Compiler work? &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;&lt;button class=&quot;bg-purple-50 border-purple-50 hover:bg-purple-40 focus:bg-purple-50 active:bg-purple-50 text-base leading-tight font-bold rounded-full py-2 px-4 focus:outline focus:outline-offset-2 focus:outline-link dark:focus:outline-link-dark inline-flex items-center my-1 bg-link border-link text-white hover:bg-link focus:bg-link active:bg-link&quot;&gt;&lt;span class=&quot;me-1&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;Show Details&lt;/button&gt;&lt;/summary&gt;&lt;div class=&quot;p-8 border-t dark:border-purple-60 border-purple-10 &quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Compiler is an optimizing compiler that optimizes components and hooks through automatic memoization. While it is implemented as a Babel plugin currently, the compiler is largely decoupled from Babel and lowers the Abstract Syntax Tree (AST) provided by Babel into its own novel HIR, and through multiple compiler passes, carefully understands data-flow and mutability of your React code. This allows the compiler to granularly memoize values used in rendering, including the ability to memoize conditionally, which is not possible through manual memoization.&lt;/p&gt;&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;ThemeProvider&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;!&lt;span class=&quot;sp-syntax-plain&quot;&gt;props&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// The compiler can still memoize code after a conditional return&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;theme&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;mergeTheme&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;props&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ThemeContext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ThemeContext&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;props&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ThemeContext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;See this example in the &lt;a href=&quot;https://playground.react.dev/#N4Igzg9grgTgxgUxALhASwLYAcIwC4AEwBUYCBAvgQGYwQYEDkMCAhnHowNwA6AdvwQAPHPgIATBNVZQANoWpQ+HNBD4EAKgAsEGBAAU6ANzSSYACix0sYAJRF+BAmmoFzAQisQbAOjha0WXEWPntgRycCFjxYdT45WV51Sgi4NTBCPB09AgBeAj0YAHMEbV0ES2swHyzygBoSMnMyvQBhNTxhPFtbJKdo2LcIpwAeFoR2vk6hQiNWWSgEXOBavQoAPmHI4C9ff0DghD4KLZGAenHJ6bxN5N7+ChA6kDS+ajQilHRsXEyATyw5GI+gWRTQfAA8lg8Ko+GBKDQ6AxGAAjVgohCyAC0WFB4KxLHYeCxaWwgQQMDO4jQGW4-H45nCyTOZ1JWECrBhagAshBJMgCDwQPNZEKHgQwJyae8EPCQVAwZDobC7FwnuAtBAAO4ASSmFL48zAKGksjIFCAA&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Compiler Playground&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In addition to automatic memoization, React Compiler also has validation passes that run on your React code. These passes encode the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rules&quot;&gt;Rules of React&lt;/a&gt;, and uses the compiler’s understanding of data-flow and mutability to provide diagnostics where the Rules of React are broken. These diagnostics often expose latent bugs hiding in React code, and are primarily surfaced through &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;eslint-plugin-react-hooks&lt;/code&gt;.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To learn more about how the compiler optimizes your code, visit the &lt;a href=&quot;https://playground.react.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Playground&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id=&quot;use-react-compiler-today&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Use React Compiler Today &lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1#use-react-compiler-today&quot; aria-label=&quot;Link for Use React Compiler Today &quot; title=&quot;Link for Use React Compiler Today &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To install the compiler:&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;npm&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;npm install --save-dev --save-exact babel-plugin-react-compiler@latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;pnpm&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;pnpm add --save-dev --save-exact babel-plugin-react-compiler@latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;yarn&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;yarn add --dev --exact babel-plugin-react-compiler@latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As part of the stable release, we’ve been making React Compiler easier to add to your projects and added optimizations to how the compiler generates memoization. React Compiler now supports optional chains and array indices as dependencies. These improvements ultimately result in fewer re-renders and more responsive UIs, while letting you keep writing idiomatic declarative code.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can find more details on using the Compiler in &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler&quot;&gt;our docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;react-compiler-at-meta&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;What we’re seeing in production &lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1#react-compiler-at-meta&quot; aria-label=&quot;Link for What we’re seeing in production &quot; title=&quot;Link for What we’re seeing in production &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a href=&quot;https://youtu.be/lyEKhv8-3n0?t=3002&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;The compiler has already shipped in apps like Meta Quest Store&lt;/a&gt;. We’ve seen initial loads and cross-page navigations improve by up to 12%, while certain interactions are more than 2.5× faster. Memory usage stays neutral even with these wins. Although your mileage may vary, we recommend experimenting with the compiler in your app to see similar performance gains.&lt;/p&gt;
&lt;h2 id=&quot;backwards-compatibility&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Backwards Compatibility &lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1#backwards-compatibility&quot; aria-label=&quot;Link for Backwards Compatibility &quot; title=&quot;Link for Backwards Compatibility &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As noted in the Beta announcement, React Compiler is compatible with React 17 and up. If you are not yet on React 19, you can use React Compiler by specifying a minimum target in your compiler config, and adding &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-compiler-runtime&lt;/code&gt; as a dependency. You can find docs on this &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-compiler/target#targeting-react-17-or-18&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;migrating-from-eslint-plugin-react-compiler-to-eslint-plugin-react-hooks&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Enforce the Rules of React with compiler-powered linting &lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1#migrating-from-eslint-plugin-react-compiler-to-eslint-plugin-react-hooks&quot; aria-label=&quot;Link for Enforce the Rules of React with compiler-powered linting &quot; title=&quot;Link for Enforce the Rules of React with compiler-powered linting &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Compiler includes an ESLint rule that helps identify code that breaks the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rules&quot;&gt;Rules of React&lt;/a&gt;. The linter does not require the compiler to be installed, so there’s no risk in upgrading eslint-plugin-react-hooks. We recommend everyone upgrade today.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you have already installed &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;eslint-plugin-react-compiler&lt;/code&gt;, you can now remove it and use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;eslint-plugin-react-hooks@latest&lt;/code&gt;. Many thanks to &lt;a href=&quot;https://bsky.app/profile/michael.faith&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@michaelfaith&lt;/a&gt; for contributing to this improvement!&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To install:&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;npm&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;npm install --save-dev eslint-plugin-react-hooks@latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;pnpm&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;pnpm add --save-dev eslint-plugin-react-hooks@latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;yarn&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;yarn add --dev eslint-plugin-react-hooks@latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// eslint.config.js (Flat Config)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;reactHooks&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;eslint-plugin-react-hooks&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;defineConfig&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;eslint/config&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;defineConfig&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-plain&quot;&gt;reactHooks&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;configs&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;flat&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;recommended&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// eslintrc.json (Legacy Config)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;extends&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;plugin:react-hooks/recommended&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// ...&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To enable React Compiler rules, we recommend using the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;recommended&lt;/code&gt; preset. You can also check out the &lt;a href=&quot;https://github.com/react/react/blob/main/packages/eslint-plugin-react-hooks/README.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;README&lt;/a&gt; for more instructions. Here are a few examples we featured at React Conf:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Catching &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;setState&lt;/code&gt; patterns that cause render loops with &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-render&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;set-state-in-render&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Flagging expensive work inside effects via &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;set-state-in-effect&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Preventing unsafe ref access during render with &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/eslint-plugin-react-hooks/lints/refs&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;refs&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-should-i-do-about-usememo-usecallback-and-reactmemo&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;What should I do about useMemo, useCallback, and React.memo? &lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1#what-should-i-do-about-usememo-usecallback-and-reactmemo&quot; aria-label=&quot;Link for What should I do about useMemo, useCallback, and React.memo? &quot; title=&quot;Link for What should I do about useMemo, useCallback, and React.memo? &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;By default, React Compiler will memoize your code based on its analysis and heuristics. In most cases, this memoization will be as precise, or moreso, than what you may have written — and as noted above, the compiler can memoize even in cases where &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useMemo&lt;/code&gt;/&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useCallback&lt;/code&gt; cannot be used, such as after an early return.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;However, in some cases developers may need more control over memoization. The &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useMemo&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useCallback&lt;/code&gt; hooks can continue to be used with React Compiler as an escape hatch to provide control over which values are memoized. A common use-case for this is if a memoized value is used as an effect dependency, in order to ensure that an effect does not fire repeatedly even when its dependencies do not meaningfully change.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For new code, we recommend relying on the compiler for memoization and using &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useMemo&lt;/code&gt;/&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useCallback&lt;/code&gt; where needed to achieve precise control.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For existing code, we recommend either leaving existing memoization in place (removing it can change compilation output) or carefully testing before removing the memoization.&lt;/p&gt;
&lt;h2 id=&quot;new-apps-should-use-react-compiler&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New apps should use React Compiler &lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1#new-apps-should-use-react-compiler&quot; aria-label=&quot;Link for New apps should use React Compiler &quot; title=&quot;Link for New apps should use React Compiler &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We have partnered with the Expo, Vite, and Next.js teams to add the compiler to the new app experience.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a href=&quot;https://docs.expo.dev/guides/react-compiler/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Expo SDK 54&lt;/a&gt; and up has the compiler enabled by default, so new apps will automatically be able to take advantage of the compiler from the start.&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;npx create-expo-app@latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a href=&quot;https://vite.dev/guide/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Vite&lt;/a&gt; and &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/cli/create-next-app&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Next.js&lt;/a&gt; users can choose the compiler enabled templates in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;create-vite&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;create-next-app&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;npm create vite@latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;npx create-next-app@latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;adopt-react-compiler-incrementally&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Adopt React Compiler incrementally &lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1#adopt-react-compiler-incrementally&quot; aria-label=&quot;Link for Adopt React Compiler incrementally &quot; title=&quot;Link for Adopt React Compiler incrementally &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you’re maintaining an existing application, you can roll out the compiler at your own pace. We published a step-by-step &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler/incremental-adoption&quot;&gt;incremental adoption guide&lt;/a&gt; that covers gating strategies, compatibility checks, and rollout tooling so you can enable the compiler with confidence.&lt;/p&gt;
&lt;h2 id=&quot;swc-support-experimental&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;swc support (experimental) &lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1#swc-support-experimental&quot; aria-label=&quot;Link for swc support (experimental) &quot; title=&quot;Link for swc support (experimental) &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Compiler can be installed across &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler#installation&quot;&gt;several build tools&lt;/a&gt; such as Babel, Vite, and Rsbuild.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In addition to those tools, we have been collaborating with Kang Dongyoon (&lt;a href=&quot;https://x.com/kdy1dev&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@kdy1dev&lt;/a&gt;) from the &lt;a href=&quot;https://swc.rs/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;swc&lt;/a&gt; team on adding additional support for React Compiler as an swc plugin. While this work isn’t done, Next.js build performance should now be considerably faster when the &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/reactCompiler&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Compiler is enabled in your Next.js app&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We recommend using Next.js &lt;a href=&quot;https://github.com/vercel/next.js/releases/tag/v15.3.1&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;15.3.1&lt;/a&gt; or greater to get the best build performance.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Vite users can continue to use &lt;a href=&quot;https://github.com/vitejs/vite-plugin-react&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;vite-plugin-react&lt;/a&gt; to enable the compiler, by adding it as a &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler/installation#vite&quot;&gt;Babel plugin&lt;/a&gt;. We are also working with the &lt;a href=&quot;https://oxc.rs/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;oxc&lt;/a&gt; team to &lt;a href=&quot;https://github.com/oxc-project/oxc/issues/10048&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;add support for the compiler&lt;/a&gt;. Once &lt;a href=&quot;https://github.com/rolldown/rolldown&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;rolldown&lt;/a&gt; is officially released and supported in Vite and oxc support is added for React Compiler, we’ll update the docs with information on how to migrate.&lt;/p&gt;
&lt;h2 id=&quot;upgrading-react-compiler&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Upgrading React Compiler &lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1#upgrading-react-compiler&quot; aria-label=&quot;Link for Upgrading React Compiler &quot; title=&quot;Link for Upgrading React Compiler &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Compiler works best when the auto-memoization applied is strictly for performance. Future versions of the compiler may change how memoization is applied, for example it could become more granular and precise.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;However, because product code may sometimes break the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rules&quot;&gt;rules of React&lt;/a&gt; in ways that aren’t always statically detectable in JavaScript, changing memoization can occasionally have unexpected results. For example, a previously memoized value might be used as a dependency for a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffect&lt;/code&gt; somewhere in the component tree. Changing how or whether this value is memoized can cause over or under-firing of that &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffect&lt;/code&gt;. While we encourage &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/synchronizing-with-effects&quot;&gt;useEffect only for synchronization&lt;/a&gt;, your codebase may have &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffect&lt;/code&gt;s that cover other use cases, such as effects that needs to only run in response to specific values changing.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In other words, changing memoization may under rare circumstances cause unexpected behavior. For this reason, we recommend following the Rules of React and employing continuous end-to-end testing of your app so you can upgrade the compiler with confidence and identify any rules of React violations that might cause issues.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you don’t have good test coverage, we recommend pinning the compiler to an exact version (eg &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;1.0.0&lt;/code&gt;) rather than a SemVer range (eg &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;^1.0.0&lt;/code&gt;). You can do this by passing the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;--save-exact&lt;/code&gt; (npm/pnpm) or &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;--exact&lt;/code&gt; flags (yarn) when upgrading the compiler. You should then do any upgrades of the compiler manually, taking care to check that your app still works as expected.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks to &lt;a href=&quot;https://x.com/someextent&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jason Bonta&lt;/a&gt;, &lt;a href=&quot;https://x.com/feedthejim&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jimmy Lai&lt;/a&gt;, &lt;a href=&quot;https://x.com/kdy1dev&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Kang Dongyoon&lt;/a&gt; (@kdy1dev), and &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt; for reviewing and editing this post.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2025/10/16/react-conf-2025-recap&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Conf 2025 Recap&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2025/10/07/introducing-the-react-foundation&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;Introducing the React Foundation&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2025/10/07/react-compiler-1</link><guid isPermaLink="false">https://react.dev/blog/2025/10/07/react-compiler-1</guid><pubDate>Mon, 06 Oct 2025 16:00:00 GMT</pubDate></item><item><title>Introducing the React Foundation</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;October 7, 2025 by &lt;a href=&quot;https://x.com/sethwebster&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Seth Webster&lt;/a&gt;, &lt;a href=&quot;https://x.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt;, &lt;a href=&quot;https://x.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joe Savona&lt;/a&gt;, &lt;a href=&quot;https://x.com/sophiebits&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sophie Alpert&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div style=&quot;display:flex;justify-content:center;margin-bottom:1rem;margin-left:7rem;margin-right:7rem&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-foundation/react_foundation_logo.png&quot;&gt;&lt;img class=&quot;w-full light-image&quot; src=&quot;https://react.dev/images/blog/react-foundation/react_foundation_logo.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-foundation/react_foundation_logo_dark.png&quot;&gt;&lt;img class=&quot;w-full dark-image&quot; src=&quot;https://react.dev/images/blog/react-foundation/react_foundation_logo_dark.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;/div&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Today, we’re announcing our plans to create the React Foundation and a new technical governance structure.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We open sourced React over a decade ago to help developers build great user experiences. From its earliest days, React has received substantial contributions from contributors outside of Meta. Over time, the number of contributors and the scope of their contributions has grown significantly. What started out as a tool developed for Meta has expanded into a project that spans multiple companies with regular contributions from across the ecosystem. React has outgrown the confines of any one company.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To better serve the React community, we are announcing our plans to move React and React Native from Meta to a new React Foundation. As a part of this change, we will also be implementing a new independent technical governance structure. We believe these changes will enable us to give React ecosystem projects more resources.&lt;/p&gt;
&lt;h2 id=&quot;the-react-foundation&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;The React Foundation &lt;a href=&quot;https://react.dev/blog/2025/10/07/introducing-the-react-foundation#the-react-foundation&quot; aria-label=&quot;Link for The React Foundation &quot; title=&quot;Link for The React Foundation &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We will make the React Foundation the new home for React, React Native, and some supporting projects like JSX. The React Foundation’s mission will be to support the React community and ecosystem. Once implemented, the React Foundation will&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Maintain React’s infrastructure like GitHub, CI, and trademarks&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Organize React Conf&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Create initiatives to support the React ecosystem like financial support of ecosystem projects, issuing grants, and creating programs&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The React Foundation will be governed by a board of directors, with Seth Webster serving as the executive director. This board will direct funds and resources to support React’s development, community, and ecosystem. We believe that this is the best structure to ensure that the React Foundation is vendor-neutral and reflects the best interests of the community.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The founding corporate members of the React Foundation will be Amazon, Callstack, Expo, Meta, Microsoft, Software Mansion, and Vercel. These companies have had a major impact on the React and React Native ecosystems and we are grateful for their support. We are excited to welcome even more members in the future.&lt;/p&gt;
&lt;div style=&quot;display:flex;justify-content:center;margin:2rem&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-foundation/react_foundation_member_logos.png&quot;&gt;&lt;img class=&quot;w-full light-image&quot; src=&quot;https://react.dev/images/blog/react-foundation/react_foundation_member_logos.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-foundation/react_foundation_member_logos_dark.png&quot;&gt;&lt;img class=&quot;w-full dark-image&quot; src=&quot;https://react.dev/images/blog/react-foundation/react_foundation_member_logos_dark.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;/div&gt;
&lt;h2 id=&quot;reacts-technical-governance&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React’s technical governance &lt;a href=&quot;https://react.dev/blog/2025/10/07/introducing-the-react-foundation#reacts-technical-governance&quot; aria-label=&quot;Link for React’s technical governance &quot; title=&quot;Link for React’s technical governance &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We believe that React’s technical direction should be set by the people who contribute to and maintain React. As React moves to a foundation, it is important that no single company or organization is overrepresented. To achieve this, we plan to define a new technical governance structure for React that is independent from the React Foundation.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As a part of creating React’s new technical governance structure we will reach out to the community for feedback. Once finalized, we will share details in a future post.&lt;/p&gt;
&lt;h2 id=&quot;thank-you&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Thank you &lt;a href=&quot;https://react.dev/blog/2025/10/07/introducing-the-react-foundation#thank-you&quot; aria-label=&quot;Link for Thank you &quot; title=&quot;Link for Thank you &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React’s incredible growth is thanks to the thousands of people, companies, and projects that have shaped React. The creation of the React Foundation is a testament to the strength and vibrancy of the React community. Together, the React Foundation and React’s new technical governance will ensure that React’s future is secure for years to come.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Compiler v1.0&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React 19.2&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2025/10/07/introducing-the-react-foundation</link><guid isPermaLink="false">https://react.dev/blog/2025/10/07/introducing-the-react-foundation</guid><pubDate>Mon, 06 Oct 2025 16:00:00 GMT</pubDate></item><item><title>React 19.2</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;October 1, 2025 by &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/team&quot;&gt;The React Team&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 19.2 is now available on npm!&lt;/p&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This is our third release in the last year, following React 19 in December and React 19.1 in June. In this post, we’ll give an overview of the new features in React 19.2, and highlight some notable changes.&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#new-react-features&quot;&gt;New React Features &lt;/a&gt;&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#activity&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity /&amp;gt;&lt;/code&gt; &lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#use-effect-event&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffectEvent&lt;/code&gt; &lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#cache-signal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;cacheSignal&lt;/code&gt; &lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#performance-tracks&quot;&gt;Performance Tracks &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#new-react-dom-features&quot;&gt;New React DOM Features &lt;/a&gt;&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#partial-pre-rendering&quot;&gt;Partial Pre-rendering &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#notable-changes&quot;&gt;Notable Changes &lt;/a&gt;&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#batching-suspense-boundaries-for-ssr&quot;&gt;Batching Suspense Boundaries for SSR &lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#ssr-web-streams-support-for-node&quot;&gt;SSR: Web Streams support for Node &lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#eslint-plugin-react-hooks&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;eslint-plugin-react-hooks&lt;/code&gt; v6 &lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#update-the-default-useid-prefix&quot;&gt;Update the default &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useId&lt;/code&gt; prefix &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2#changelog&quot;&gt;Changelog &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;new-react-features&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New React Features &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#new-react-features&quot; aria-label=&quot;Link for New React Features &quot; title=&quot;Link for New React Features &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;activity&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity /&amp;gt;&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#activity&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; lets you break your app into “activities” that can be controlled and prioritized.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can use Activity as an alternative to conditionally rendering parts of your app:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isVisible&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Page&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;mode&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isVisible&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;visible&#39;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;hidden&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Page&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19.2, Activity supports two modes: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;visible&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hidden&lt;/code&gt;.&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hidden&lt;/code&gt;: hides the children, unmounts effects, and defers all updates until React has nothing left to work on.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;visible&lt;/code&gt;: shows the children, mounts effects, and allows updates to be processed normally.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This means you can pre-render and keep rendering hidden parts of the app without impacting the performance of anything visible on screen.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can use Activity to render hidden parts of the app that a user is likely to navigate to next, or to save the state of parts the user navigates away from. This helps make navigations quicker by loading data, css, and images in the background, and allows back navigations to maintain state such as input fields.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the future, we plan to add more modes to Activity for different use cases.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For examples on how to use Activity, check out the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/Activity&quot;&gt;Activity docs&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h3 id=&quot;use-effect-event&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffectEvent&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#use-effect-event&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;One common pattern with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffect&lt;/code&gt; is to notify the app code about some kind of “events” from an external system. For example, when a chat room gets connected, you might want to display a notification:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;ChatRoom&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;roomId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;theme&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createConnection&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;serverUrl&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;roomId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;connected&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-definition&quot;&gt;showNotification&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;Connected!&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;disconnect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;roomId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The problem with the code above is that a change to any values used inside such an “event” will cause the surrounding Effect to re-run. For example, changing the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;theme&lt;/code&gt; will cause the chat room to reconnect. This makes sense for values related to the Effect logic itself, like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;roomId&lt;/code&gt;, but it doesn’t make sense for &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;theme&lt;/code&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To solve this, most users just disable the lint rule and exclude the dependency. But that can lead to bugs since the linter can no longer help you keep the dependencies up to date if you need to update the Effect later.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;With &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffectEvent&lt;/code&gt;, you can split the “event” part of this logic out of the Effect that emits it:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;ChatRoom&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;roomId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;theme&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;onConnected&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useEffectEvent&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;showNotification&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;Connected!&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createConnection&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;serverUrl&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;roomId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;connected&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-definition&quot;&gt;onConnected&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;disconnect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;roomId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-comment&quot;&gt;// ✅ All dependencies declared (Effect Events aren&#39;t dependencies)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Similar to DOM events, Effect Events always “see” the latest props and state.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Effect Events should &lt;em&gt;not&lt;/em&gt; be declared in the dependency array&lt;/strong&gt;. You’ll need to upgrade to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;eslint-plugin-react-hooks@latest&lt;/code&gt; so that the linter doesn’t try to insert them as dependencies. Note that Effect Events can only be declared in the same component or Hook as “their” Effect. These restrictions are verified by the linter.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;when-to-use-useeffectevent&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;When to use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffectEvent&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#when-to-use-useeffectevent&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You should use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffectEvent&lt;/code&gt; for functions that are conceptually “events” that happen to be fired from an Effect instead of a user event (that’s what makes it an “Effect Event”). You don’t need to wrap everything in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffectEvent&lt;/code&gt;, or to use it just to silence the lint error, as this can lead to bugs.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For a deep dive on how to think about Event Effects, see: &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/separating-events-from-effects#extracting-non-reactive-logic-out-of-effects&quot;&gt;Separating Events from Effects&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h3 id=&quot;cache-signal&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;cacheSignal&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#cache-signal&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-blue-10 dark:bg-blue-60 dark:bg-opacity-20&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-blue-50 dark:text-blue-40&quot;&gt;React Server Components&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;cacheSignal&lt;/code&gt; is only for use with &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rsc/server-components&quot;&gt;React Server Components&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;cacheSignal&lt;/code&gt; allows you to know when the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/cache&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;cache()&lt;/code&gt;&lt;/a&gt; lifetime is over:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;cacheSignal&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;dedupedFetch&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;dedupedFetch&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;signal&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;cacheSignal&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This allows you to clean up or abort work when the result will no longer be used in the cache, such as:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;React has successfully completed rendering&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;The render was aborted&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;The render has failed&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more info, see the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/cacheSignal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;cacheSignal&lt;/code&gt; docs&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h3 id=&quot;performance-tracks&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Performance Tracks &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#performance-tracks&quot; aria-label=&quot;Link for Performance Tracks &quot; title=&quot;Link for Performance Tracks &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 19.2 adds a new set of &lt;a href=&quot;https://developer.chrome.com/docs/devtools/performance/extension&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;custom tracks&lt;/a&gt; to Chrome DevTools performance profiles to provide more information about the performance of your React app:&lt;/p&gt;
&lt;div style=&quot;display:flex;justify-content:center;margin-bottom:1rem&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-labs-april-2025/perf_tracks.png&quot;&gt;&lt;img class=&quot;w-full light-image&quot; src=&quot;https://react.dev/images/blog/react-labs-april-2025/perf_tracks.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-labs-april-2025/perf_tracks_dark.png&quot;&gt;&lt;img class=&quot;w-full dark-image&quot; src=&quot;https://react.dev/images/blog/react-labs-april-2025/perf_tracks_dark.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/dev-tools/react-performance-tracks&quot;&gt;React Performance Tracks docs&lt;/a&gt; explain everything included in the tracks, but here is a high-level overview.&lt;/p&gt;
&lt;h4 id=&quot;scheduler-&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Scheduler ⚛ &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#scheduler-&quot; aria-label=&quot;Link for Scheduler ⚛ &quot; title=&quot;Link for Scheduler ⚛ &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The Scheduler track shows what React is working on for different priorities such as “blocking” for user interactions, or “transition” for updates inside startTransition. Inside each track, you will see the type of work being performed such as the event that scheduled an update, and when the render for that update happened.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We also show information such as when an update is blocked waiting for a different priority, or when React is waiting for paint before continuing. The Scheduler track helps you understand how React splits your code into different priorities, and the order it completed the work.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/dev-tools/react-performance-tracks#scheduler&quot;&gt;Scheduler track&lt;/a&gt; docs to see everything included.&lt;/p&gt;
&lt;h4 id=&quot;components-&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Components ⚛ &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#components-&quot; aria-label=&quot;Link for Components ⚛ &quot; title=&quot;Link for Components ⚛ &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The Components track shows the tree of components that React is working on either to render or run effects. Inside you’ll see labels such as “Mount” for when children mount or effects are mounted, or “Blocked” for when rendering is blocked due to yielding to work outside React.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The Components track helps you understand when components are rendered or run effects, and the time it takes to complete that work to help identify performance problems.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/dev-tools/react-performance-tracks#components&quot;&gt;Components track docs&lt;/a&gt; for see everything included.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;new-react-dom-features&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New React DOM Features &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#new-react-dom-features&quot; aria-label=&quot;Link for New React DOM Features &quot; title=&quot;Link for New React DOM Features &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;partial-pre-rendering&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Partial Pre-rendering &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#partial-pre-rendering&quot; aria-label=&quot;Link for Partial Pre-rendering &quot; title=&quot;Link for Partial Pre-rendering &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In 19.2 we’re adding a new capability to pre-render part of the app ahead of time, and resume rendering it later.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This feature is called “Partial Pre-rendering”, and allows you to pre-render the static parts of your app and serve it from a CDN, and then resume rendering the shell to fill it in with dynamic content later.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To pre-render an app to resume later, first call &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;prerender&lt;/code&gt; with an &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;AbortController&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;prelude&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;postponed&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;prerender&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;signal&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;controller&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;signal&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Save the postponed state for later&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;savePostponedState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;postponed&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Send prelude to client or CDN.&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Then, you can return the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;prelude&lt;/code&gt; shell to the client, and later call &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resume&lt;/code&gt; to “resume” to a SSR stream:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;postponed&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;getPostponedState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;resumeStream&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;resume&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;postponed&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Send stream to client.&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Or you can call &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resumeAndPrerender&lt;/code&gt; to resume to get static HTML for SSG:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;postponedState&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;getPostponedState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;prelude&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;resumeAndPrerender&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;postponedState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Send complete HTML prelude to CDN.&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more info, see the docs for the new APIs:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom/server&lt;/code&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/server/resume&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resume&lt;/code&gt;&lt;/a&gt;: for Web Streams.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/server/resumeToPipeableStream&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resumeToPipeableStream&lt;/code&gt;&lt;/a&gt; for Node Streams.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom/static&lt;/code&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/static/resumeAndPrerender&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resumeAndPrerender&lt;/code&gt;&lt;/a&gt; for Web Streams.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/static/resumeAndPrerenderToNodeStream&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resumeAndPrerenderToNodeStream&lt;/code&gt;&lt;/a&gt; for Node Streams.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Additionally, the prerender apis now return a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;postpone&lt;/code&gt; state to pass to the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resume&lt;/code&gt; apis.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;notable-changes&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Notable Changes &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#notable-changes&quot; aria-label=&quot;Link for Notable Changes &quot; title=&quot;Link for Notable Changes &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;batching-suspense-boundaries-for-ssr&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Batching Suspense Boundaries for SSR &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#batching-suspense-boundaries-for-ssr&quot; aria-label=&quot;Link for Batching Suspense Boundaries for SSR &quot; title=&quot;Link for Batching Suspense Boundaries for SSR &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We fixed a behavioral bug where Suspense boundaries would reveal differently depending on if they were rendered on the client or when streaming from server-side rendering.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Starting in 19.2, React will batch reveals of server-rendered Suspense boundaries for a short time, to allow more content to be revealed together and align with the client-rendered behavior.&lt;/p&gt;
&lt;figure class=&quot;flex flex-col px-0 p-0 sm:p-10 first:mt-0 mt-10 sm:mt-0 justify-center items-center&quot;&gt;&lt;div class=&quot;dark-image&quot;&gt;&lt;img alt=&quot;Diagram with three sections, with an arrow transitioning each section in between. The first section contains a page rectangle showing a glimmer loading state with faded bars. The second panel shows the top half of the page revealed and highlighted in blue. The third panel shows the entire the page revealed and highlighted in blue.&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;162&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_before.dark.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_before.dark.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://react.dev/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_before.dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/div&gt;&lt;div class=&quot;light-image&quot;&gt;&lt;img alt=&quot;Diagram with three sections, with an arrow transitioning each section in between. The first section contains a page rectangle showing a glimmer loading state with faded bars. The second panel shows the top half of the page revealed and highlighted in blue. The third panel shows the entire the page revealed and highlighted in blue.&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;162&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_before.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_before.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://react.dev/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_before.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/div&gt;&lt;div class=&quot;w-full flex justify-center&quot;&gt;&lt;figcaption class=&quot;p-1 sm:p-2 mt-0 sm:mt-0 text-gray-40 text-base lg:text-lg text-center leading-tight table-caption max-w-lg&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Previously, during streaming server-side rendering, suspense content would immediately replace fallbacks.&lt;/p&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;figure class=&quot;flex flex-col px-0 p-0 sm:p-10 first:mt-0 mt-10 sm:mt-0 justify-center items-center&quot;&gt;&lt;div class=&quot;dark-image&quot;&gt;&lt;img alt=&quot;Diagram with three sections, with an arrow transitioning each section in between. The first section contains a page rectangle showing a glimmer loading state with faded bars. The second panel shows the same page. The third panel shows the entire the page revealed and highlighted in blue.&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;162&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_after.dark.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_after.dark.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://react.dev/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_after.dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/div&gt;&lt;div class=&quot;light-image&quot;&gt;&lt;img alt=&quot;Diagram with three sections, with an arrow transitioning each section in between. The first section contains a page rectangle showing a glimmer loading state with faded bars. The second panel shows the same page. The third panel shows the entire the page revealed and highlighted in blue.&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;162&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_after.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_after.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://react.dev/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2F19_2_batching_after.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/div&gt;&lt;div class=&quot;w-full flex justify-center&quot;&gt;&lt;figcaption class=&quot;p-1 sm:p-2 mt-0 sm:mt-0 text-gray-40 text-base lg:text-lg text-center leading-tight table-caption max-w-lg&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19.2, suspense boundaries are batched for a small amount of time, to allow revealing more content together.&lt;/p&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This fix also prepares apps for supporting &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; for Suspense during SSR. By revealing more content together, animations can run in larger batches of content, and avoid chaining animations of content that stream in close together.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React uses heuristics to ensure throttling does not impact core web vitals and search ranking.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For example, if the total page load time is approaching 2.5s (which is the time considered “good” for &lt;a href=&quot;https://web.dev/articles/lcp&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;LCP&lt;/a&gt;), React will stop batching and reveal content immediately so that the throttling is not the reason to miss the metric.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h3 id=&quot;ssr-web-streams-support-for-node&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;SSR: Web Streams support for Node &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#ssr-web-streams-support-for-node&quot; aria-label=&quot;Link for SSR: Web Streams support for Node &quot; title=&quot;Link for SSR: Web Streams support for Node &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 19.2 adds support for Web Streams for streaming SSR in Node.js:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/server/renderToReadableStream&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToReadableStream&lt;/code&gt;&lt;/a&gt; is now available for Node.js&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/static/prerender&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;prerender&lt;/code&gt;&lt;/a&gt; is now available for Node.js&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As well as the new &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resume&lt;/code&gt; APIs:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/server/resume&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resume&lt;/code&gt;&lt;/a&gt; is available for Node.js.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/static/resumeAndPrerender&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resumeAndPrerender&lt;/code&gt;&lt;/a&gt; is available for Node.js.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-yellow-5 dark:bg-yellow-60 dark:bg-opacity-20&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-yellow-50 dark:text-yellow-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-yellow-50 dark:text-yellow-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_738_836)&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M27 48L27 57.3409L40.0772 48L55.6975 48C57.1595 48 58.1986 47.0112 58.3851 45.8604C59.1824 40.9398 60 34.619 60 29.625C60 24.7282 59.2125 18.7546 58.4302 14.0813C58.2445 12.9721 57.2326 12 55.7805 12L16.2195 12C14.7674 12 13.7555 12.9721 13.5698 14.0813C12.7875 18.7546 12 24.7282 12 29.625C12 34.619 12.8176 40.9398 13.6149 45.8604C13.8014 47.0112 14.8404 48 16.3025 48H27ZM42 54H55.6975C59.9534 54 63.6271 51.0213 64.3078 46.8201C65.1161 41.8322 66 35.1209 66 29.625C66 24.2196 65.1449 17.8522 64.3478 13.0906C63.6513 8.93026 59.9987 6 55.7805 6H16.2195C12.0013 6 8.34867 8.93026 7.65218 13.0906C6.85505 17.8522 6 24.2196 6 29.625C6 35.1209 6.88391 41.8322 7.69215 46.8201C8.37291 51.0213 12.0466 54 16.3025 54H21L21 63.1704C21 65.6106 23.7581 67.0299 25.7437 65.6116L42 54ZM39 39.3686C39 40.9422 38 41.9912 36 41.9912C34 41.9912 33 40.9422 33 39.3686C33 37.7951 34 36.746 36 36.746C38 36.746 39 37.7951 39 39.3686ZM38.1771 20.2412C38.1771 18.9986 37.1697 17.9912 35.9271 17.9912C34.6845 17.9912 33.6771 18.9986 33.6771 20.2412V31.5956C33.6771 32.8382 34.6845 33.8456 35.9271 33.8456C37.1697 33.8456 38.1771 32.8382 38.1771 31.5956V20.2412Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_738_836&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Pitfall&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;prefer-node-streams-for-server-side-rendering-in-nodejs&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Prefer Node Streams for server-side rendering in Node.js &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#prefer-node-streams-for-server-side-rendering-in-nodejs&quot; aria-label=&quot;Link for Prefer Node Streams for server-side rendering in Node.js &quot; title=&quot;Link for Prefer Node Streams for server-side rendering in Node.js &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In Node.js environments, we still highly recommend using the Node Streams APIs:&lt;/p&gt;&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/server/renderToPipeableStream&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToPipeableStream&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/server/resumeToPipeableStream&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resumeToPipeableStream&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/static/prerenderToNodeStream&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;prerenderToNodeStream&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/static/resumeAndPrerenderToNodeStream&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;resumeAndPrerenderToNodeStream&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This is because Node Streams are much faster than Web Streams in Node, and Web Streams do not support compression by default, leading to users accidentally missing the benefits of streaming.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h3 id=&quot;eslint-plugin-react-hooks&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;eslint-plugin-react-hooks&lt;/code&gt; v6 &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#eslint-plugin-react-hooks&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We also published &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;eslint-plugin-react-hooks@latest&lt;/code&gt; with flat config by default in the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;recommended&lt;/code&gt; preset, and opt-in for new React Compiler powered rules.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To continue using the legacy config, you can change to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;recommended-legacy&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-keyword&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;plugin:react-hooks/recommended&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;+ &lt;span class=&quot;sp-syntax-keyword&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;plugin:react-hooks/recommended-legacy&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For a full list of compiler enabled rules, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/eslint-plugin-react-hooks#recommended&quot;&gt;check out the linter docs&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Check out the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;eslint-plugin-react-hooks&lt;/code&gt; &lt;a href=&quot;https://github.com/react/react/blob/main/packages/eslint-plugin-react-hooks/CHANGELOG.md#610&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;changelog for a full list of changes&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h3 id=&quot;update-the-default-useid-prefix&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Update the default &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useId&lt;/code&gt; prefix &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#update-the-default-useid-prefix&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In 19.2, we’re updating the default &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useId&lt;/code&gt; prefix from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;:r:&lt;/code&gt; (19.0.0) or &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;«r»&lt;/code&gt; (19.1.0) to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;_r_&lt;/code&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The original intent of using a special character that was not valid for CSS selectors was that it would be unlikely to collide with IDs written by users. However, to support View Transitions, we need to ensure that IDs generated by &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useId&lt;/code&gt; are valid for &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;view-transition-name&lt;/code&gt; and XML 1.0 names.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;changelog&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Changelog &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2#changelog&quot; aria-label=&quot;Link for Changelog &quot; title=&quot;Link for Changelog &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Other notable changes&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;: Allow nonce to be used on hoistable styles &lt;a href=&quot;https://github.com/react/react/pull/32461&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32461&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;: Warn for using a React owned node as a Container if it also has text content &lt;a href=&quot;https://github.com/react/react/pull/32774&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32774&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Notable bug fixes&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt;: Stringify context as “SomeContext” instead of “SomeContext.Provider” &lt;a href=&quot;https://github.com/react/react/pull/33507&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#33507&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt;: Fix infinite useDeferredValue loop in popstate event &lt;a href=&quot;https://github.com/react/react/pull/32821&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32821&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt;: Fix a bug when an initial value was passed to useDeferredValue &lt;a href=&quot;https://github.com/react/react/pull/34376&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#34376&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt;: Fix a crash when submitting forms with Client Actions &lt;a href=&quot;https://github.com/react/react/pull/33055&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#33055&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt;: Hide/unhide the content of dehydrated suspense boundaries if they resuspend &lt;a href=&quot;https://github.com/react/react/pull/32900&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32900&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt;: Avoid stack overflow on wide trees during Hot Reload &lt;a href=&quot;https://github.com/react/react/pull/34145&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#34145&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt;: Improve component stacks in various places &lt;a href=&quot;https://github.com/react/react/pull/33629&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#33629&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/33724&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#33724&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/32735&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32735&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/33723&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#33723&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt;: Fix a bug with React.use inside React.lazy-ed Component &lt;a href=&quot;https://github.com/react/react/pull/33941&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#33941&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;: Stop warning when ARIA 1.3 attributes are used &lt;a href=&quot;https://github.com/react/react/pull/34264&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#34264&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;: Fix a bug with deeply nested Suspense inside Suspense fallbacks &lt;a href=&quot;https://github.com/react/react/pull/33467&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#33467&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;: Avoid hanging when suspending after aborting while rendering &lt;a href=&quot;https://github.com/react/react/pull/34192&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#34192&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For a full list of changes, please see the &lt;a href=&quot;https://github.com/react/react/blob/main/CHANGELOG.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;Thanks to &lt;a href=&quot;https://bsky.app/profile/ricky.fm&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ricky Hanlon&lt;/a&gt; for &lt;a href=&quot;https://www.youtube.com/shorts/T9X3YkgZRG0&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;writing this post&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt;, &lt;a href=&quot;https://jackpope.me/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jack Pope&lt;/a&gt;, and &lt;a href=&quot;https://x.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joe Savona&lt;/a&gt; for reviewing this post.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2025/10/07/introducing-the-react-foundation&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;Introducing the React Foundation&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Labs: View Transitions, Activity, and more&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2025/10/01/react-19-2</link><guid isPermaLink="false">https://react.dev/blog/2025/10/01/react-19-2</guid><pubDate>Tue, 30 Sep 2025 16:00:00 GMT</pubDate></item><item><title>React Labs: View Transitions, Activity, and more</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;April 23, 2025 by &lt;a href=&quot;https://twitter.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ricky Hanlon&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React Labs posts, we write about projects in active research and development. In this post, we’re sharing two new experimental features that are ready to try today, and updates on other areas we’re working on now.&lt;/p&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Today, we’re excited to release documentation for two new experimental features that are ready for testing:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#view-transitions&quot;&gt;View Transitions&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#activity&quot;&gt;Activity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re also sharing updates on new features currently in development:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#react-performance-tracks&quot;&gt;React Performance Tracks&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#compiler-ide-extension&quot;&gt;Compiler IDE Extension&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#automatic-effect-dependencies&quot;&gt;Automatic Effect Dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#fragment-refs&quot;&gt;Fragment Refs&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#concurrent-stores&quot;&gt;Concurrent Stores&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h1 id=&quot;new-experimental-features&quot; class=&quot;mdx-heading text-5xl font-display font-bold leading-tight&quot;&gt;New Experimental Features &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#new-experimental-features&quot; aria-label=&quot;Link for New Experimental Features &quot; title=&quot;Link for New Experimental Features &quot; class=&quot;mdx-header-anchor hidden&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity /&amp;gt;&lt;/code&gt; has shipped in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react@19.2&lt;/code&gt;.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition /&amp;gt;&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;addTransitionType&lt;/code&gt; are now available in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react@canary&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;View Transitions and Activity are now ready for testing in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react@experimental&lt;/code&gt;. These features have been tested in production and are stable, but the final API may still change as we incorporate feedback.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can try them by upgrading React packages to the most recent experimental version:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react@experimental&lt;/code&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom@experimental&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Read on to learn how to use these features in your app, or check out the newly published docs:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/ViewTransition&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt;&lt;/a&gt;: A component that lets you activate an animation for a Transition.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/addTransitionType&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;addTransitionType&lt;/code&gt;&lt;/a&gt;: A function that allows you to specify the cause of a Transition.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/Activity&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt;&lt;/a&gt;: A component that lets you hide and show parts of the UI.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;view-transitions&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;View Transitions &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#view-transitions&quot; aria-label=&quot;Link for View Transitions &quot; title=&quot;Link for View Transitions &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React View Transitions are a new experimental feature that makes it easier to add animations to UI transitions in your app. Under-the-hood, these animations use the new &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startViewTransition&lt;/code&gt;&lt;/a&gt; API available in most modern browsers.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To opt-in to animating an element, wrap it in the new &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; component:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// &quot;what&quot; to animate.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;animate me&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This new component lets you declaratively define “what” to animate when an animation is activated.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can define “when” to animate by using one of these three triggers for a View Transition:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// &quot;when&quot; to animate.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Transitions&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;startTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Deferred Values&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;deferred&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useDeferredValue&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Suspense&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;fallback&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Fallback&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Loading...&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;By default, these animations use the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API/Using#customizing_your_animations&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;default CSS animations for View Transitions&lt;/a&gt; applied (typically a smooth cross-fade). You can use &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API/Using#the_view_transition_pseudo-element_tree&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;view transition pseudo-selectors&lt;/a&gt; to define “how” the animation runs. For example, you can use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;*&lt;/code&gt; to change the default animation for all transitions:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// &quot;how&quot; to animate.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;view&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;transition&lt;/span&gt;-&lt;span class=&quot;sp-syntax-definition&quot;&gt;old&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;*&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ms &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ease&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;out &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;fade&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;view&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;transition&lt;/span&gt;-&lt;span class=&quot;sp-syntax-keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;*&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ms &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ease&lt;/span&gt;-&lt;span class=&quot;sp-syntax-keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;fade&lt;/span&gt;-&lt;span class=&quot;sp-syntax-keyword&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When the DOM updates due to an animation trigger—like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startTransition&lt;/code&gt;, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useDeferredValue&lt;/code&gt;, or a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;Suspense&lt;/code&gt; fallback switching to content—React will use &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/ViewTransition#viewtransition&quot;&gt;declarative heuristics&lt;/a&gt; to automatically determine which &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; components to activate for the animation. The browser will then run the animation that’s defined in CSS.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you’re familiar with the browser’s View Transition API and want to know how React supports it, check out &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/ViewTransition#how-does-viewtransition-work&quot;&gt;How does &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; Work&lt;/a&gt; in the docs.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In this post, let’s take a look at a few examples of how to use View Transitions.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ll start with this app, which doesn’t animate any of the following interactions:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Click a video to view the details.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Click “back” to go back to the feed.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Type in the list to filter the videos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/App.js&quot; type=&quot;button&quot;&gt;App.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/Details.js&quot; type=&quot;button&quot;&gt;Details.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/Home.js&quot; type=&quot;button&quot;&gt;Home.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/Icons.js&quot; type=&quot;button&quot;&gt;Icons.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/Layout.js&quot; type=&quot;button&quot;&gt;Layout.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/LikeButton.js&quot; type=&quot;button&quot;&gt;LikeButton.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/Videos.js&quot; type=&quot;button&quot;&gt;Videos.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/router.js&quot; type=&quot;button&quot;&gt;router.js&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:Rj52cq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;App.js&lt;span class=&quot;ms-2&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; rounded-b-lg overflow-hidden sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for App.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;TalkDetails&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Details&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Home&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./router&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// 🚩This version doesn&#39;t include any animations yet&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;TalkDetails&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;view-transitions-do-not-replace-css-and-js-driven-animations&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;View Transitions do not replace CSS and JS driven animations &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#view-transitions-do-not-replace-css-and-js-driven-animations&quot; aria-label=&quot;Link for View Transitions do not replace CSS and JS driven animations &quot; title=&quot;Link for View Transitions do not replace CSS and JS driven animations &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;View Transitions are meant to be used for UI transitions such as navigation, expanding, opening, or re-ordering. They are not meant to replace all the animations in your app.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In our example app above, notice that there are already animations when you click the “like” button and in the Suspense fallback glimmer. These are good use cases for CSS animations because they are animating a specific element.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;animating-navigations&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Animating navigations &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#animating-navigations&quot; aria-label=&quot;Link for Animating navigations &quot; title=&quot;Link for Animating navigations &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Our app includes a Suspense-enabled router, with &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useTransition#building-a-suspense-enabled-router&quot;&gt;page transitions already marked as Transitions&lt;/a&gt;, which means navigations are performed with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startTransition&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;navigate&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;startTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startTransition&lt;/code&gt; is a View Transition trigger, so we can add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; to animate between pages:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// &quot;what&quot; to animate&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;key&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;TalkDetails&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;url&lt;/code&gt; changes, the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; and new route are rendered. Since the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; was updated inside of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startTransition&lt;/code&gt;, the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; is activated for an animation.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;By default, View Transitions include the browser default cross-fade animation. Adding this to our example, we now have a cross-fade whenever we navigate between pages:&lt;/p&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/App.js&quot; type=&quot;button&quot;&gt;App.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/Layout.js&quot; type=&quot;button&quot;&gt;Layout.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/router.js&quot; type=&quot;button&quot;&gt;router.js&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:Rj54cq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;App.js&lt;span class=&quot;ms-2&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; rounded-b-lg overflow-hidden sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for App.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Details&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Home&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./router&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Use ViewTransition to animate between pages.&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// No additional CSS needed by default.&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Since our router already updates the route using &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startTransition&lt;/code&gt;, this one line change to add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; activates with the default cross-fade animation.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you’re curious how this works, see the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/ViewTransition#how-does-viewtransition-work&quot;&gt;How does &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; work?&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;opting-out-of-viewtransition-animations&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Opting out of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; animations &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#opting-out-of-viewtransition-animations&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In this example, we’re wrapping the root of the app in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; for simplicity, but this means that all transitions in the app will be animated, which can lead to unexpected animations.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To fix, we’re wrapping route children with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;none&quot;&lt;/code&gt; so each page can control its own animation:&lt;/p&gt;&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Layout.js&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;default&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;none&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In practice, navigations should be done via “enter” and “exit” props, or by using Transition Types.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;customizing-animations&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Customizing animations &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#customizing-animations&quot; aria-label=&quot;Link for Customizing animations &quot; title=&quot;Link for Customizing animations &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;By default, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; includes the default cross-fade from the browser.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To customize animations, you can provide props to the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; component to specify which animations to use, based on &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/ViewTransition#props&quot;&gt;how the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; activates&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For example, we can slow down the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;default&lt;/code&gt; cross fade animation:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;default&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;slow-fade&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;And define &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;slow-fade&lt;/code&gt; in CSS using &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/ViewTransition#view-transition-class&quot;&gt;view transition classes&lt;/a&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;::view-transition-old&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;.slow-fade&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-property&quot;&gt;animation-duration&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;ms&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;::view-transition-new&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;.slow-fade&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-property&quot;&gt;animation-duration&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;ms&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Now, the cross fade is slower:&lt;/p&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/App.js&quot; type=&quot;button&quot;&gt;App.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/animations.css&quot; type=&quot;button&quot;&gt;animations.css&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:Rj56cq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;App.js&lt;span class=&quot;ms-2&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for App.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Details&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Home&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useRouter&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./router&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Define a default animation of .slow-fade.&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// See animations.css for the animation definition.&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;default&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;slow-fade&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button translate=&quot;yes&quot; class=&quot;sandpack-expand flex text-base justify-between dark:border-card-dark bg-wash dark:bg-card-dark items-center z-10 p-1 w-full order-2 xl:order-last border-b-1 relative top-0&quot;&gt;&lt;span class=&quot;flex p-2 focus:outline-none text-primary dark:text-primary-dark leading-[20px]&quot;&gt;&lt;svg class=&quot;rotate-0 inline me-1.5 text-xl&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;Show more&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/ViewTransition#styling-view-transitions&quot;&gt;Styling View Transitions&lt;/a&gt; for a full guide on styling &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;shared-element-transitions&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Shared Element Transitions &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#shared-element-transitions&quot; aria-label=&quot;Link for Shared Element Transitions &quot; title=&quot;Link for Shared Element Transitions &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When two pages include the same element, often you want to animate it from one page to the next.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To do this you can add a unique &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;name&lt;/code&gt; to the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;`video-&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Thumbnail&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;video&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Now the video thumbnail animates between the two pages:&lt;/p&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/App.js&quot; type=&quot;button&quot;&gt;App.js&lt;/button&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/Videos.js&quot; type=&quot;button&quot;&gt;Videos.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/animations.css&quot; type=&quot;button&quot;&gt;animations.css&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:Rj58cq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;Videos.js&lt;span class=&quot;ms-2&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for Videos.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;LikeButton&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./LikeButton&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useRouter&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./router&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;PauseIcon&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;PlayIcon&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Icons&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;startTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Thumbnail&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;children&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Add a name to animate with a shared element transition.&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// This uses the default animation, no additional css needed.&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;`video-&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-property&quot;&gt;aria-hidden&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;true&quot;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-property&quot;&gt;tabIndex&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;-&lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;`thumbnail &lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoControls&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isPlaying&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setIsPlaying&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;span&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;controls&quot;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-property&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-definition&quot;&gt;startTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-definition&quot;&gt;setIsPlaying&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; !&lt;span class=&quot;sp-syntax-plain&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isPlaying&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;PauseIcon&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;PlayIcon&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;video&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;navigate&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;video&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;link&quot;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-property&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-plain&quot;&gt;e&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-definition&quot;&gt;navigate&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;`/video/&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Thumbnail&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;video&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Thumbnail&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;

        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;info&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;video-title&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;video-description&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;LikeButton&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;video&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button translate=&quot;yes&quot; class=&quot;sandpack-expand flex text-base justify-between dark:border-card-dark bg-wash dark:bg-card-dark items-center z-10 p-1 w-full order-2 xl:order-last border-b-1 relative top-0&quot;&gt;&lt;span class=&quot;flex p-2 focus:outline-none text-primary dark:text-primary-dark leading-[20px]&quot;&gt;&lt;svg class=&quot;rotate-0 inline me-1.5 text-xl&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;Show more&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;By default, React automatically generates a unique &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;name&lt;/code&gt; for each element activated for a transition (see &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/ViewTransition#how-does-viewtransition-work&quot;&gt;How does &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; work&lt;/a&gt;). When React sees a transition where a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; with a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;name&lt;/code&gt; is removed and a new &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; with the same &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;name&lt;/code&gt; is added, it will activate a shared element transition.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more info, see the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/ViewTransition#animating-a-shared-element&quot;&gt;Animating a Shared Element&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;animating-based-on-cause&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Animating based on cause &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#animating-based-on-cause&quot; aria-label=&quot;Link for Animating based on cause &quot; title=&quot;Link for Animating based on cause &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Sometimes, you may want elements to animate differently based on how it was triggered. For this use case, we’ve added a new API called &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;addTransitionType&lt;/code&gt; to specify the cause of a transition:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;navigate&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;startTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Transition type for the cause &quot;nav forward&quot;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;addTransitionType&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;nav-forward&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;navigateBack&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;startTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Transition type for the cause &quot;nav backward&quot;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;addTransitionType&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;nav-back&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;With transition types, you can provide custom animations via props to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt;. Let’s add a shared element transition to the header for “6 Videos” and “Back”:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;nav&quot;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;share&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;nav-forward&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;slide-forward&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;nav-back&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;slide-back&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;heading&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Here we pass a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;share&lt;/code&gt; prop to define how to animate based on the transition type. When the share transition activates from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;nav-forward&lt;/code&gt;, the view transition class &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;slide-forward&lt;/code&gt; is applied. When it’s from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;nav-back&lt;/code&gt;, the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;slide-back&lt;/code&gt; animation is activated. Let’s define these animations in CSS:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;::view-transition-old&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;.slide-forward&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;/* when sliding forward, the &quot;old&quot; page should slide out to left. */&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; ...&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;::view-transition-new&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;.slide-forward&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;/* when sliding forward, the &quot;new&quot; page should slide in from right. */&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; ...&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;::view-transition-old&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;.slide-back&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;/* when sliding back, the &quot;old&quot; page should slide out to right. */&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; ...&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;::view-transition-new&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;.slide-back&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;/* when sliding back, the &quot;new&quot; page should slide in from left. */&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; ...&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Now we can animate the header along with thumbnail based on navigation type:&lt;/p&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/Layout.js&quot; type=&quot;button&quot;&gt;Layout.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/router.js&quot; type=&quot;button&quot;&gt;router.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/animations.css&quot; type=&quot;button&quot;&gt;animations.css&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:Rj5acq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;Layout.js&lt;span class=&quot;ms-2&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for Layout.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useIsNavPending&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./router&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Page&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;heading&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;children&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;isPending&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useIsNavPending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;page&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;top&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;top-nav&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;/* Custom classes based on transition type. */&lt;/span&gt;}
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;
            &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;nav&quot;&lt;/span&gt;
            &lt;span class=&quot;sp-syntax-property&quot;&gt;share&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;nav-forward&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;slide-forward&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;nav-back&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;slide-back&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;heading&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isPending&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;span&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;loader&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;/* Opt-out of ViewTransition for the content. */&lt;/span&gt;}
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;/* Content can define it&#39;s own ViewTransition. */&lt;/span&gt;}
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;default&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;none&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;bottom&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button translate=&quot;yes&quot; class=&quot;sandpack-expand flex text-base justify-between dark:border-card-dark bg-wash dark:bg-card-dark items-center z-10 p-1 w-full order-2 xl:order-last border-b-1 relative top-0&quot;&gt;&lt;span class=&quot;flex p-2 focus:outline-none text-primary dark:text-primary-dark leading-[20px]&quot;&gt;&lt;svg class=&quot;rotate-0 inline me-1.5 text-xl&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;Show more&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;h3 id=&quot;animating-suspense-boundaries&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Animating Suspense Boundaries &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#animating-suspense-boundaries&quot; aria-label=&quot;Link for Animating Suspense Boundaries &quot; title=&quot;Link for Animating Suspense Boundaries &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Suspense will also activate View Transitions.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To animate the fallback to content, we can wrap &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;Suspense&lt;/code&gt; with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTranstion&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;fallback&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfoFallback&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfo&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;By adding this, the fallback will cross-fade into the content. Click a video and see the video info animate in:&lt;/p&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/Details.js&quot; type=&quot;button&quot;&gt;Details.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/animations.css&quot; type=&quot;button&quot;&gt;animations.css&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:Rj5ccq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;Details.js&lt;span class=&quot;ms-2&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for Details.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Suspense&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;fetchVideo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;fetchVideoDetails&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./data&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Thumbnail&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;VideoControls&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Videos&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useRouter&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./router&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Layout&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Layout&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ChevronLeft&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Icons&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoDetails&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Cross-fade the fallback to content.&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;default&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;slow-fade&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;fallback&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfoFallback&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfo&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfoFallback&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;fit fallback title&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;fit fallback description&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Details&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;navigateBack&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;videoId&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;fetchVideo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;videoId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Layout&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-property&quot;&gt;heading&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;fit back&quot;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;sp-syntax-definition&quot;&gt;navigateBack&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ChevronLeft&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt; Back
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;details&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Thumbnail&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;video&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;large&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoControls&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Thumbnail&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoDetails&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Layout&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;details&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;fetchVideoDetails&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;fit info-title&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;details&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;fit info-description&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;details&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button translate=&quot;yes&quot; class=&quot;sandpack-expand flex text-base justify-between dark:border-card-dark bg-wash dark:bg-card-dark items-center z-10 p-1 w-full order-2 xl:order-last border-b-1 relative top-0&quot;&gt;&lt;span class=&quot;flex p-2 focus:outline-none text-primary dark:text-primary-dark leading-[20px]&quot;&gt;&lt;svg class=&quot;rotate-0 inline me-1.5 text-xl&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;Show more&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We can also provide custom animations using an &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;exit&lt;/code&gt; on the fallback, and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;enter&lt;/code&gt; on the content:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;fallback&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;exit&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;slide-down&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfoFallback&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;enter&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;slide-up&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfo&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Here’s how we’ll define &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;slide-down&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;slide-up&lt;/code&gt; with CSS:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;::view-transition-old&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;.slide-down&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;/* Slide the fallback down */&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; ...&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;::view-transition-new&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;.slide-up&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;/* Slide the content up */&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; ...&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Now, the Suspense content replaces the fallback with a sliding animation:&lt;/p&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/Details.js&quot; type=&quot;button&quot;&gt;Details.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/animations.css&quot; type=&quot;button&quot;&gt;animations.css&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:Rj5ecq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;Details.js&lt;span class=&quot;ms-2&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for Details.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Suspense&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;fetchVideo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;fetchVideoDetails&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./data&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Thumbnail&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;VideoControls&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Videos&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useRouter&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./router&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Layout&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Layout&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ChevronLeft&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Icons&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoDetails&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-property&quot;&gt;fallback&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Animate the fallback down.&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;exit&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;slide-down&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfoFallback&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;/* Animate the content up */&lt;/span&gt;}
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;enter&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;slide-up&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfo&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfoFallback&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;fallback title&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;fallback description&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Details&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;navigateBack&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;videoId&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;fetchVideo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;videoId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Layout&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-property&quot;&gt;heading&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;fit back&quot;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;sp-syntax-definition&quot;&gt;navigateBack&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ChevronLeft&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt; Back
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;details&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Thumbnail&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;video&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;large&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoControls&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Thumbnail&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoDetails&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Layout&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;VideoInfo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;details&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;fetchVideoDetails&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;info-title&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;details&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;info-description&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;details&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button translate=&quot;yes&quot; class=&quot;sandpack-expand flex text-base justify-between dark:border-card-dark bg-wash dark:bg-card-dark items-center z-10 p-1 w-full order-2 xl:order-last border-b-1 relative top-0&quot;&gt;&lt;span class=&quot;flex p-2 focus:outline-none text-primary dark:text-primary-dark leading-[20px]&quot;&gt;&lt;svg class=&quot;rotate-0 inline me-1.5 text-xl&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;Show more&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;h3 id=&quot;animating-lists&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Animating Lists &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#animating-lists&quot; aria-label=&quot;Link for Animating Lists &quot; title=&quot;Link for Animating Lists &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can also use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; to animate lists of items as they re-order, like in a searchable list of items:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;videos&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;filteredVideos&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;key&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Video&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;video&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To activate the ViewTransition, we can use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useDeferredValue&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;searchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setSearchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;deferredSearchText&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useDeferredValue&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;searchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;filteredVideos&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;filterVideos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;videos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;deferredSearchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Now the items animate as you type in the search bar:&lt;/p&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/Home.js&quot; type=&quot;button&quot;&gt;Home.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/animations.css&quot; type=&quot;button&quot;&gt;animations.css&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:Rj5gcq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;Home.js&lt;span class=&quot;ms-2&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for Home.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useDeferredValue&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Video&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Videos&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Layout&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Layout&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;fetchVideos&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./data&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;IconSearch&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Icons&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;SearchList&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;searchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;videos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Activate with useDeferredValue (&quot;when&quot;)&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;deferredSearchText&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useDeferredValue&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;searchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;filteredVideos&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;filterVideos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;videos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;deferredSearchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;video-list&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;videos&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;filteredVideos&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Animate each item in list (&quot;what&quot;)&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;key&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Video&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;video&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;filteredVideos&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;length&lt;/span&gt; === &lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;no-results&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;No results&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;videos&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;fetchVideos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;count&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;videos&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;searchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setSearchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Layout&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;heading&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;fit&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; Videos&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;SearchInput&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;searchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onChange&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;setSearchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;SearchList&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;videos&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;videos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;searchText&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;searchText&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Layout&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;SearchInput&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onChange&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;form&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;search&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onSubmit&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;e&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;htmlFor&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;sr-only&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        Search
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;search-input&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;search-icon&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;IconSearch&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;text&quot;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;placeholder&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;Search&quot;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;onChange&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;e&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;target&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;filterVideos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;videos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;keywords&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;query&lt;/span&gt;
    .&lt;span class=&quot;sp-syntax-property&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;
    .&lt;span class=&quot;sp-syntax-property&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;
    .&lt;span class=&quot;sp-syntax-property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;s&lt;/span&gt; !== &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;keywords&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;length&lt;/span&gt; === &lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;videos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;videos&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;words&lt;/span&gt; = &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;title&lt;/span&gt; + &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot; &quot;&lt;/span&gt; + &lt;span class=&quot;sp-syntax-plain&quot;&gt;video&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;
      .&lt;span class=&quot;sp-syntax-property&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;
      .&lt;span class=&quot;sp-syntax-property&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;keywords&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;every&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;kw&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;words&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;w&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;kw&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button translate=&quot;yes&quot; class=&quot;sandpack-expand flex text-base justify-between dark:border-card-dark bg-wash dark:bg-card-dark items-center z-10 p-1 w-full order-2 xl:order-last border-b-1 relative top-0&quot;&gt;&lt;span class=&quot;flex p-2 focus:outline-none text-primary dark:text-primary-dark leading-[20px]&quot;&gt;&lt;svg class=&quot;rotate-0 inline me-1.5 text-xl&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;Show more&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;h3 id=&quot;final-result&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Final result &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#final-result&quot; aria-label=&quot;Link for Final result &quot; title=&quot;Link for Final result &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;By adding a few &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; components and a few lines of CSS, we were able to add all the animations above into the final result.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re excited about View Transitions and think they will level up the apps you’re able to build. They’re ready to start trying today in the experimental channel of React releases.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Let’s remove the slow fade, and take a look at the final result:&lt;/p&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/App.js&quot; type=&quot;button&quot;&gt;App.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/Details.js&quot; type=&quot;button&quot;&gt;Details.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/Home.js&quot; type=&quot;button&quot;&gt;Home.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/Layout.js&quot; type=&quot;button&quot;&gt;Layout.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/Videos.js&quot; type=&quot;button&quot;&gt;Videos.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/router.js&quot; type=&quot;button&quot;&gt;router.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/animations.css&quot; type=&quot;button&quot;&gt;animations.css&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:Rj5icq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;App.js&lt;span class=&quot;ms-2&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; rounded-b-lg overflow-hidden sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for App.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Details&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Home&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./router&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Animate with a cross fade between pages.&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;key&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you’re curious to know more about how they work, check out &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/ViewTransition#how-does-viewtransition-work&quot;&gt;How Does &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; Work&lt;/a&gt; in the docs.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;For more background on how we built View Transitions, see: &lt;a href=&quot;https://github.com/react/react/pull/31975&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#31975&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/32105&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32105&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/32041&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32041&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/32734&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32734&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/32797&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32797&lt;/a&gt; &lt;a href=&quot;https://github.com/react/react/pull/31999&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#31999&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/32031&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32031&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/32050&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32050&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/32820&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32820&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/32029&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32029&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/32028&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32028&lt;/a&gt;, and &lt;a href=&quot;https://github.com/react/react/pull/32038&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#32038&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt; (thanks Seb!).&lt;/em&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;activity&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Activity &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#activity&quot; aria-label=&quot;Link for Activity &quot; title=&quot;Link for Activity &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity /&amp;gt;&lt;/code&gt; is now available in React’s Canary channel.&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/versioning-policy#all-release-channels&quot;&gt;Learn more about React’s release channels here.&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022#offscreen&quot;&gt;past&lt;/a&gt; &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024#offscreen-renamed-to-activity&quot;&gt;updates&lt;/a&gt;, we shared that we were researching an API to allow components to be visually hidden and deprioritized, preserving UI state with reduced performance costs relative to unmounting or hiding with CSS.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re now ready to share the API and how it works, so you can start testing it in experimental React versions.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; is a new component to hide and show parts of the UI:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;mode&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isVisible&lt;/span&gt; ? &lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;&#39;visible&#39;&lt;/span&gt; : &lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-yellow-40 border-yellow-40 text-yellow-60 dark:text-yellow-30&quot;&gt;&#39;hidden&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Page&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When an Activity is &lt;span data-step=&quot;1&quot; class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-[6px] py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;visible&lt;/span&gt; it’s rendered as normal. When an Activity is &lt;span data-step=&quot;2&quot; class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-[6px] py-[1.5px] border-b-[2px] border-opacity-60 bg-yellow-40 border-yellow-40 text-yellow-60 dark:text-yellow-30&quot;&gt;hidden&lt;/span&gt; it is unmounted, but will save its state and continue to render at a lower priority than anything visible on screen.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;Activity&lt;/code&gt; to save state for parts of the UI the user isn’t using, or pre-render parts that a user is likely to use next.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Let’s look at some examples improving the View Transition examples above.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Effects don’t mount when an Activity is hidden.&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When an &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; is &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hidden&lt;/code&gt;, Effects are unmounted. Conceptually, the component is unmounted, but React saves the state for later.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In practice, this works as expected if you have followed the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/you-might-not-need-an-effect&quot;&gt;You Might Not Need an Effect&lt;/a&gt; guide. To eagerly find problematic Effects, we recommend adding &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/StrictMode&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;StrictMode&amp;gt;&lt;/code&gt;&lt;/a&gt; which will eagerly perform Activity unmounts and mounts to catch any unexpected side effects.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;restoring-state-with-activity&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Restoring state with Activity &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#restoring-state-with-activity&quot; aria-label=&quot;Link for Restoring state with Activity &quot; title=&quot;Link for Restoring state with Activity &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When a user navigates away from a page, it’s common to stop rendering the old page:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; !== &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;However, this means if the user goes back to the old page, all of the previous state is lost. For example, if the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Home /&amp;gt;&lt;/code&gt; page has an &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;input&amp;gt;&lt;/code&gt; field, when the user leaves the page the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;input&amp;gt;&lt;/code&gt; is unmounted, and all of the text they had typed is lost.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Activity allows you to keep the state around as the user changes pages, so when they come back they can resume where they left off. This is done by wrapping part of the tree in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; and toggling the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;mode&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;mode&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;visible&#39;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;hidden&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; !== &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;With this change, we can improve on our View Transitions example above. Before, when you searched for a video, selected one, and returned, your search filter was lost. With Activity, your search filter is restored and you can pick up where you left off.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Try searching for a video, selecting it, and clicking “back”:&lt;/p&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/App.js&quot; type=&quot;button&quot;&gt;App.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/animations.css&quot; type=&quot;button&quot;&gt;animations.css&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:Rj5kcq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;App.js&lt;span class=&quot;ms-2&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for App.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Activity&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ViewTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Details&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Home&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useRouter&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./router&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-comment&quot;&gt;// View Transitions know about Activity&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;/* Render Home in Activity so we don&#39;t lose state */&lt;/span&gt;}
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;mode&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;visible&#39;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;hidden&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; !== &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button translate=&quot;yes&quot; class=&quot;sandpack-expand flex text-base justify-between dark:border-card-dark bg-wash dark:bg-card-dark items-center z-10 p-1 w-full order-2 xl:order-last border-b-1 relative top-0&quot;&gt;&lt;span class=&quot;flex p-2 focus:outline-none text-primary dark:text-primary-dark leading-[20px]&quot;&gt;&lt;svg class=&quot;rotate-0 inline me-1.5 text-xl&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;Show more&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;h3 id=&quot;prerender-with-activity&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Pre-rendering with Activity &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#prerender-with-activity&quot; aria-label=&quot;Link for Pre-rendering with Activity &quot; title=&quot;Link for Pre-rendering with Activity &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Sometimes, you may want to prepare the next part of the UI a user is likely to use ahead of time, so it’s ready by the time they are ready to use it. This is especially useful if the next route needs to suspend on data it needs to render, because you can help ensure the data is already fetched before the user navigates.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For example, our app currently needs to suspend to load the data for each video when you select one. We can improve this by rendering all of the pages in a hidden &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; until the user navigates:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;mode&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;visible&#39;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;hidden&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;mode&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/details/1&#39;&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;visible&#39;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;hidden&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;mode&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/details/1&#39;&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;visible&#39;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;hidden&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;With this update, if the content on the next page has time to pre-render, it will animate in without the Suspense fallback. Click a video, and notice that the video title and description on the Details page render immediately, without a fallback:&lt;/p&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/App.js&quot; type=&quot;button&quot;&gt;App.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/Details.js&quot; type=&quot;button&quot;&gt;Details.js&lt;/button&gt;&lt;button aria-selected=&quot;false&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;false&quot; role=&quot;tab&quot; title=&quot;/src/animations.css&quot; type=&quot;button&quot;&gt;animations.css&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:Rj5mcq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;App.js&lt;span class=&quot;ms-2&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for App.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Activity&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Details&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./Home&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useRouter&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;./router&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;fetchVideos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./data&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;videoId&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;videos&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;fetchVideos&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;/* Render videos in Activity to pre-render them */&lt;/span&gt;}
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;videos&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;key&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;mode&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;videoId&lt;/span&gt; === &lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;visible&#39;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;hidden&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Details&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;mode&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;url&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;visible&#39;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;hidden&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Activity&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ViewTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button translate=&quot;yes&quot; class=&quot;sandpack-expand flex text-base justify-between dark:border-card-dark bg-wash dark:bg-card-dark items-center z-10 p-1 w-full order-2 xl:order-last border-b-1 relative top-0&quot;&gt;&lt;span class=&quot;flex p-2 focus:outline-none text-primary dark:text-primary-dark leading-[20px]&quot;&gt;&lt;svg class=&quot;rotate-0 inline me-1.5 text-xl&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;Show more&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;h3 id=&quot;server-side-rendering-with-activity&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Server-Side Rendering with Activity &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#server-side-rendering-with-activity&quot; aria-label=&quot;Link for Server-Side Rendering with Activity &quot; title=&quot;Link for Server-Side Rendering with Activity &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When using Activity on a page that uses server-side rendering (SSR), there are additional optimizations.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If part of the page is rendered with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;mode=&quot;hidden&quot;&lt;/code&gt;, then it will not be included in the SSR response. Instead, React will schedule a client render for the content inside Activity while the rest of the page hydrates, prioritizing the visible content on screen.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For parts of the UI rendered with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;mode=&quot;visible&quot;&lt;/code&gt;, React will de-prioritize hydration of content within Activity, similar to how Suspense content is hydrated at a lower priority. If the user interacts with the page, we’ll prioritize hydration within the boundary if needed.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;These are advanced use cases, but they show the additional benefits considered with Activity.&lt;/p&gt;
&lt;h3 id=&quot;future-modes-for-activity&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Future modes for Activity &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#future-modes-for-activity&quot; aria-label=&quot;Link for Future modes for Activity &quot; title=&quot;Link for Future modes for Activity &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the future, we may add more modes to Activity.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For example, a common use case is rendering a modal, where the previous “inactive” page is visible behind the “active” modal view. The “hidden” mode does not work for this use case because it’s not visible and not included in SSR.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Instead, we’re considering a new mode that would keep the content visible—and included in SSR—but keep it unmounted and de-prioritize updates. This mode may also need to “pause” DOM updates, since it can be distracting to see backgrounded content updating while a modal is open.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Another mode we’re considering for Activity is the ability to automatically destroy state for hidden Activities if there is too much memory being used. Since the component is already unmounted, it may be preferable to destroy state for the least recently used hidden parts of the app rather than consume too many resources.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;These are areas we’re still exploring, and we’ll share more as we make progress. For more information on what Activity includes today, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/Activity&quot;&gt;check out the docs&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h1 id=&quot;features-in-development&quot; class=&quot;mdx-heading text-5xl font-display font-bold leading-tight&quot;&gt;Features in development &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#features-in-development&quot; aria-label=&quot;Link for Features in development &quot; title=&quot;Link for Features in development &quot; class=&quot;mdx-header-anchor hidden&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re also developing features to help solve the common problems below.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As we iterate on possible solutions, you may see some potential APIs we’re testing being shared based on the PRs we are landing. Please keep in mind that as we try different ideas, we often change or remove different solutions after trying them out.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When the solutions we’re working on are shared too early, it can create churn and confusion in the community. To balance being transparent and limiting confusion, we’re sharing the problems we’re currently developing solutions for, without sharing a particular solution we have in mind.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As these features progress, we’ll announce them on the blog with docs included so you can try them out.&lt;/p&gt;
&lt;h2 id=&quot;react-performance-tracks&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Performance Tracks &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#react-performance-tracks&quot; aria-label=&quot;Link for React Performance Tracks &quot; title=&quot;Link for React Performance Tracks &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re working on a new set of custom tracks to performance profilers using browser APIs that &lt;a href=&quot;https://developer.chrome.com/docs/devtools/performance/extension&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;allow adding custom tracks&lt;/a&gt; to provide more information about the performance of your React app.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This feature is still in progress, so we’re not ready to publish docs to fully release it as an experimental feature yet. You can get a sneak preview when using an experimental version of React, which will automatically add the performance tracks to profiles:&lt;/p&gt;
&lt;div style=&quot;display:flex;justify-content:center;margin-bottom:1rem&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-labs-april-2025/perf_tracks.png&quot;&gt;&lt;img class=&quot;w-full light-image&quot; src=&quot;https://react.dev/images/blog/react-labs-april-2025/perf_tracks.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;picture&gt;&lt;source srcset=&quot;/images/blog/react-labs-april-2025/perf_tracks_dark.png&quot;&gt;&lt;img class=&quot;w-full dark-image&quot; src=&quot;https://react.dev/images/blog/react-labs-april-2025/perf_tracks_dark.webp&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/picture&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;There are a few known issues we plan to address such as performance, and the scheduler track not always “connecting” work across Suspended trees, so it’s not quite ready to try. We’re also still collecting feedback from early adopters to improve the design and usability of the tracks.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Once we solve those issues, we’ll publish experimental docs and share that it’s ready to try.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;automatic-effect-dependencies&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Automatic Effect Dependencies &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#automatic-effect-dependencies&quot; aria-label=&quot;Link for Automatic Effect Dependencies &quot; title=&quot;Link for Automatic Effect Dependencies &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When we released hooks, we had three motivations:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Sharing code between components&lt;/strong&gt;: hooks replaced patterns like render props and higher-order components to allow you to reuse stateful logic without changing your component hierarchy.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Think in terms of function, not lifecycles&lt;/strong&gt;: hooks let you split one component into smaller functions based on what pieces are related (such as setting up a subscription or fetching data), rather than forcing a split based on lifecycle methods.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Support ahead-of-time compilation&lt;/strong&gt;: hooks were designed to support ahead-of-time compilation with less pitfalls causing unintentional de-optimizations caused by lifecycle methods, and limitations of classes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Since their release, hooks have been successful at &lt;em&gt;sharing code between components&lt;/em&gt;. Hooks are now the favored way to share logic between components, and there are less use cases for render props and higher order components. Hooks have also been successful at supporting features like Fast Refresh that were not possible with class components.&lt;/p&gt;
&lt;h3 id=&quot;effects-can-be-hard&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Effects can be hard &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#effects-can-be-hard&quot; aria-label=&quot;Link for Effects can be hard &quot; title=&quot;Link for Effects can be hard &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Unfortunately, some hooks are still hard to think in terms of function instead of lifecycles. Effects specifically are still hard to understand and are the most common pain point we hear from developers. Last year, we spent a significant amount of time researching how Effects were used, and how those use cases could be simplified and easier to understand.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We found that often, the confusion is from using an Effect when you don’t need to. The &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/you-might-not-need-an-effect&quot;&gt;You Might Not Need an Effect&lt;/a&gt; guide covers many cases for when Effects are not the right solution. However, even when an Effect is the right fit for a problem, Effects can still be harder to understand than class component lifecycles.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We believe one of the reasons for confusion is that developers to think of Effects from the &lt;em&gt;component’s&lt;/em&gt; perspective (like a lifecycle), instead of the &lt;em&gt;Effects&lt;/em&gt; point of view (what the Effect does).&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Let’s look at an example &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/lifecycle-of-reactive-effects#thinking-from-the-effects-perspective&quot;&gt;from the docs&lt;/a&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Your Effect connected to the room specified with roomId...&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createConnection&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;serverUrl&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;roomId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;// ...until it disconnected&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;disconnect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;roomId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Many users would read this code as “on mount, connect to the roomId. whenever &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;roomId&lt;/code&gt; changes, disconnect to the old room and re-create the connection”. However, this is thinking from the component’s lifecycle perspective, which means you will need to think of every component lifecycle state to write the Effect correctly. This can be difficult, so it’s understandable that Effects seem harder than class lifecycles when using the component perspective.&lt;/p&gt;
&lt;h3 id=&quot;effects-without-dependencies&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Effects without dependencies &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#effects-without-dependencies&quot; aria-label=&quot;Link for Effects without dependencies &quot; title=&quot;Link for Effects without dependencies &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Instead, it’s better to think from the Effect’s perspective. The Effect doesn’t know about the component lifecycles. It only describes how to start synchronization and how to stop it. When users think of Effects in this way, their Effects tend to be easier to write, and more resilient to being started and stopped as many times as is needed.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We spent some time researching why Effects are thought of from the component perspective, and we think one of the reasons is the dependency array. Since you have to write it, it’s right there and in your face reminding you of what you’re “reacting” to and baiting you into the mental model of ‘do this when these values change’.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When we released hooks, we knew we could make them easier to use with ahead-of-time compilation. With the React Compiler, you’re now able to avoid writing &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useCallback&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useMemo&lt;/code&gt; yourself in most cases. For Effects, the compiler can insert the dependencies for you:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createConnection&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;serverUrl&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;roomId&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-plain&quot;&gt;connection&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;disconnect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-comment&quot;&gt;// compiler inserted dependencies.&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;With this code, the React Compiler can infer the dependencies for you and insert them automatically so you don’t need to see or write them. With features like &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#compiler-ide-extension&quot;&gt;the IDE extension&lt;/a&gt; and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useEffectEvent&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffectEvent&lt;/code&gt;&lt;/a&gt;, we can provide a CodeLens to show you what the Compiler inserted for times you need to debug, or to optimize by removing a dependency. This helps reinforce the correct mental model for writing Effects, which can run at any time to synchronize your component or hook’s state with something else.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Our hope is that automatically inserting dependencies is not only easier to write, but that it also makes them easier to understand by forcing you to think in terms of what the Effect does, and not in component lifecycles.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;compiler-ide-extension&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Compiler IDE Extension &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#compiler-ide-extension&quot; aria-label=&quot;Link for Compiler IDE Extension &quot; title=&quot;Link for Compiler IDE Extension &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Later in 2025 &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1&quot;&gt;we shared&lt;/a&gt; the first stable release of React Compiler, and we’re continuing to invest in shipping more improvements.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve also begun exploring ways to use the React Compiler to provide information that can improve understanding and debugging your code. One idea we’ve started exploring is a new experimental LSP-based React IDE extension powered by React Compiler, similar to the extension used in &lt;a href=&quot;https://conf2024.react.dev/talks/5&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lauren Tan’s React Conf talk&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Our idea is that we can use the compiler’s static analysis to provide more information, suggestions, and optimization opportunities directly in your IDE. For example, we can provide diagnostics for code breaking the Rules of React, hovers to show if components and hooks were optimized by the compiler, or a CodeLens to see &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#automatic-effect-dependencies&quot;&gt;automatically inserted Effect dependencies&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The IDE extension is still an early exploration, but we’ll share our progress in future updates.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;fragment-refs&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Fragment Refs &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#fragment-refs&quot; aria-label=&quot;Link for Fragment Refs &quot; title=&quot;Link for Fragment Refs &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Many DOM APIs like those for event management, positioning, and focus are difficult to compose when writing with React. This often leads developers to reach for Effects, managing multiple Refs, by using APIs like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;findDOMNode&lt;/code&gt; (removed in React 19).&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We are exploring adding refs to Fragments that would point to a group of DOM elements, rather than just a single element. Our hope is that this will simplify managing multiple children and make it easier to write composable React code when calling DOM APIs.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Fragment refs are still being researched. We’ll share more when we’re closer to having the final API finished.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;gesture-animations&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Gesture Animations &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#gesture-animations&quot; aria-label=&quot;Link for Gesture Animations &quot; title=&quot;Link for Gesture Animations &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re also researching ways to enhance View Transitions to support gesture animations such as swiping to open a menu, or scroll through a photo carousel.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Gestures present new challenges for a few reasons:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Gestures are continuous&lt;/strong&gt;: as you swipe the animation is tied to your finger placement time, rather than triggering and running to completion.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Gestures don’t complete&lt;/strong&gt;: when you release your finger gesture animations can run to completion, or revert to their original state (like when you only partially open a menu) depending on how far you go.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Gestures invert old and new&lt;/strong&gt;: while you’re animating, you want the page you are animating from to stay “alive” and interactive. This inverts the browser View Transition model where the “old” state is a snapshot and the “new” state is the live DOM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We believe we’ve found an approach that works well and may introduce a new API for triggering gesture transitions. For now, we’re focused on shipping &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt;, and will revisit gestures afterward.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;concurrent-stores&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Concurrent Stores &lt;a href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#concurrent-stores&quot; aria-label=&quot;Link for Concurrent Stores &quot; title=&quot;Link for Concurrent Stores &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When we released React 18 with concurrent rendering, we also released &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useSyncExternalStore&lt;/code&gt; so external store libraries that did not use React state or context could &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/70&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;support concurrent rendering&lt;/a&gt; by forcing a synchronous render when the store is updated.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Using &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useSyncExternalStore&lt;/code&gt; comes at a cost though, since it forces a bail out from concurrent features like transitions, and forces existing content to show Suspense fallbacks.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Now that React 19 has shipped, we’re revisiting this problem space to create a primitive to fully support concurrent external stores with the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt; API:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;value&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;store&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Our goal is to allow external state to be read during render without tearing, and to work seamlessly with all of the concurrent features React offers.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This research is still early. We’ll share more, and what the new APIs will look like, when we’re further along.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;Thanks to &lt;a href=&quot;https://bsky.app/profile/aurorascharff.no&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Aurora Scharff&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/Eli_White&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Eli White&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/no.lol&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lauren Tan&lt;/a&gt;, &lt;a href=&quot;https://github.com/lunaleaps&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Luna Wei&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt;, &lt;a href=&quot;https://jackpope.me/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jack Pope&lt;/a&gt;, &lt;a href=&quot;https://threads.net/someextent&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jason Bonta&lt;/a&gt;, &lt;a href=&quot;https://github.com/jbrown215&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jordan Brown&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/capt.dev&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jordan Eldredge&lt;/a&gt;, &lt;a href=&quot;https://threads.net/z_mofei&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mofei Zhang&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/sebastienlorber.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sebastien Lorber&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/sebmarkbage.calyptus.eu&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sebastian Markbåge&lt;/a&gt;, and &lt;a href=&quot;https://github.com/yungsters&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Tim Yung&lt;/a&gt; for reviewing this post.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2025/10/01/react-19-2&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React 19.2&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;Sunsetting Create React App&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more</link><guid isPermaLink="false">https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more</guid><pubDate>Tue, 22 Apr 2025 16:00:00 GMT</pubDate></item><item><title>Sunsetting Create React App</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;February 14, 2025 by &lt;a href=&quot;https://twitter.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt; and &lt;a href=&quot;https://bsky.app/profile/ricky.fm&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ricky Hanlon&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Today, we’re deprecating &lt;a href=&quot;https://create-react-app.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Create React App&lt;/a&gt; for new apps, and encouraging existing apps to migrate to a &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#how-to-migrate-to-a-framework&quot;&gt;framework&lt;/a&gt;, or to &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#how-to-migrate-to-a-build-tool&quot;&gt;migrate to a build tool&lt;/a&gt; like Vite, Parcel, or RSBuild.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re also providing docs for when a framework isn’t a good fit for your project, you want to build your own framework, or you just want to learn how React works by &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/build-a-react-app-from-scratch&quot;&gt;building a React app from scratch&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When we released Create React App in 2016, there was no clear way to build a new React app.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To create a React app, you had to install a bunch of tools and wire them up together yourself to support basic features like JSX, linting, and hot reloading. This was very tricky to do correctly, so the &lt;a href=&quot;https://github.com/react-boilerplate/react-boilerplate&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;community&lt;/a&gt; &lt;a href=&quot;https://github.com/kriasoft/react-starter-kit&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;created&lt;/a&gt; &lt;a href=&quot;https://github.com/petehunt/react-boilerplate&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;boilerplates&lt;/a&gt; for &lt;a href=&quot;https://github.com/gaearon/react-hot-boilerplate&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;common&lt;/a&gt; &lt;a href=&quot;https://github.com/erikras/react-redux-universal-hot-example&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;setups&lt;/a&gt;. However, boilerplates were difficult to update and fragmentation made it difficult for React to release new features.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Create React App solved these problems by combining several tools into a single recommended configuration. This allowed apps a simple way to upgrade to new tooling features, and allowed the React team to deploy non-trivial tooling changes (Fast Refresh support, React Hooks lint rules) to the broadest possible audience.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This model became so popular that there’s an entire category of tools working this way today.&lt;/p&gt;
&lt;h2 id=&quot;deprecating-create-react-app&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Deprecating Create React App &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#deprecating-create-react-app&quot; aria-label=&quot;Link for Deprecating Create React App &quot; title=&quot;Link for Deprecating Create React App &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Although Create React App makes it easy to get started, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#limitations-of-build-tools&quot;&gt;there are several limitations&lt;/a&gt; that make it difficult to build high performant production apps. In principle, we could solve these problems by essentially evolving it into a &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#why-we-recommend-frameworks&quot;&gt;framework&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;However, since Create React App currently has no active maintainers, and there are many existing frameworks that solve these problems already, we’ve decided to deprecate Create React App.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Starting today, if you install a new app, you will see a deprecation warning:&lt;/p&gt;
&lt;div class=&quot;console-block mb-4 text-secondary bg-wash dark:bg-wash-dark rounded-lg&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;flex w-full rounded-t-lg bg-gray-200 dark:bg-gray-80&quot;&gt;&lt;div class=&quot;px-4 py-2 border-gray-300 dark:border-gray-90 border-r&quot;&gt;&lt;div class=&quot;bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:15px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex text-sm px-4&quot;&gt;&lt;div class=&quot;border-b-2 border-gray-300 dark:border-gray-90 text-tertiary dark:text-tertiary-dark&quot;&gt;Console&lt;/div&gt;&lt;div class=&quot;px-4 py-2 flex&quot;&gt;&lt;div class=&quot;me-2 bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;me-2 hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 divide-y divide-gray-300 dark:divide-gray-70 text-base&quot;&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;create-react-app is deprecated.

You can find a list of up-to-date React frameworks on react.dev
For more info see: react.dev/link/cra

This error message will only be shown once per install.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve also added a deprecation notice to the Create React App &lt;a href=&quot;https://create-react-app.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;website&lt;/a&gt; and GitHub &lt;a href=&quot;https://github.com/facebook/create-react-app&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;repo&lt;/a&gt;. Create React App will continue working in maintenance mode, and we’ve published a new version of Create React App to work with React 19.&lt;/p&gt;
&lt;h2 id=&quot;how-to-migrate-to-a-framework&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;How to Migrate to a Framework &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#how-to-migrate-to-a-framework&quot; aria-label=&quot;Link for How to Migrate to a Framework &quot; title=&quot;Link for How to Migrate to a Framework &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We recommend &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/creating-a-react-app&quot;&gt;creating new React apps&lt;/a&gt; with a framework. All the frameworks we recommend support client-side rendering (&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/CSR&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CSR&lt;/a&gt;) and single-page apps (&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/SPA&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;SPA&lt;/a&gt;), and can be deployed to a CDN or static hosting service without a server.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For existing apps, these guides will help you migrate to a client-only SPA:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://nextjs.org/docs/app/building-your-application/upgrading/from-create-react-app&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Next.js’ Create React App migration guide&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://reactrouter.com/upgrading/component-routes&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Router’s framework adoption guide&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://docs.expo.dev/router/migrate/from-expo-webpack/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Expo webpack to Expo Router migration guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-to-migrate-to-a-build-tool&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;How to Migrate to a Build Tool &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#how-to-migrate-to-a-build-tool&quot; aria-label=&quot;Link for How to Migrate to a Build Tool &quot; title=&quot;Link for How to Migrate to a Build Tool &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If your app has unusual constraints, or you prefer to solve these problems by building your own framework, or you just want to learn how react works from scratch, you can roll your own custom setup with React using Vite, Parcel or Rsbuild.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For existing apps, these guides will help you migrate to a build tool:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.robinwieruch.de/vite-create-react-app/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Vite Create React App migration guide&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://parceljs.org/migration/cra/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Parcel Create React App migration guide&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://rsbuild.dev/guide/migration/cra&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Rsbuild Create React App migration guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To help get started with Vite, Parcel or Rsbuild, we’ve added new docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/build-a-react-app-from-scratch&quot;&gt;Building a React App from Scratch&lt;/a&gt;.&lt;/p&gt;
&lt;details class=&quot;my-12 rounded-2xl shadow-inner-border dark:shadow-inner-border-dark relative dark:bg-opacity-20 dark:bg-purple-60 bg-purple-5&quot;&gt;&lt;summary class=&quot;list-none p-8&quot; tabindex=&quot;-1&quot;&gt;&lt;h5 class=&quot;mb-4 uppercase font-bold flex items-center text-sm dark:text-purple-30 text-purple-50&quot;&gt;&lt;svg class=&quot;inline me-2 dark:text-purple-30 text-purple-40&quot; width=&quot;1.5em&quot; height=&quot;1.5em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M34.7409 59.7228L32.9567 58.9094C27.2672 56.3157 20.7328 56.3157 15.0433 58.9094C12.6018 60.0224 9.39163 59.0275 8.44602 56.0621C7.45647 52.9589 5.99975 46.5898 6 35.9997C6.00029 23.5648 8.00803 18.3599 9.11099 16.4196C9.67795 15.4222 10.5255 14.8455 11.2254 14.5264L12.0179 14.1651C19.6351 10.6926 28.4011 10.6738 36 14.1733C43.5989 10.6738 52.3649 10.6926 59.9821 14.1651L60.7746 14.5264C61.4745 14.8455 62.3221 15.4222 62.889 16.4196C63.992 18.3599 65.9997 23.5648 66 35.9997C66.0002 46.5898 64.5435 52.9589 63.554 56.0621C62.6084 59.0275 59.3982 60.0224 56.9567 58.9094C51.2672 56.3157 44.7328 56.3157 39.0433 58.9094L37.2591 59.7228C37.1986 59.7508 37.1373 59.7767 37.0753 59.8004C36.4484 60.0411 35.7556 60.0653 35.1102 59.8648C34.9847 59.8258 34.8613 59.7784 34.7409 59.7228ZM14.5068 19.6246C20.3733 16.9501 27.0874 16.8775 33 19.4067V52.473C26.7613 50.32 19.9378 50.471 13.7811 52.9261C13.0005 49.9843 11.9998 44.547 12 35.9998C12.0002 25.5786 13.4879 21.1893 14.1179 19.8018L14.5068 19.6246ZM39 52.473C45.2387 50.32 52.0622 50.471 58.2189 52.9261C58.9995 49.9843 60.0002 44.547 60 35.9998C59.9998 25.5786 58.5121 21.1893 57.8821 19.8018L57.4932 19.6246C51.6267 16.9501 44.9126 16.8775 39 19.4067V52.473Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Deep Dive&lt;/h5&gt;&lt;div class=&quot;mb-4&quot;&gt;&lt;h4 id=&quot;do-i-need-a-framework&quot; class=&quot;mdx-heading text-xl font-bold text-primary dark:text-primary-dark text-xl font-display font-bold leading-9 my-4&quot;&gt;Do I need a framework? &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#do-i-need-a-framework&quot; aria-label=&quot;Link for Do I need a framework? &quot; title=&quot;Link for Do I need a framework? &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;&lt;button class=&quot;bg-purple-50 border-purple-50 hover:bg-purple-40 focus:bg-purple-50 active:bg-purple-50 text-base leading-tight font-bold rounded-full py-2 px-4 focus:outline focus:outline-offset-2 focus:outline-link dark:focus:outline-link-dark inline-flex items-center my-1 bg-link border-link text-white hover:bg-link focus:bg-link active:bg-link&quot;&gt;&lt;span class=&quot;me-1&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;Show Details&lt;/button&gt;&lt;/summary&gt;&lt;div class=&quot;p-8 border-t dark:border-purple-60 border-purple-10 &quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Most apps would benefit from a framework, but there are valid cases to build a React app from scratch. A good rule of thumb is if your app needs routing, you would probably benefit from a framework.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Just like Svelte has Sveltekit, Vue has Nuxt, and Solid has SolidStart, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#why-we-recommend-frameworks&quot;&gt;React recommends using a framework&lt;/a&gt; that fully integrates routing into features like data-fetching and code-splitting out of the box. This avoids the pain of needing to write your own complex configurations and essentially build a framework yourself.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;However, you can always &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/build-a-react-app-from-scratch&quot;&gt;build a React app from scratch&lt;/a&gt; using a build tool like Vite, Parcel, or Rsbuild.&lt;/p&gt;&lt;/div&gt;&lt;/details&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Continue reading to learn more about the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#limitations-of-build-tools&quot;&gt;limitations of build tools&lt;/a&gt; and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#why-we-recommend-frameworks&quot;&gt;why we recommend frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;limitations-of-build-tools&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Limitations of Build Tools &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#limitations-of-build-tools&quot; aria-label=&quot;Link for Limitations of Build Tools &quot; title=&quot;Link for Limitations of Build Tools &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Create React App and build tools like it make it easy to get started building a React app. After running &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;npx create-react-app my-app&lt;/code&gt;, you get a fully configured React app with a development server, linting, and a production build.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For example, if you’re building an internal admin tool, you can start with a landing page:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Welcome to the Admin Tool!&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This allows you to immediately start coding in React with features like JSX, default linting rules, and a bundler to run in both development and production. However, this setup is missing the tools you need to build a real production app.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Most production apps need solutions to problems like routing, data fetching, and code splitting.&lt;/p&gt;
&lt;h3 id=&quot;routing&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Routing &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#routing&quot; aria-label=&quot;Link for Routing &quot; title=&quot;Link for Routing &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Create React App does not include a specific routing solution. If you’re just getting started, one option is to use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useState&lt;/code&gt; to switch between routes. But doing this means that you can’t share links to your app - every link would go to the same page - and structuring your app becomes difficult over time:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Home&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Dashboard&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Dashboard&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// ❌ Routing in state does not create URLs&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setRoute&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;home&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;route&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;home&#39;&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;route&lt;/span&gt; === &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;dashboard&#39;&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Dashboard&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This is why most apps that use Create React App solve add routing with a routing library like &lt;a href=&quot;https://reactrouter.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Router&lt;/a&gt; or &lt;a href=&quot;https://tanstack.com/router/latest&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Tanstack Router&lt;/a&gt;. With a routing library, you can add additional routes to the app, which provides opinions on the structure of your app, and allows you to start sharing links to routes. For example, with React Router you can define routes:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;RouterProvider&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;createBrowserRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-router&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Home&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Dashboard&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Dashboard&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// ✅ Each route has it&#39;s own URL&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;router&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createBrowserRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/dashboard&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Dashboard&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;RouterProvider&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;router&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;With this change, you can share a link to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;/dashboard&lt;/code&gt; and the app will navigate to the dashboard page . Once you have a routing library, you can add additional features like nested routes, route guards, and route transitions, which are difficult to implement without a routing library.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;There’s a tradeoff being made here: the routing library adds complexity to the app, but it also adds features that are difficult to implement without it.&lt;/p&gt;
&lt;h3 id=&quot;data-fetching&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Data Fetching &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#data-fetching&quot; aria-label=&quot;Link for Data Fetching &quot; title=&quot;Link for Data Fetching &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Another common problem in Create React App is data fetching. Create React App does not include a specific data fetching solution. If you’re just getting started, a common option is to use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;fetch&lt;/code&gt; in an effect to load data.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;But doing this means that the data is fetched after the component renders, which can cause network waterfalls. Network waterfalls are caused by fetching data when your app renders instead of in parallel while the code is downloading:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Dashboard&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setData&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// ❌ Fetching data in a component causes network waterfalls&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/api/data&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      .&lt;span class=&quot;sp-syntax-property&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;response&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      .&lt;span class=&quot;sp-syntax-property&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;setData&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;data&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;key&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;item&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;item&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Fetching in an effect means the user has to wait longer to see the content, even though the data could have been fetched earlier. To solve this, you can use a data fetching library like &lt;a href=&quot;https://tanstack.com/query/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;TanStack Query&lt;/a&gt;, &lt;a href=&quot;https://swr.vercel.app/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;SWR&lt;/a&gt;, &lt;a href=&quot;https://www.apollographql.com/docs/react&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Apollo&lt;/a&gt;, or &lt;a href=&quot;https://relay.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Relay&lt;/a&gt; which provide options to prefetch data so the request is started before the component renders.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;These libraries work best when integrated with your routing “loader” pattern to specify data dependencies at the route level, which allows the router to optimize your data fetches:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;loader&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;response&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;`/api/data`&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;data&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;response&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// ✅ Fetching data in parallel while the code is downloading&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Dashboard&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;loaderData&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;loaderData&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;key&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;item&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;item&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;On initial load, the router can fetch the data immediately before the route is rendered. As the user navigates around the app, the router is able to fetch both the data and the route at the same time, parallelizing the fetches. This reduces the time it takes to see the content on the screen, and can improve the user experience.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;However, this requires correctly configuring the loaders in your app and trades off complexity for performance.&lt;/p&gt;
&lt;h3 id=&quot;code-splitting&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Code Splitting &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#code-splitting&quot; aria-label=&quot;Link for Code Splitting &quot; title=&quot;Link for Code Splitting &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Another common problem in Create React App is &lt;a href=&quot;https://www.patterns.dev/vanilla/bundle-splitting&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;code splitting&lt;/a&gt;. Create React App does not include a specific code splitting solution. If you’re just getting started, you might not consider code splitting at all.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This means your app is shipped as a single bundle:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-plain&quot;&gt;bundle&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;js&lt;/span&gt;    &lt;span class=&quot;sp-syntax-static&quot;&gt;75&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;kb&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;But for ideal performance, you should “split” your code into separate bundles so the user only needs to download what they need. This decreases the time the user needs to wait to load your app, by only downloading the code they need to see the page they are on.&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-plain&quot;&gt;core&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;js&lt;/span&gt;      &lt;span class=&quot;sp-syntax-static&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;kb&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-plain&quot;&gt;home&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;js&lt;/span&gt;      &lt;span class=&quot;sp-syntax-static&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;kb&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-plain&quot;&gt;dashboard&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;js&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;kb&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;One way to do code-splitting is with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;React.lazy&lt;/code&gt;. However, this means that the code is not fetched until the component renders, which can cause network waterfalls. A more optimal solution is to use a router feature that fetches the code in parallel while the code is downloading. For example, React Router provides a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;lazy&lt;/code&gt; option to specify that a route should be code split and optimize when it is loaded:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Home&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Home&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Dashboard&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Dashboard&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// ✅ Routes are downloaded before rendering&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;router&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createBrowserRouter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;lazy&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./Home&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/dashboard&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;lazy&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;Dashboard&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Optimized code-splitting is tricky to get right, and it’s easy to make mistakes that can cause the user to download more code than they need. It works best when integrated with your router and data loading solutions to maximize caching, parallelize fetches, and support &lt;a href=&quot;https://www.patterns.dev/vanilla/import-on-interaction&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;“import on interaction”&lt;/a&gt; patterns.&lt;/p&gt;
&lt;h3 id=&quot;and-more&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;And more… &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#and-more&quot; aria-label=&quot;Link for And more… &quot; title=&quot;Link for And more… &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;These are just a few examples of the limitations of Create React App.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Once you’ve integrated routing, data-fetching, and code splitting, you now also need to consider pending states, navigation interruptions, error messages to the user, and revalidation of the data. There are entire categories of problems that users need to solve like:&lt;/p&gt;
&lt;div style=&quot;display:flex;width:100%;justify-content:space-around&quot;&gt;&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Accessibility&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Asset loading&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Authentication&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Caching&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Error handling&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Mutating data&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Navigations&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Optimistic updates&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Progressive enhancement&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Server-side rendering&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Static site generation&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Streaming&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;All of these work together to create the most optimal &lt;a href=&quot;https://www.patterns.dev/vanilla/loading-sequence&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;loading sequence&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Solving each of these problems individually in Create React App can be difficult as each problem is interconnected with the others and can require deep expertise in problem areas users may not be familiar with. In order to solve these problems, users end up building their own bespoke solutions on top of Create React App, which was the problem Create React App originally tried to solve.&lt;/p&gt;
&lt;h2 id=&quot;why-we-recommend-frameworks&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Why we Recommend Frameworks &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#why-we-recommend-frameworks&quot; aria-label=&quot;Link for Why we Recommend Frameworks &quot; title=&quot;Link for Why we Recommend Frameworks &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Although you could solve all these pieces yourself in a build tool like Create React App, Vite, or Parcel, it is hard to do well. Just like when Create React App itself integrated several build tools together, you need a tool to integrate all of these features together to provide the best experience to users.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This category of tools that integrates build tools, rendering, routing, data fetching, and code splitting are known as “frameworks” — or if you prefer to call React itself a framework, you might call them “metaframeworks”.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Frameworks impose some opinions about structuring your app in order to provide a much better user experience, in the same way build tools impose some opinions to make tooling easier. This is why we started recommending frameworks like &lt;a href=&quot;https://nextjs.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Next.js&lt;/a&gt;, &lt;a href=&quot;https://reactrouter.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Router&lt;/a&gt;, and &lt;a href=&quot;https://expo.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Expo&lt;/a&gt; for new projects.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Frameworks provide the same getting started experience as Create React App, but also provide solutions to problems users need to solve anyway in real production apps.&lt;/p&gt;
&lt;details class=&quot;my-12 rounded-2xl shadow-inner-border dark:shadow-inner-border-dark relative dark:bg-opacity-20 dark:bg-purple-60 bg-purple-5&quot;&gt;&lt;summary class=&quot;list-none p-8&quot; tabindex=&quot;-1&quot;&gt;&lt;h5 class=&quot;mb-4 uppercase font-bold flex items-center text-sm dark:text-purple-30 text-purple-50&quot;&gt;&lt;svg class=&quot;inline me-2 dark:text-purple-30 text-purple-40&quot; width=&quot;1.5em&quot; height=&quot;1.5em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M34.7409 59.7228L32.9567 58.9094C27.2672 56.3157 20.7328 56.3157 15.0433 58.9094C12.6018 60.0224 9.39163 59.0275 8.44602 56.0621C7.45647 52.9589 5.99975 46.5898 6 35.9997C6.00029 23.5648 8.00803 18.3599 9.11099 16.4196C9.67795 15.4222 10.5255 14.8455 11.2254 14.5264L12.0179 14.1651C19.6351 10.6926 28.4011 10.6738 36 14.1733C43.5989 10.6738 52.3649 10.6926 59.9821 14.1651L60.7746 14.5264C61.4745 14.8455 62.3221 15.4222 62.889 16.4196C63.992 18.3599 65.9997 23.5648 66 35.9997C66.0002 46.5898 64.5435 52.9589 63.554 56.0621C62.6084 59.0275 59.3982 60.0224 56.9567 58.9094C51.2672 56.3157 44.7328 56.3157 39.0433 58.9094L37.2591 59.7228C37.1986 59.7508 37.1373 59.7767 37.0753 59.8004C36.4484 60.0411 35.7556 60.0653 35.1102 59.8648C34.9847 59.8258 34.8613 59.7784 34.7409 59.7228ZM14.5068 19.6246C20.3733 16.9501 27.0874 16.8775 33 19.4067V52.473C26.7613 50.32 19.9378 50.471 13.7811 52.9261C13.0005 49.9843 11.9998 44.547 12 35.9998C12.0002 25.5786 13.4879 21.1893 14.1179 19.8018L14.5068 19.6246ZM39 52.473C45.2387 50.32 52.0622 50.471 58.2189 52.9261C58.9995 49.9843 60.0002 44.547 60 35.9998C59.9998 25.5786 58.5121 21.1893 57.8821 19.8018L57.4932 19.6246C51.6267 16.9501 44.9126 16.8775 39 19.4067V52.473Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Deep Dive&lt;/h5&gt;&lt;div class=&quot;mb-4&quot;&gt;&lt;h4 id=&quot;server-rendering-is-optional&quot; class=&quot;mdx-heading text-xl font-bold text-primary dark:text-primary-dark text-xl font-display font-bold leading-9 my-4&quot;&gt;Server rendering is optional &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#server-rendering-is-optional&quot; aria-label=&quot;Link for Server rendering is optional &quot; title=&quot;Link for Server rendering is optional &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;&lt;button class=&quot;bg-purple-50 border-purple-50 hover:bg-purple-40 focus:bg-purple-50 active:bg-purple-50 text-base leading-tight font-bold rounded-full py-2 px-4 focus:outline focus:outline-offset-2 focus:outline-link dark:focus:outline-link-dark inline-flex items-center my-1 bg-link border-link text-white hover:bg-link focus:bg-link active:bg-link&quot;&gt;&lt;span class=&quot;me-1&quot;&gt;&lt;svg class=&quot;rotate-0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;Show Details&lt;/button&gt;&lt;/summary&gt;&lt;div class=&quot;p-8 border-t dark:border-purple-60 border-purple-10 &quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The frameworks we recommend all provide the option to create a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/CSR&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;client-side rendered (CSR)&lt;/a&gt; app.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In some cases, CSR is the right choice for a page, but many times it’s not. Even if most of your app is client-side, there are often individual pages that could benefit from server rendering features like &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/SSG&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;static-site generation (SSG)&lt;/a&gt; or &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/SSR&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;server-side rendering (SSR)&lt;/a&gt;, for example a Terms of Service page, or documentation.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Server rendering generally sends less JavaScript to the client, and a full HTML document which produces a faster &lt;a href=&quot;https://web.dev/articles/fcp&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;First Contentful Paint (FCP)&lt;/a&gt; by reducing &lt;a href=&quot;https://web.dev/articles/tbt&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Total Blocking Time (TBD)&lt;/a&gt;, which can also lower &lt;a href=&quot;https://web.dev/articles/inp&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Interaction to Next Paint (INP)&lt;/a&gt;. This is why the &lt;a href=&quot;https://web.dev/articles/rendering-on-the-web&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Chrome team has encouraged&lt;/a&gt; developers to consider static or server-side render over a full client-side approach to achieve the best possible performance.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;There are tradeoffs to using a server, and it is not always the best option for every page. Generating pages on the server incurs additional cost and takes time to generate which can increase &lt;a href=&quot;https://web.dev/articles/ttfb&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Time to First Byte (TTFB)&lt;/a&gt;. The best performing apps are able to pick the right rendering strategy on a per-page basis, based on the tradeoffs of each strategy.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Frameworks provide the option to use a server on any page if you want to, but do not force you to use a server. This allows you to pick the right rendering strategy for each page in your app.&lt;/p&gt;&lt;h4 id=&quot;server-components&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;What About Server Components &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#server-components&quot; aria-label=&quot;Link for What About Server Components &quot; title=&quot;Link for What About Server Components &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The frameworks we recommend also include support for React Server Components.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Server Components help solve these problems by moving routing and data fetching to the server, and allowing code splitting to be done for client components based on the data you render, instead of just the route rendered, and reducing the amount of JavaScript shipped for the best possible &lt;a href=&quot;https://www.patterns.dev/vanilla/loading-sequence&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;loading sequence&lt;/a&gt;.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Server Components do not require a server. They can be run at build time on your CI server to create a static-site generated app (SSG) app, at runtime on a web server for a server-side rendered (SSR) app.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2020/12/21/data-fetching-with-react-server-components&quot;&gt;Introducing zero-bundle size React Server Components&lt;/a&gt; and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rsc/server-components&quot;&gt;the docs&lt;/a&gt; for more info.&lt;/p&gt;&lt;/div&gt;&lt;/details&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;server-rendering-is-not-just-for-seo&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Server Rendering is not just for SEO &lt;a href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app#server-rendering-is-not-just-for-seo&quot; aria-label=&quot;Link for Server Rendering is not just for SEO &quot; title=&quot;Link for Server Rendering is not just for SEO &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;A common misunderstanding is that server rendering is only for &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/SEO&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;SEO&lt;/a&gt;.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;While server rendering can improve SEO, it also improves performance by reducing the amount of JavaScript the user needs to download and parse before they can see the content on the screen.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This is why the Chrome team &lt;a href=&quot;https://web.dev/articles/rendering-on-the-web&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;has encouraged&lt;/a&gt; developers to consider static or server-side render over a full client-side approach to achieve the best possible performance.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;Thank you to &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt; for creating Create React App, and &lt;a href=&quot;https://github.com/Timer&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joe Haddad&lt;/a&gt;, &lt;a href=&quot;https://github.com/ianschmitz&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ian Schmitz&lt;/a&gt;, &lt;a href=&quot;https://github.com/mrmckeb&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Brody McKee&lt;/a&gt;, and &lt;a href=&quot;https://github.com/facebook/create-react-app/graphs/contributors&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;many others&lt;/a&gt; for maintaining Create React App over the years. Thank you to &lt;a href=&quot;https://bsky.app/profile/brookslybrand.bsky.social&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Brooks Lybrand&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/devongovett.bsky.social&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Devon Govett&lt;/a&gt;, &lt;a href=&quot;https://x.com/Eli_White&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Eli White&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/jherr.dev&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jack Herrington&lt;/a&gt;, &lt;a href=&quot;https://x.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joe Savona&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/no.lol&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lauren Tan&lt;/a&gt;, &lt;a href=&quot;https://x.com/leeerob&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lee Robinson&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/acemarke.dev&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mark Erikson&lt;/a&gt;, &lt;a href=&quot;https://x.com/ryanflorence&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ryan Florence&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/sophiebits.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sophie Alpert&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/tannerlinsley.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Tanner Linsley&lt;/a&gt;, and &lt;a href=&quot;https://x.com/theo&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Theo Browne&lt;/a&gt; for reviewing and providing feedback on this post.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Labs: View Transitions, Activity, and more&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React 19&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2025/02/14/sunsetting-create-react-app</link><guid isPermaLink="false">https://react.dev/blog/2025/02/14/sunsetting-create-react-app</guid><pubDate>Thu, 13 Feb 2025 16:00:00 GMT</pubDate></item><item><title>React v19</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;December 05, 2024 by &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/team&quot;&gt;The React Team&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h3 id=&quot;react-19-is-now-stable&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React 19 is now stable! &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#react-19-is-now-stable&quot; aria-label=&quot;Link for React 19 is now stable! &quot; title=&quot;Link for React 19 is now stable! &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Additions since this post was originally shared with the React 19 RC in April:&lt;/p&gt;&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Pre-warming for suspended trees&lt;/strong&gt;: see &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#improvements-to-suspense&quot;&gt;Improvements to Suspense&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;React DOM static APIs&lt;/strong&gt;: see &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19#new-react-dom-static-apis&quot;&gt;New React DOM Static APIs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;The date for this post has been updated to reflect the stable release date.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React v19 is now available on npm!&lt;/p&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In our &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide&quot;&gt;React 19 Upgrade Guide&lt;/a&gt;, we shared step-by-step instructions for upgrading your app to React 19. In this post, we’ll give an overview of the new features in React 19, and how you can adopt them.&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19#whats-new-in-react-19&quot;&gt;What’s new in React 19&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19#improvements-in-react-19&quot;&gt;Improvements in React 19&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19#how-to-upgrade&quot;&gt;How to upgrade&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For a list of breaking changes, see the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide&quot;&gt;Upgrade Guide&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;whats-new-in-react-19&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;What’s new in React 19 &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#whats-new-in-react-19&quot; aria-label=&quot;Link for What’s new in React 19 &quot; title=&quot;Link for What’s new in React 19 &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;actions&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Actions &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#actions&quot; aria-label=&quot;Link for Actions &quot; title=&quot;Link for Actions &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;A common use case in React apps is to perform a data mutation and then update state in response. For example, when a user submits a form to change their name, you will make an API request, and then handle the response. In the past, you would need to handle pending states, errors, optimistic updates, and sequential requests manually.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For example, you could handle the pending and error state in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useState&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before Actions&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;UpdateName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setError&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isPending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setIsPending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;handleSubmit&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;setIsPending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;updateName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;setIsPending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-definition&quot;&gt;setError&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;/path&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onChange&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;setName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;event&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;target&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;handleSubmit&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;disabled&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isPending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        Update&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, we’re adding support for using async functions in transitions to handle pending states, errors, forms, and optimistic updates automatically.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For example, you can use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useTransition&lt;/code&gt; to handle the pending state for you:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Using pending state from Actions&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;UpdateName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setError&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isPending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;startTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;handleSubmit&lt;/span&gt; = &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;startTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;updateName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        &lt;span class=&quot;sp-syntax-definition&quot;&gt;setError&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-definition&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;/path&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onChange&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;setName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;event&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;target&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;handleSubmit&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;disabled&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isPending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        Update&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The async transition will immediately set the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;isPending&lt;/code&gt; state to true, make the async request(s), and switch &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;isPending&lt;/code&gt; to false after any transitions. This allows you to keep the current UI responsive and interactive while the data is changing.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;by-convention-functions-that-use-async-transitions-are-called-actions&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;By convention, functions that use async transitions are called “Actions”. &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#by-convention-functions-that-use-async-transitions-are-called-actions&quot; aria-label=&quot;Link for By convention, functions that use async transitions are called “Actions”. &quot; title=&quot;Link for By convention, functions that use async transitions are called “Actions”. &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Actions automatically manage submitting data for you:&lt;/p&gt;&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Pending state&lt;/strong&gt;: Actions provide a pending state that starts at the beginning of a request and automatically resets when the final state update is committed.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Optimistic updates&lt;/strong&gt;: Actions support the new &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19#new-hook-optimistic-updates&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useOptimistic&lt;/code&gt;&lt;/a&gt; hook so you can show users instant feedback while the requests are submitting.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Error handling&lt;/strong&gt;: Actions provide error handling so you can display Error Boundaries when a request fails, and revert optimistic updates to their original value automatically.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Forms&lt;/strong&gt;: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt; elements now support passing functions to the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;action&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;formAction&lt;/code&gt; props. Passing functions to the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;action&lt;/code&gt; props use Actions by default and reset the form automatically after submission.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Building on top of Actions, React 19 introduces &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19#new-hook-optimistic-updates&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useOptimistic&lt;/code&gt;&lt;/a&gt; to manage optimistic updates, and a new hook &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19#new-hook-useactionstate&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;React.useActionState&lt;/code&gt;&lt;/a&gt; to handle common cases for Actions. In &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt; we’re adding &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19#form-actions&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt; Actions&lt;/a&gt; to manage forms automatically and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19#new-hook-useformstatus&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useFormStatus&lt;/code&gt;&lt;/a&gt; to support the common cases for Actions in forms.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, the above example can be simplified to:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Using &amp;lt;form&amp;gt; Actions and useActionState&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;ChangeName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;setName&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;submitAction&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;isPending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useActionState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;previousState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;formData&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;updateName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;formData&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-definition&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;/path&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;form&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;action&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;submitAction&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;text&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;name&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;submit&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;disabled&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isPending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Update&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the next section, we’ll break down each of the new Action features in React 19.&lt;/p&gt;
&lt;h3 id=&quot;new-hook-useactionstate&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New hook: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useActionState&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#new-hook-useactionstate&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To make the common cases easier for Actions, we’ve added a new hook called &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useActionState&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;submitAction&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;isPending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useActionState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;previousState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;newName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;updateName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;newName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-comment&quot;&gt;// You can return any result of the action.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Here, we return only the error.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;// handle success&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useActionState&lt;/code&gt; accepts a function (the “Action”), and returns a wrapped Action to call. This works because Actions compose. When the wrapped Action is called, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useActionState&lt;/code&gt; will return the last result of the Action as &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;data&lt;/code&gt;, and the pending state of the Action as &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;pending&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;React.useActionState&lt;/code&gt; was previously called &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.useFormState&lt;/code&gt; in the Canary releases, but we’ve renamed it and deprecated &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useFormState&lt;/code&gt;.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See &lt;a href=&quot;https://github.com/react/react/pull/28491&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#28491&lt;/a&gt; for more info.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more information, see the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useActionState&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useActionState&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;form-actions&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React DOM: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt; Actions &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#form-actions&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Actions are also integrated with React 19’s new &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt; features for &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;. We’ve added support for passing functions as the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;action&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;formAction&lt;/code&gt; props of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt;, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;input&amp;gt;&lt;/code&gt;, and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;button&amp;gt;&lt;/code&gt; elements to automatically submit forms with Actions:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;form&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;action&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;actionFunction&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt; Action succeeds, React will automatically reset the form for uncontrolled components. If you need to reset the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt; manually, you can call the new &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;requestFormReset&lt;/code&gt; React DOM API.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more information, see the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt; docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/form&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt;&lt;/a&gt;, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/input&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;input&amp;gt;&lt;/code&gt;&lt;/a&gt;, and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;button&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;new-hook-useformstatus&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React DOM: New hook: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useFormStatus&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#new-hook-useformstatus&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In design systems, it’s common to write design components that need access to information about the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt; they’re in, without drilling props down to the component. This can be done via Context, but to make the common case easier, we’ve added a new hook &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useFormStatus&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;useFormStatus&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;DesignButton&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;pending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useFormStatus&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;submit&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;disabled&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;pending&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useFormStatus&lt;/code&gt; reads the status of the parent &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt; as if the form was a Context provider.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more information, see the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt; docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/hooks/useFormStatus&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useFormStatus&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;new-hook-optimistic-updates&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New hook: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useOptimistic&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#new-hook-optimistic-updates&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Another common UI pattern when performing a data mutation is to show the final state optimistically while the async request is underway. In React 19, we’re adding a new hook called &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useOptimistic&lt;/code&gt; to make this easier:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;ChangeName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;currentName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onUpdateName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;optimisticName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setOptimisticName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useOptimistic&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;currentName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;submitAction&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;formData&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;newName&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;formData&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;setOptimisticName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;newName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;updatedName&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;updateName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;newName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;onUpdateName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;updatedName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;form&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;action&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;submitAction&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Your name is: &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;optimisticName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Change Name:&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;          &lt;span class=&quot;sp-syntax-property&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;          &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;          &lt;span class=&quot;sp-syntax-property&quot;&gt;disabled&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;currentName&lt;/span&gt; !== &lt;span class=&quot;sp-syntax-plain&quot;&gt;optimisticName&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useOptimistic&lt;/code&gt; hook will immediately render the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;optimisticName&lt;/code&gt; while the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;updateName&lt;/code&gt; request is in progress. When the update finishes or errors, React will automatically switch back to the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;currentName&lt;/code&gt; value.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more information, see the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useOptimistic&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useOptimistic&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;new-feature-use&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New API: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#new-feature-use&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19 we’re introducing a new API to read resources in render: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For example, you can read a promise with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt;, and React will Suspend until the promise resolves:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Comments&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;commentsPromise&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// `use` will suspend until the promise resolves.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;comments&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;commentsPromise&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;comments&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;comment&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;key&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;comment&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;comment&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Page&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;commentsPromise&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// When `use` suspends in Comments,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// this Suspense boundary will be shown.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;fallback&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Loading...&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Comments&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;commentsPromise&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;commentsPromise&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;use-does-not-support-promises-created-in-render&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt; does not support promises created in render. &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#use-does-not-support-promises-created-in-render&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you try to pass a promise created in render to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt;, React will warn:&lt;/p&gt;&lt;div class=&quot;console-block mb-4 text-secondary bg-wash dark:bg-wash-dark rounded-lg&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;flex w-full rounded-t-lg bg-gray-200 dark:bg-gray-80&quot;&gt;&lt;div class=&quot;px-4 py-2 border-gray-300 dark:border-gray-90 border-r&quot;&gt;&lt;div class=&quot;bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:15px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex text-sm px-4&quot;&gt;&lt;div class=&quot;border-b-2 border-gray-300 dark:border-gray-90 text-tertiary dark:text-tertiary-dark&quot;&gt;Console&lt;/div&gt;&lt;div class=&quot;px-4 py-2 flex&quot;&gt;&lt;div class=&quot;me-2 bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;me-2 hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 divide-y divide-gray-300 dark:divide-gray-70 text-base&quot;&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;A component was suspended by an uncached promise. Creating promises inside a Client Component or hook is not yet supported, except via a Suspense-compatible library or framework.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To fix, you need to pass a promise from a Suspense powered library or framework that supports caching for promises. In the future we plan to ship features to make it easier to cache promises in render.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can also read context with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt;, allowing you to read Context conditionally such as after early returns:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ThemeContext&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;./ThemeContext&#39;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Heading&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;children&lt;/span&gt; == &lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// This would not work with useContext&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// because of the early return.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;theme&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ThemeContext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;style&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;theme&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt; API can only be called in render, similar to hooks. Unlike hooks, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt; can be called conditionally. In the future we plan to support more ways to consume resources in render with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more information, see the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/use&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;new-react-dom-static-apis&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New React DOM Static APIs &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#new-react-dom-static-apis&quot; aria-label=&quot;Link for New React DOM Static APIs &quot; title=&quot;Link for New React DOM Static APIs &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve added two new APIs to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom/static&lt;/code&gt; for static site generation:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/static/prerender&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;prerender&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/static/prerenderToNodeStream&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;prerenderToNodeStream&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;These new APIs improve on &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToString&lt;/code&gt; by waiting for data to load for static HTML generation. They are designed to work with streaming environments like Node.js Streams and Web Streams. For example, in a Web Stream environment, you can prerender a React tree to static HTML with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;prerender&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;prerender&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom/static&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;prelude&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; = &lt;span class=&quot;sp-syntax-keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;prerender&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-property&quot;&gt;bootstrapScripts&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;/main.js&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;prelude&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;content-type&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;text/html&#39;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Prerender APIs will wait for all data to load before returning the static HTML stream. Streams can be converted to strings, or sent with a streaming response. They do not support streaming content as it loads, which is supported by the existing &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/server&quot;&gt;React DOM server rendering APIs&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more information, see &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/static&quot;&gt;React DOM Static APIs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;react-server-components&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Server Components &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#react-server-components&quot; aria-label=&quot;Link for React Server Components &quot; title=&quot;Link for React Server Components &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;server-components&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Server Components &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#server-components&quot; aria-label=&quot;Link for Server Components &quot; title=&quot;Link for Server Components &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Server Components are a new option that allows rendering components ahead of time, before bundling, in an environment separate from your client application or SSR server. This separate environment is the “server” in React Server Components. Server Components can run once at build time on your CI server, or they can be run for each request using a web server.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 19 includes all of the React Server Components features included from the Canary channel. This means libraries that ship with Server Components can now target React 19 as a peer dependency with a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-server&lt;/code&gt; &lt;a href=&quot;https://github.com/reactjs/rfcs/blob/main/text/0227-server-module-conventions.md#react-server-conditional-exports&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;export condition&lt;/a&gt; for use in frameworks that support the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/creating-a-react-app#which-features-make-up-the-react-teams-full-stack-architecture-vision&quot;&gt;Full-stack React Architecture&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;how-do-i-build-support-for-server-components&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;How do I build support for Server Components? &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#how-do-i-build-support-for-server-components&quot; aria-label=&quot;Link for How do I build support for Server Components? &quot; title=&quot;Link for How do I build support for Server Components? &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;While React Server Components in React 19 are stable and will not break between minor versions, the underlying APIs used to implement a React Server Components bundler or framework do not follow semver and may break between minors in React 19.x.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To support React Server Components as a bundler or framework, we recommend pinning to a specific React version, or using the Canary release. We will continue working with bundlers and frameworks to stabilize the APIs used to implement React Server Components in the future.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more, see the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rsc/server-components&quot;&gt;React Server Components&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;server-actions&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Server Actions &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#server-actions&quot; aria-label=&quot;Link for Server Actions &quot; title=&quot;Link for Server Actions &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Server Actions allow Client Components to call async functions executed on the server.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When a Server Action is defined with the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;use server&quot;&lt;/code&gt; directive, your framework will automatically create a reference to the server function, and pass that reference to the Client Component. When that function is called on the client, React will send a request to the server to execute the function, and return the result.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;there-is-no-directive-for-server-components&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;There is no directive for Server Components. &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#there-is-no-directive-for-server-components&quot; aria-label=&quot;Link for There is no directive for Server Components. &quot; title=&quot;Link for There is no directive for Server Components. &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;A common misunderstanding is that Server Components are denoted by &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;use server&quot;&lt;/code&gt;, but there is no directive for Server Components. The &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;use server&quot;&lt;/code&gt; directive is used for Server Actions.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more info, see the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rsc/directives&quot;&gt;Directives&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Server Actions can be created in Server Components and passed as props to Client Components, or they can be imported and used in Client Components.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more, see the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rsc/server-actions&quot;&gt;React Server Actions&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;improvements-in-react-19&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Improvements in React 19 &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#improvements-in-react-19&quot; aria-label=&quot;Link for Improvements in React 19 &quot; title=&quot;Link for Improvements in React 19 &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;ref-as-a-prop&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt; as a prop &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#ref-as-a-prop&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Starting in React 19, you can now access &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt; as a prop for function components:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;MyInput&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;placeholder&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;ref&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;//...&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;MyInput&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;ref&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;New function components will no longer need &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;forwardRef&lt;/code&gt;, and we will be publishing a codemod to automatically update your components to use the new &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt; prop. In future versions we will deprecate and remove &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;forwardRef&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt;s passed to classes are not passed as props since they reference the component instance.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;diffs-for-hydration-errors&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Diffs for hydration errors &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#diffs-for-hydration-errors&quot; aria-label=&quot;Link for Diffs for hydration errors &quot; title=&quot;Link for Diffs for hydration errors &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We also improved error reporting for hydration errors in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;. For example, instead of logging multiple errors in DEV without any information about the mismatch:&lt;/p&gt;
&lt;div class=&quot;console-block mb-4 text-secondary bg-wash dark:bg-wash-dark rounded-lg&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;flex w-full rounded-t-lg bg-gray-200 dark:bg-gray-80&quot;&gt;&lt;div class=&quot;px-4 py-2 border-gray-300 dark:border-gray-90 border-r&quot;&gt;&lt;div class=&quot;bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:15px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex text-sm px-4&quot;&gt;&lt;div class=&quot;border-b-2 border-gray-300 dark:border-gray-90 text-tertiary dark:text-tertiary-dark&quot;&gt;Console&lt;/div&gt;&lt;div class=&quot;px-4 py-2 flex&quot;&gt;&lt;div class=&quot;me-2 bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;me-2 hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 divide-y divide-gray-300 dark:divide-gray-70 text-base&quot;&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;Warning: Text content did not match. Server: “Server” Client: “Client”
&lt;!-- --&gt;  &lt;!-- --&gt;at span
&lt;!-- --&gt;  &lt;!-- --&gt;at App&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;Warning: An error occurred during hydration. The server HTML was replaced with client content in &amp;lt;div&amp;gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;Warning: Text content did not match. Server: “Server” Client: “Client”
&lt;!-- --&gt;  &lt;!-- --&gt;at span
&lt;!-- --&gt;  &lt;!-- --&gt;at App&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;Warning: An error occurred during hydration. The server HTML was replaced with client content in &amp;lt;div&amp;gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;Uncaught Error: Text content does not match server-rendered HTML.
&lt;!-- --&gt;  &lt;!-- --&gt;at checkForUnmatchedText
&lt;!-- --&gt;  &lt;!-- --&gt;…&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We now log a single message with a diff of the mismatch:&lt;/p&gt;
&lt;div class=&quot;console-block mb-4 text-secondary bg-wash dark:bg-wash-dark rounded-lg&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;flex w-full rounded-t-lg bg-gray-200 dark:bg-gray-80&quot;&gt;&lt;div class=&quot;px-4 py-2 border-gray-300 dark:border-gray-90 border-r&quot;&gt;&lt;div class=&quot;bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:15px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex text-sm px-4&quot;&gt;&lt;div class=&quot;border-b-2 border-gray-300 dark:border-gray-90 text-tertiary dark:text-tertiary-dark&quot;&gt;Console&lt;/div&gt;&lt;div class=&quot;px-4 py-2 flex&quot;&gt;&lt;div class=&quot;me-2 bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;me-2 hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 divide-y divide-gray-300 dark:divide-gray-70 text-base&quot;&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;Uncaught Error: Hydration failed because the server rendered HTML didn’t match the client. As a result this tree will be regenerated on the client. This can happen if an SSR-ed Client Component used:&lt;!-- --&gt;
&lt;!-- --&gt;
- A server/client branch &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;if (typeof window !== &#39;undefined&#39;)&lt;/code&gt;.
- Variable input such as &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;Date.now()&lt;/code&gt; or &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;Math.random()&lt;/code&gt; which changes each time it’s called.
- Date formatting in a user’s locale which doesn’t match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.&lt;!-- --&gt;
&lt;!-- --&gt;
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;a href=&quot;https://react.dev/link/hydration-mismatch&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;https://react.dev/link/hydration-mismatch&lt;/a&gt; &lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;  &lt;!-- --&gt;&amp;lt;App&amp;gt;
&lt;!-- --&gt;    &lt;!-- --&gt;&amp;lt;span&amp;gt;
&lt;!-- --&gt;+    &lt;!-- --&gt;Client
&lt;!-- --&gt;-    &lt;!-- --&gt;Server&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;  &lt;!-- --&gt;at throwOnHydrationMismatch
&lt;!-- --&gt;  &lt;!-- --&gt;…&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;context-as-a-provider&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Context&amp;gt;&lt;/code&gt; as a provider &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#context-as-a-provider&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, you can render &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Context&amp;gt;&lt;/code&gt; as a provider instead of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Context.Provider&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ThemeContext&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createContext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ThemeContext&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;dark&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ThemeContext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;New Context providers can use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Context&amp;gt;&lt;/code&gt; and we will be publishing a codemod to convert existing providers. In future versions we will deprecate &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Context.Provider&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;cleanup-functions-for-refs&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Cleanup functions for refs &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#cleanup-functions-for-refs&quot; aria-label=&quot;Link for Cleanup functions for refs &quot; title=&quot;Link for Cleanup functions for refs &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We now support returning a cleanup function from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt; callbacks:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;ref&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;// ref created&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;// NEW: return a cleanup function to reset&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;// the ref when element is removed from DOM.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-comment&quot;&gt;// ref cleanup&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When the component unmounts, React will call the cleanup function returned from the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt; callback. This works for DOM refs, refs to class components, and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useImperativeHandle&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Previously, React would call &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt; functions with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;null&lt;/code&gt; when unmounting the component. If your &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt; returns a cleanup function, React will now skip this step.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In future versions, we will deprecate calling refs with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;null&lt;/code&gt; when unmounting components.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Due to the introduction of ref cleanup functions, returning anything else from a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt; callback will now be rejected by TypeScript. The fix is usually to stop using implicit returns, for example:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;ref&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;current&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;instance&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;current&lt;/span&gt;&lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;+ &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;ref&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;current&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-yellow-40 border-yellow-40 text-yellow-60 dark:text-yellow-30&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;instance&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;current&lt;/span&gt;&lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-yellow-40 border-yellow-40 text-yellow-60 dark:text-yellow-30&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The original code returned the instance of the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;HTMLDivElement&lt;/code&gt; and TypeScript wouldn’t know if this was &lt;em&gt;supposed&lt;/em&gt; to be a cleanup function or if you didn’t want to return a cleanup function.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can codemod this pattern with &lt;a href=&quot;https://github.com/eps1lon/types-react-codemod/#no-implicit-ref-callback-return&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;no-implicit-ref-callback-return&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;use-deferred-value-initial-value&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useDeferredValue&lt;/code&gt; initial value &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#use-deferred-value-initial-value&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve added an &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;initialValue&lt;/code&gt; option to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useDeferredValue&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Search&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;deferredValue&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// On initial render the value is &#39;&#39;.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Then a re-render is scheduled with the deferredValue.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;value&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useDeferredValue&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;deferredValue&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-yellow-40 border-yellow-40 text-yellow-60 dark:text-yellow-30&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Results&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;query&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When &lt;span data-step=&quot;2&quot; class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-[6px] py-[1.5px] border-b-[2px] border-opacity-60 bg-yellow-40 border-yellow-40 text-yellow-60 dark:text-yellow-30&quot;&gt;initialValue&lt;/span&gt; is provided, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useDeferredValue&lt;/code&gt; will return it as &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;value&lt;/code&gt; for the initial render of the component, and schedules a re-render in the background with the &lt;span data-step=&quot;1&quot; class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-[6px] py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;deferredValue&lt;/span&gt; returned.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more, see &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useDeferredValue&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useDeferredValue&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;support-for-metadata-tags&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Support for Document Metadata &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#support-for-metadata-tags&quot; aria-label=&quot;Link for Support for Document Metadata &quot; title=&quot;Link for Support for Document Metadata &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In HTML, document metadata tags like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;link&amp;gt;&lt;/code&gt;, and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; are reserved for placement in the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of the document. In React, the component that decides what metadata is appropriate for the app may be very far from the place where you render the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; or React does not render the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; at all. In the past, these elements would need to be inserted manually in an effect, or by libraries like &lt;a href=&quot;https://github.com/nfl/react-helmet&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-helmet&lt;/code&gt;&lt;/a&gt;, and required careful handling when server rendering a React application.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, we’re adding support for rendering document metadata tags in components natively:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;BlogPost&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;post&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;post&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;author&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;content&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;Josh&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;rel&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;author&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;href&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;https://twitter.com/joshcstory/&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;keywords&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;content&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;post&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;keywords&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        Eee equals em-see-squared...&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When React renders this component, it will see the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;title&amp;gt;&lt;/code&gt; &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;link&amp;gt;&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags, and automatically hoist them to the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of document. By supporting these metadata tags natively, we’re able to ensure they work with client-only apps, streaming SSR, and Server Components.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;you-may-still-want-a-metadata-library&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;You may still want a Metadata library &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#you-may-still-want-a-metadata-library&quot; aria-label=&quot;Link for You may still want a Metadata library &quot; title=&quot;Link for You may still want a Metadata library &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For simple use cases, rendering Document Metadata as tags may be suitable, but libraries can offer more powerful features like overriding generic metadata with specific metadata based on the current route. These features make it easier for frameworks and libraries like &lt;a href=&quot;https://github.com/nfl/react-helmet&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-helmet&lt;/code&gt;&lt;/a&gt; to support metadata tags, rather than replace them.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more info, see the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/title&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;title&amp;gt;&lt;/code&gt;&lt;/a&gt;, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/link&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;link&amp;gt;&lt;/code&gt;&lt;/a&gt;, and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/meta&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;support-for-stylesheets&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Support for stylesheets &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#support-for-stylesheets&quot; aria-label=&quot;Link for Support for stylesheets &quot; title=&quot;Link for Support for stylesheets &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Stylesheets, both externally linked (&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;...&quot;&amp;gt;&lt;/code&gt;) and inline (&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;style&amp;gt;...&amp;lt;/style&amp;gt;&lt;/code&gt;), require careful positioning in the DOM due to style precedence rules. Building a stylesheet capability that allows for composability within components is hard, so users often end up either loading all of their styles far from the components that may depend on them, or they use a style library which encapsulates this complexity.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, we’re addressing this complexity and providing even deeper integration into Concurrent Rendering on the Client and Streaming Rendering on the Server with built in support for stylesheets. If you tell React the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;precedence&lt;/code&gt; of your stylesheet it will manage the insertion order of the stylesheet in the DOM and ensure that the stylesheet (if external) is loaded before revealing content that depends on those style rules.&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;ComponentOne&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;fallback&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;loading...&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;rel&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;href&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;foo&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;precedence&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;default&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;rel&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;href&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;bar&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;precedence&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;high&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;foo-class bar-class&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;...&lt;/span&gt;}&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;ComponentTwo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;...&lt;/span&gt;}&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;rel&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;href&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;baz&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;precedence&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;default&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;-- will be inserted between foo &amp;amp; bar&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  )&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;}&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;During Server Side Rendering React will include the stylesheet in the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, which ensures that the browser will not paint until it has loaded. If the stylesheet is discovered late after we’ve already started streaming, React will ensure that the stylesheet is inserted into the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; on the client before revealing the content of a Suspense boundary that depends on that stylesheet.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;During Client Side Rendering React will wait for newly rendered stylesheets to load before committing the render. If you render this component from multiple places within your application React will only include the stylesheet once in the document:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ComponentOne&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    ...&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;ComponentOne&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt; // won&#39;t lead to a duplicate stylesheet link in the DOM&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For users accustomed to loading stylesheets manually this is an opportunity to locate those stylesheets alongside the components that depend on them allowing for better local reasoning and an easier time ensuring you only load the stylesheets that you actually depend on.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Style libraries and style integrations with bundlers can also adopt this new capability so even if you don’t directly render your own stylesheets, you can still benefit as your tools are upgraded to use this feature.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more details, read the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/link&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;link&amp;gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/style&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;style&amp;gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;support-for-async-scripts&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Support for async scripts &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#support-for-async-scripts&quot; aria-label=&quot;Link for Support for async scripts &quot; title=&quot;Link for Support for async scripts &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In HTML normal scripts (&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;script src=&quot;...&quot;&amp;gt;&lt;/code&gt;) and deferred scripts (&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;script defer=&quot;&quot; src=&quot;...&quot;&amp;gt;&lt;/code&gt;) load in document order which makes rendering these kinds of scripts deep within your component tree challenging. Async scripts (&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;script async=&quot;&quot; src=&quot;...&quot;&amp;gt;&lt;/code&gt;) however will load in arbitrary order.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19 we’ve included better support for async scripts by allowing you to render them anywhere in your component tree, inside the components that actually depend on the script, without having to manage relocating and deduplicating script instances.&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;script&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;async&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;src&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;...&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      Hello World&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      ...&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt; // won&#39;t lead to duplicate script in the DOM&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;}&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In all rendering environments, async scripts will be deduplicated so that React will only load and execute the script once even if it is rendered by multiple different components.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In Server Side Rendering, async scripts will be included in the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; and prioritized behind more critical resources that block paint such as stylesheets, fonts, and image preloads.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more details, read the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/script&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;script&amp;gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;support-for-preloading-resources&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Support for preloading resources &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#support-for-preloading-resources&quot; aria-label=&quot;Link for Support for preloading resources &quot; title=&quot;Link for Support for preloading resources &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;During initial document load and on client side updates, telling the Browser about resources that it will likely need to load as early as possible can have a dramatic effect on page performance.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 19 includes a number of new APIs for loading and preloading Browser resources to make it as easy as possible to build great experiences that aren’t held back by inefficient resource loading.&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;prefetchDNS&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;preconnect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;preload&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;preinit&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom&#39;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;preinit&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;https://.../path/to/some/script.js&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;script&#39;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-comment&quot;&gt;// loads and executes this script eagerly&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;preload&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;https://.../path/to/font.woff&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;font&#39;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-comment&quot;&gt;// preloads this font&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;preload&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;https://.../path/to/stylesheet.css&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;style&#39;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-comment&quot;&gt;// preloads this stylesheet&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;prefetchDNS&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;https://...&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-comment&quot;&gt;// when you may not actually request anything from this host&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;preconnect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;https://...&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-comment&quot;&gt;// when you will request something but aren&#39;t sure what&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;&amp;lt;!-- the above would result in the following DOM/HTML --&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;&amp;lt;!-- links/scripts are prioritized by their utility to early loading, not call order --&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;rel&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;prefetch-dns&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;href&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;https://...&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;rel&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;preconnect&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;href&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;https://...&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;rel&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;preload&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;as&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;font&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;href&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;https://.../path/to/font.woff&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;rel&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;preload&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;as&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;style&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;href&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;https://.../path/to/stylesheet.css&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;script&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;async&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;src&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;https://.../path/to/some/script.js&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    ...&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;These APIs can be used to optimize initial page loads by moving discovery of additional resources like fonts out of stylesheet loading. They can also make client updates faster by prefetching a list of resources used by an anticipated navigation and then eagerly preloading those resources on click or even on hover.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more details see &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom#resource-preloading-apis&quot;&gt;Resource Preloading APIs&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;compatibility-with-third-party-scripts-and-extensions&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Compatibility with third-party scripts and extensions &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#compatibility-with-third-party-scripts-and-extensions&quot; aria-label=&quot;Link for Compatibility with third-party scripts and extensions &quot; title=&quot;Link for Compatibility with third-party scripts and extensions &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve improved hydration to account for third-party scripts and browser extensions.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When hydrating, if an element that renders on the client doesn’t match the element found in the HTML from the server, React will force a client re-render to fix up the content. Previously, if an element was inserted by third-party scripts or browser extensions, it would trigger a mismatch error and client render.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, unexpected tags in the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;body&amp;gt;&lt;/code&gt; will be skipped over, avoiding the mismatch errors. If React needs to re-render the entire document due to an unrelated hydration mismatch, it will leave in place stylesheets inserted by third-party scripts and browser extensions.&lt;/p&gt;
&lt;h3 id=&quot;error-handling&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Better error reporting &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#error-handling&quot; aria-label=&quot;Link for Better error reporting &quot; title=&quot;Link for Better error reporting &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We improved error handling in React 19 to remove duplication and provide options for handling caught and uncaught errors. For example, when there’s an error in render caught by an Error Boundary, previously React would throw the error twice (once for the original error, then again after failing to automatically recover), and then call &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;console.error&lt;/code&gt; with info about where the error occurred.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This resulted in three errors for every caught error:&lt;/p&gt;
&lt;div class=&quot;console-block mb-4 text-secondary bg-wash dark:bg-wash-dark rounded-lg&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;flex w-full rounded-t-lg bg-gray-200 dark:bg-gray-80&quot;&gt;&lt;div class=&quot;px-4 py-2 border-gray-300 dark:border-gray-90 border-r&quot;&gt;&lt;div class=&quot;bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:15px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex text-sm px-4&quot;&gt;&lt;div class=&quot;border-b-2 border-gray-300 dark:border-gray-90 text-tertiary dark:text-tertiary-dark&quot;&gt;Console&lt;/div&gt;&lt;div class=&quot;px-4 py-2 flex&quot;&gt;&lt;div class=&quot;me-2 bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;me-2 hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 divide-y divide-gray-300 dark:divide-gray-70 text-base&quot;&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;Uncaught Error: hit
&lt;!-- --&gt;  &lt;!-- --&gt;at Throws
&lt;!-- --&gt;  &lt;!-- --&gt;at renderWithHooks
&lt;!-- --&gt;  &lt;!-- --&gt;…&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;Uncaught Error: hit&lt;span class=&quot;ms-2 text-gray-30&quot;&gt;    &amp;lt;--&lt;!-- --&gt; Duplicate&lt;/span&gt;
&lt;!-- --&gt;  &lt;!-- --&gt;at Throws
&lt;!-- --&gt;  &lt;!-- --&gt;at renderWithHooks
&lt;!-- --&gt;  &lt;!-- --&gt;…&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;The above error occurred in the Throws component:
&lt;!-- --&gt;  &lt;!-- --&gt;at Throws
&lt;!-- --&gt;  &lt;!-- --&gt;at ErrorBoundary
&lt;!-- --&gt;  &lt;!-- --&gt;at App&lt;!-- --&gt;
&lt;!-- --&gt;
React will try to recreate this component tree from scratch using the error boundary you provided, ErrorBoundary.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, we log a single error with all the error information included:&lt;/p&gt;
&lt;div class=&quot;console-block mb-4 text-secondary bg-wash dark:bg-wash-dark rounded-lg&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;flex w-full rounded-t-lg bg-gray-200 dark:bg-gray-80&quot;&gt;&lt;div class=&quot;px-4 py-2 border-gray-300 dark:border-gray-90 border-r&quot;&gt;&lt;div class=&quot;bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:15px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex text-sm px-4&quot;&gt;&lt;div class=&quot;border-b-2 border-gray-300 dark:border-gray-90 text-tertiary dark:text-tertiary-dark&quot;&gt;Console&lt;/div&gt;&lt;div class=&quot;px-4 py-2 flex&quot;&gt;&lt;div class=&quot;me-2 bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;me-2 hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 divide-y divide-gray-300 dark:divide-gray-70 text-base&quot;&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;Error: hit
&lt;!-- --&gt;  &lt;!-- --&gt;at Throws
&lt;!-- --&gt;  &lt;!-- --&gt;at renderWithHooks
&lt;!-- --&gt;  &lt;!-- --&gt;…&lt;!-- --&gt;
&lt;!-- --&gt;
The above error occurred in the Throws component:
&lt;!-- --&gt;  &lt;!-- --&gt;at Throws
&lt;!-- --&gt;  &lt;!-- --&gt;at ErrorBoundary
&lt;!-- --&gt;  &lt;!-- --&gt;at App&lt;!-- --&gt;
&lt;!-- --&gt;
React will try to recreate this component tree from scratch using the error boundary you provided, ErrorBoundary.
&lt;!-- --&gt;  &lt;!-- --&gt;at ErrorBoundary
&lt;!-- --&gt;  &lt;!-- --&gt;at App&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Additionally, we’ve added two new root options to complement &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;onRecoverableError&lt;/code&gt;:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;onCaughtError&lt;/code&gt;: called when React catches an error in an Error Boundary.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;onUncaughtError&lt;/code&gt;: called when an error is thrown and not caught by an Error Boundary.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;onRecoverableError&lt;/code&gt;: called when an error is thrown and automatically recovered.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more info and examples, see the docs for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/client/createRoot&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createRoot&lt;/code&gt;&lt;/a&gt; and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/client/hydrateRoot&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hydrateRoot&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;support-for-custom-elements&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Support for Custom Elements &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#support-for-custom-elements&quot; aria-label=&quot;Link for Support for Custom Elements &quot; title=&quot;Link for Support for Custom Elements &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 19 adds full support for custom elements and passes all tests on &lt;a href=&quot;https://custom-elements-everywhere.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Custom Elements Everywhere&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In past versions, using Custom Elements in React has been difficult because React treated unrecognized props as attributes rather than properties. In React 19, we’ve added support for properties that works on the client and during SSR with the following strategy:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Server Side Rendering&lt;/strong&gt;: props passed to a custom element will render as attributes if their type is a primitive value like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;string&lt;/code&gt;, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;number&lt;/code&gt;, or the value is &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;true&lt;/code&gt;. Props with non-primitive types like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;object&lt;/code&gt;, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;symbol&lt;/code&gt;, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;function&lt;/code&gt;, or value &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;false&lt;/code&gt; will be omitted.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Client Side Rendering&lt;/strong&gt;: props that match a property on the Custom Element instance will be assigned as properties, otherwise they will be assigned as attributes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks to &lt;a href=&quot;https://github.com/josepharhar&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joey Arhar&lt;/a&gt; for driving the design and implementation of Custom Element support in React.&lt;/p&gt;
&lt;h4 id=&quot;how-to-upgrade&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;How to upgrade &lt;a href=&quot;https://react.dev/blog/2024/12/05/react-19#how-to-upgrade&quot; aria-label=&quot;Link for How to upgrade &quot; title=&quot;Link for How to upgrade &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide&quot;&gt;React 19 Upgrade Guide&lt;/a&gt; for step-by-step instructions and a full list of breaking and notable changes.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;Note: this post was originally published 04/25/2024 and has been updated to 12/05/2024 with the stable release.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2025/02/14/sunsetting-create-react-app&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;Sunsetting Create React App&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Compiler Beta Release and Roadmap&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2024/12/05/react-19</link><guid isPermaLink="false">https://react.dev/blog/2024/12/05/react-19</guid><pubDate>Wed, 04 Dec 2024 16:00:00 GMT</pubDate></item><item><title>React Compiler Beta Release</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;October 21, 2024 by &lt;a href=&quot;https://twitter.com/potetotes&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lauren Tan&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h3 id=&quot;react-compiler-is-now-in-rc&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Compiler is now stable! &lt;a href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#react-compiler-is-now-in-rc&quot; aria-label=&quot;Link for React Compiler is now stable! &quot; title=&quot;Link for React Compiler is now stable! &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Please see the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1&quot;&gt;stable release blog post&lt;/a&gt; for details.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The React team is excited to share new updates:&lt;/p&gt;&lt;/div&gt;
&lt;ol class=&quot;ms-6 my-3 list-decimal&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;We’re publishing React Compiler Beta today, so that early adopters and library maintainers can try it and provide feedback.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;We’re officially supporting React Compiler for apps on React 17+, through an optional &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-compiler-runtime&lt;/code&gt; package.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;We’re opening up public membership of the &lt;a href=&quot;https://github.com/reactwg/react-compiler&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Compiler Working Group&lt;/a&gt; to prepare the community for gradual adoption of the compiler.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;At &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/05/22/react-conf-2024-recap&quot;&gt;React Conf 2024&lt;/a&gt;, we announced the experimental release of React Compiler, a build-time tool that optimizes your React app through automatic memoization. &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler&quot;&gt;You can find an introduction to React Compiler here&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Since the first release, we’ve fixed numerous bugs reported by the React community, received several high quality bug fixes and contributions&lt;sup&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;true&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; to the compiler, made the compiler more resilient to the broad diversity of JavaScript patterns, and have continued to roll out the compiler more widely at Meta.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In this post, we want to share what’s next for React Compiler.&lt;/p&gt;
&lt;h2 id=&quot;try-react-compiler-beta-today&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Try React Compiler Beta today &lt;a href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#try-react-compiler-beta-today&quot; aria-label=&quot;Link for Try React Compiler Beta today &quot; title=&quot;Link for Try React Compiler Beta today &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;At &lt;a href=&quot;https://www.youtube.com/watch?v=qd5yk2gxbtg&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React India 2024&lt;/a&gt;, we shared an update on React Compiler. Today, we are excited to announce a new Beta release of React Compiler and ESLint plugin. New betas are published to npm using the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;@beta&lt;/code&gt; tag.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To install React Compiler Beta:&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;npm install -D babel-plugin-react-compiler@beta eslint-plugin-react-compiler@beta&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Or, if you’re using Yarn:&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;yarn add -D babel-plugin-react-compiler@beta eslint-plugin-react-compiler@beta&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can watch &lt;a href=&quot;https://twitter.com/_gsathya&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sathya Gunasekaran’s&lt;/a&gt; talk at React India here:&lt;/p&gt;
&lt;div class=&quot;relative h-0 overflow-hidden pt-[56.25%]&quot;&gt;&lt;iframe class=&quot;absolute inset-0 w-full h-full&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; title=&quot;YouTube video player&quot; src=&quot;https://www.youtube.com/embed/qd5yk2gxbtg&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id=&quot;we-recommend-everyone-use-the-react-compiler-linter-today&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;We recommend everyone use the React Compiler linter today &lt;a href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#we-recommend-everyone-use-the-react-compiler-linter-today&quot; aria-label=&quot;Link for We recommend everyone use the React Compiler linter today &quot; title=&quot;Link for We recommend everyone use the React Compiler linter today &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Compiler’s ESLint plugin helps developers proactively identify and correct &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rules&quot;&gt;Rules of React&lt;/a&gt; violations. &lt;strong class=&quot;font-bold&quot;&gt;We strongly recommend everyone use the linter today&lt;/strong&gt;. The linter does not require that you have the compiler installed, so you can use it independently, even if you are not ready to try out the compiler.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To install the linter only:&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;npm install -D eslint-plugin-react-compiler@beta&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Or, if you’re using Yarn:&lt;/p&gt;
&lt;div class=&quot;rounded-lg bg-secondary dark:bg-gray-50 h-full&quot;&gt;&lt;div class=&quot;bg-gray-90 dark:bg-gray-60 w-full rounded-t-lg&quot;&gt;&lt;div class=&quot;text-primary-dark dark:text-primary-dark flex text-sm px-4 py-0.5 relative justify-between&quot;&gt;&lt;div&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.40299 2.61279H14.403C14.5798 2.61279 14.7494 2.68303 14.8744 2.80806C14.9994 2.93308 15.0697 3.10265 15.0697 3.27946V13.9461C15.0697 14.1229 14.9994 14.2925 14.8744 14.4175C14.7494 14.5426 14.5798 14.6128 14.403 14.6128H2.40299C2.22618 14.6128 2.05661 14.5426 1.93159 14.4175C1.80657 14.2925 1.73633 14.1229 1.73633 13.9461V3.27946C1.73633 3.10265 1.80657 2.93308 1.93159 2.80806C2.05661 2.68303 2.22618 2.61279 2.40299 2.61279ZM8.403 10.6128V11.9461H12.403V10.6128H8.403ZM6.01233 8.61279L4.12699 10.4981L5.06966 11.4415L7.89833 8.61279L5.06966 5.78413L4.12699 6.72746L6.01233 8.61279Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Terminal&lt;/div&gt;&lt;div&gt;&lt;button class=&quot;w-full text-start text-primary-dark dark:text-primary-dark &quot;&gt;&lt;svg class=&quot;inline-flex me-2 self-center&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 18 18&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M5.40382 15.3671C5.03332 15.1901 4.70081 14.9381 4.42481 14.6286C4.34831 14.5431 4.23931 14.5001 4.12981 14.5206L3.66181 14.6081C3.33531 14.6691 3.02032 14.4361 2.96232 14.0876L1.30981 4.12512C1.28181 3.95662 1.31731 3.7861 1.40981 3.6456C1.50231 3.5051 1.64082 3.41162 1.79932 3.38162L3.22131 3.00012C3.37681 2.97062 3.48981 2.82761 3.48981 2.65961V1.9101C3.48981 1.8276 3.49381 1.74561 3.49931 1.66461C3.50931 1.53461 3.35181 1.57211 3.35181 1.57211L1.64381 2.0076C1.18481 2.0936 0.751316 2.32662 0.451316 2.70612C0.0808162 3.17362 -0.0686885 3.77259 0.0293115 4.36459L1.68231 14.3281C1.84531 15.3081 2.65031 16.0001 3.55631 16.0001C3.66531 16.0001 3.77631 15.9896 3.88731 15.9691L5.36632 15.6916C5.52332 15.6626 5.54982 15.4366 5.40382 15.3671ZM14.9331 4.55801H12.9116C12.1351 4.55801 11.5001 3.91502 11.5001 3.12952V1.06802C11.5001 0.480524 11.0196 0 10.4321 0H7.44161C6.36911 0 5.50011 0.879508 5.50011 1.96451V12.1665C5.50011 13.179 6.33412 14 7.36262 14H14.1371C15.1661 14 16.0001 13.179 16.0001 12.1665V5.625C16.0001 5.038 15.5201 4.55801 14.9331 4.55801Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt; &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12.5888 0.0914385C12.4493 0.00843847 12.5158 0.252449 12.5158 0.252449C12.5653 0.428449 12.5918 0.613451 12.5918 0.804451V2.90296C12.5918 3.17646 12.8158 3.40046 13.0903 3.40046H15.1718C15.3883 3.40046 15.5968 3.43495 15.7918 3.49845C15.7918 3.49845 15.9373 3.50844 15.9008 3.43494C15.8383 3.33744 15.7673 3.24494 15.6833 3.16044L12.8303 0.289467C12.7558 0.214467 12.6743 0.149438 12.5888 0.0914385Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;px-8 pt-4 pb-6 text-primary-dark dark:text-primary-dark font-mono text-code whitespace-pre overflow-x-auto&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;code&gt;yarn add -D eslint-plugin-react-compiler@beta&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;After installation you can enable the linter by &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler/installation#eslint-integration&quot;&gt;adding it to your ESLint config&lt;/a&gt;. Using the linter helps identify Rules of React breakages, making it easier to adopt the compiler when it’s fully released.&lt;/p&gt;
&lt;h2 id=&quot;backwards-compatibility&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Backwards Compatibility &lt;a href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#backwards-compatibility&quot; aria-label=&quot;Link for Backwards Compatibility &quot; title=&quot;Link for Backwards Compatibility &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Compiler produces code that depends on runtime APIs added in React 19, but we’ve since added support for the compiler to also work with React 17 and 18. If you are not on React 19 yet, in the Beta release you can now try out React Compiler by specifying a minimum &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;target&lt;/code&gt; in your compiler config, and adding &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-compiler-runtime&lt;/code&gt; as a dependency. &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-compiler/configuration#react-17-18&quot;&gt;You can find docs on this here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;using-react-compiler-in-libraries&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Using React Compiler in libraries &lt;a href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#using-react-compiler-in-libraries&quot; aria-label=&quot;Link for Using React Compiler in libraries &quot; title=&quot;Link for Using React Compiler in libraries &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Our initial release was focused on identifying major issues with using the compiler in applications. We’ve gotten great feedback and have substantially improved the compiler since then. We’re now ready for broad feedback from the community, and for library authors to try out the compiler to improve performance and the developer experience of maintaining your library.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Compiler can also be used to compile libraries. Because React Compiler needs to run on the original source code prior to any code transformations, it is not possible for an application’s build pipeline to compile the libraries they use. Hence, our recommendation is for library maintainers to independently compile and test their libraries with the compiler, and ship compiled code to npm.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Because your code is pre-compiled, users of your library will not need to have the compiler enabled in order to benefit from the automatic memoization applied to your library. If your library targets apps not yet on React 19, specify a minimum &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;target&lt;/code&gt; and add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-compiler-runtime&lt;/code&gt; as a direct dependency. The runtime package will use the correct implementation of APIs depending on the application’s version, and polyfill the missing APIs if necessary.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-compiler/compiling-libraries&quot;&gt;You can find more docs on this here.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;opening-up-react-compiler-working-group-to-everyone&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Opening up React Compiler Working Group to everyone &lt;a href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#opening-up-react-compiler-working-group-to-everyone&quot; aria-label=&quot;Link for Opening up React Compiler Working Group to everyone &quot; title=&quot;Link for Opening up React Compiler Working Group to everyone &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We previously announced the invite-only &lt;a href=&quot;https://github.com/reactwg/react-compiler&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Compiler Working Group&lt;/a&gt; at React Conf to provide feedback, ask questions, and collaborate on the compiler’s experimental release.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;From today, together with the Beta release of React Compiler, we are opening up Working Group membership to everyone. The goal of the React Compiler Working Group is to prepare the ecosystem for a smooth, gradual adoption of React Compiler by existing applications and libraries. Please continue to file bug reports in the &lt;a href=&quot;https://github.com/react/react&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React repo&lt;/a&gt;, but please leave feedback, ask questions, or share ideas in the &lt;a href=&quot;https://github.com/reactwg/react-compiler/discussions&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Working Group discussion forum&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The core team will also use the discussions repo to share our research findings. As the Stable Release gets closer, any important information will also be posted on this forum.&lt;/p&gt;
&lt;h2 id=&quot;react-compiler-at-meta&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Compiler at Meta &lt;a href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#react-compiler-at-meta&quot; aria-label=&quot;Link for React Compiler at Meta &quot; title=&quot;Link for React Compiler at Meta &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;At &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/05/22/react-conf-2024-recap&quot;&gt;React Conf&lt;/a&gt;, we shared that our rollout of the compiler on Quest Store and Instagram were successful. Since then, we’ve deployed React Compiler across several more major web apps at Meta, including &lt;a href=&quot;https://www.facebook.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Facebook&lt;/a&gt; and &lt;a href=&quot;https://www.threads.net/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Threads&lt;/a&gt;. That means if you’ve used any of these apps recently, you may have had your experience powered by the compiler. We were able to onboard these apps onto the compiler with few code changes required, in a monorepo with more than 100,000 React components.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve seen notable performance improvements across all of these apps. As we’ve rolled out, we’re continuing to see results on the order of &lt;a href=&quot;https://youtu.be/lyEKhv8-3n0?t=3223&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;the wins we shared previously at ReactConf&lt;/a&gt;. These apps have already been heavily hand tuned and optimized by Meta engineers and React experts over the years, so even improvements on the order of a few percent are a huge win for us.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We also expected developer productivity wins from React Compiler. To measure this, we collaborated with our data science partners at Meta&lt;sup&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;true&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; to conduct a thorough statistical analysis of the impact of manual memoization on productivity. Before rolling out the compiler at Meta, we discovered that only about 8% of React pull requests used manual memoization and that these pull requests took 31-46% longer to author&lt;sup&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref=&quot;true&quot; aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;. This confirmed our intuition that manual memoization introduces cognitive overhead, and we anticipate that React Compiler will lead to more efficient code authoring and review. Notably, React Compiler also ensures that &lt;em&gt;all&lt;/em&gt; code is memoized by default, not just the (in our case) 8% where developers explicitly apply memoization.&lt;/p&gt;
&lt;h2 id=&quot;roadmap-to-stable&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Roadmap to Stable &lt;a href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#roadmap-to-stable&quot; aria-label=&quot;Link for Roadmap to Stable &quot; title=&quot;Link for Roadmap to Stable &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;This is not a final roadmap, and is subject to change.&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We intend to ship a Release Candidate of the compiler in the near future following the Beta release, when the majority of apps and libraries that follow the Rules of React have been proven to work well with the compiler. After a period of final feedback from the community, we plan on a Stable Release for the compiler. The Stable Release will mark the beginning of a new foundation for React, and all apps and libraries will be strongly recommended to use the compiler and ESLint plugin.&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;✅ Experimental: Released at React Conf 2024, primarily for feedback from early adopters.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;✅ Public Beta: Available today, for feedback from the wider community.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;🚧 Release Candidate (RC): React Compiler works for the majority of rule-following apps and libraries without issue.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;🚧 General Availability: After final feedback period from the community.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;These releases also include the compiler’s ESLint plugin, which surfaces diagnostics statically analyzed by the compiler. We plan to combine the existing eslint-plugin-react-hooks plugin with the compiler’s ESLint plugin, so only one plugin needs to be installed.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Post-Stable, we plan to add more compiler optimizations and improvements. This includes both continual improvements to automatic memoization, and new optimizations altogether, with minimal to no change of product code. Upgrading to each new release of the compiler is aimed to be straightforward, and each upgrade will continue to improve performance and add better handling of diverse JavaScript and React patterns.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Throughout this process, we also plan to prototype an IDE extension for React. It is still very early in research, so we expect to be able to share more of our findings with you in a future React Labs blog post.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks to &lt;a href=&quot;https://twitter.com/_gsathya&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sathya Gunasekaran&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joe Savona&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ricky Hanlon&lt;/a&gt;, &lt;a href=&quot;https://github.com/alexmckenley&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Alex Taylor&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/someextent&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jason Bonta&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/Eli_White&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Eli White&lt;/a&gt; for reviewing and editing this post.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;section data-footnotes=&quot;true&quot; class=&quot;footnotes&quot;&gt;&lt;h2 id=&quot;footnote-label&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6 sr-only&quot;&gt;Footnotes&lt;a href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#footnote-label&quot; aria-label=&quot;Link for Footnotes&quot; title=&quot;Link for Footnotes&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol class=&quot;ms-6 my-3 list-decimal&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot; id=&quot;user-content-fn-1&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks &lt;a href=&quot;https://github.com/react/react/pulls?q=is%3Apr+author%3Anikeee&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@nikeee&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pulls?q=is%3Apr+author%3Ahenryqdineen&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@henryqdineen&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pulls?q=is%3Apr+author%3ATrickyPi&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@TrickyPi&lt;/a&gt;, and several others for their contributions to the compiler. &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal data-footnote-backref&quot; href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#user-content-fnref-1&quot; data-footnote-backref=&quot;true&quot; aria-label=&quot;Back to content&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot; id=&quot;user-content-fn-2&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks &lt;a href=&quot;https://www.linkedin.com/in/vaishaligarg09&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Vaishali Garg&lt;/a&gt; for leading this study on React Compiler at Meta, and for reviewing this post. &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal data-footnote-backref&quot; href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#user-content-fnref-2&quot; data-footnote-backref=&quot;true&quot; aria-label=&quot;Back to content&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot; id=&quot;user-content-fn-3&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;After controlling on author tenure, diff length/complexity, and other potential confounding factors. &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal data-footnote-backref&quot; href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release#user-content-fnref-3&quot; data-footnote-backref=&quot;true&quot; aria-label=&quot;Back to content&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React 19&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2024/05/22/react-conf-2024-recap&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Conf 2024 Recap&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2024/10/21/react-compiler-beta-release</link><guid isPermaLink="false">https://react.dev/blog/2024/10/21/react-compiler-beta-release</guid><pubDate>Sun, 20 Oct 2024 16:00:00 GMT</pubDate></item><item><title>React Conf 2024 Recap</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;May 22, 2024 by &lt;a href=&quot;https://twitter.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ricky Hanlon&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Last week we hosted React Conf 2024, a two-day conference in Henderson, Nevada where 700+ attendees gathered in-person to discuss the latest in UI engineering. This was our first in-person conference since 2019, and we were thrilled to be able to bring the community together again.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;At React Conf 2024, we announced the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19&quot;&gt;React 19 RC&lt;/a&gt;, the &lt;a href=&quot;https://github.com/reactwg/react-native-new-architecture/discussions/189&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Native New Architecture Beta&lt;/a&gt;, and an experimental release of the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler&quot;&gt;React Compiler&lt;/a&gt;. The community also took the stage to announce &lt;a href=&quot;https://remix.run/blog/merging-remix-and-react-router&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Router v7&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=20765s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Universal Server Components&lt;/a&gt; in Expo Router, React Server Components in &lt;a href=&quot;https://redwoodjs.com/blog/rsc-now-in-redwoodjs&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RedwoodJS&lt;/a&gt;, and much more.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The entire &lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;day 1&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;day 2&lt;/a&gt; streams are available online. In this post, we’ll summarize the talks and announcements from the event.&lt;/p&gt;
&lt;h2 id=&quot;day-1&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Day 1 &lt;a href=&quot;https://react.dev/blog/2024/05/22/react-conf-2024-recap#day-1&quot; aria-label=&quot;Link for Day 1 &quot; title=&quot;Link for Day 1 &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=973s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Watch the full day 1 stream here.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To kick off day 1, Meta CTO &lt;a href=&quot;https://www.threads.net/@boztank&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Andrew “Boz” Bosworth&lt;/a&gt; shared a welcome message followed by an introduction by &lt;a href=&quot;https://twitter.com/sethwebster&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Seth Webster&lt;/a&gt;, who manages the React Org at Meta, and our MC &lt;a href=&quot;https://twitter.com/_darkfadr&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ashley Narcisse&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the day 1 keynote, &lt;a href=&quot;https://twitter.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joe Savona&lt;/a&gt; shared our goals and vision for React to make it easy for anyone to build great user experiences. &lt;a href=&quot;https://twitter.com/potetotes&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lauren Tan&lt;/a&gt; followed with a State of React, where she shared that React was downloaded over 1 billion times in 2023, and that 37% of new developers learn to program with React. Finally, she highlighted the work of the React community to make React, React.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more, check out these talks from the community later in the conference:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=5542s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Vanilla React&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/ryanflorence&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ryan Florence&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=12728s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Rhythm &amp;amp; Blues&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/leeerob&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lee Robinson&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=26815s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RedwoodJS, now with React Server Components&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/selfteachme&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Amy Dutton&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=20765s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Introducing Universal React Server Components in Expo Router&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/Baconbrix&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Evan Bacon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Next in the keynote, &lt;a href=&quot;https://twitter.com/joshcstory&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Josh Story&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Andrew Clark&lt;/a&gt; shared new features coming in React 19, and announced the React 19 RC which is ready for testing in production. Check out all the features in the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19&quot;&gt;React 19 release post&lt;/a&gt;, and see these talks for deep dives on the new features:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=8880s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;What’s new in React 19&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/lydiahallie&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lydia Hallie&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=10112s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Unpacked: A Roadmap to React 19&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/samselikoff&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sam Selikoff&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=24916s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React 19 Deep Dive: Coordinating HTML&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/joshcstory&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Josh Story&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=25280s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Enhancing Forms with React Server Components&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/aurorascharff&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Aurora Walberg Scharff&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=18825s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React for Two Computers&lt;/a&gt; by &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=11256s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;And Now You Understand React Server Components&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/kentcdodds&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Kent C. Dodds&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Finally, we ended the keynote with &lt;a href=&quot;https://twitter.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joe Savona&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/_gsathya&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sathya Gunasekaran&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/zmofei&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mofei Zhang&lt;/a&gt; announcing that the React Compiler is now &lt;a href=&quot;https://github.com/react/react/pull/29061&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Open Source&lt;/a&gt;, and sharing an experimental version of the React Compiler to try out.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more information on using the Compiler and how it works, check out &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/react-compiler&quot;&gt;the docs&lt;/a&gt; and these talks:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=12020s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Forget About Memo&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/potetotes&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lauren Tan&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=9313s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Compiler Deep Dive&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/_gsathya&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sathya Gunasekaran&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/zmofei&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mofei Zhang&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Watch the full day 1 keynote here:&lt;/p&gt;
&lt;div class=&quot;relative h-0 overflow-hidden pt-[56.25%]&quot;&gt;&lt;iframe class=&quot;absolute inset-0 w-full h-full&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; title=&quot;YouTube video player&quot; src=&quot;https://www.youtube.com/embed/T8TZQ6k4SLE?t=973s&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id=&quot;day-2&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Day 2 &lt;a href=&quot;https://react.dev/blog/2024/05/22/react-conf-2024-recap#day-2&quot; aria-label=&quot;Link for Day 2 &quot; title=&quot;Link for Day 2 &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=1720s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Watch the full day 2 stream here.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To kick off day 2, &lt;a href=&quot;https://twitter.com/sethwebster&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Seth Webster&lt;/a&gt; shared a welcome message, followed by a Thank You from &lt;a href=&quot;https://x.com/Eli_White&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Eli White&lt;/a&gt; and an introduction by our Chief Vibes Officer &lt;a href=&quot;https://twitter.com/_darkfadr&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ashley Narcisse&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the day 2 keynote, &lt;a href=&quot;https://twitter.com/cortinico&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Nicola Corti&lt;/a&gt; shared the State of React Native, including 78 million downloads in 2023. He also highlighted apps using React Native including 2000+ screens used inside of Meta; the product details page in Facebook Marketplace, which is visited more than 2 billion times per day; and part of the Microsoft Windows Start Menu and some features in almost every Microsoft Office product across mobile and desktop.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Nicola also highlighted all the work the community does to support React Native including libraries, frameworks, and multiple platforms. For more, check out these talks from the community:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=5798s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Extending React Native beyond Mobile and Desktop Apps&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/chris_trag&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Chris Traganos&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/anisha_malde&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Anisha Malde&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=22525s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Spatial computing with React&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/thymikee&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Michał Pierzchała&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a href=&quot;https://twitter.com/cipolleschir&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Riccardo Cipolleschi&lt;/a&gt; continued the day 2 keynote by announcing that the React Native New Architecture is now in Beta and ready for apps to adopt in production. He shared new features and improvements in the new architecture, and shared the roadmap for the future of React Native. For more check out:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=26569s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Cross Platform React&lt;/a&gt; by &lt;a href=&quot;https://github.com/SlyCaptainFlint&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Olga Zinoveva&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/naman34&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Naman Goel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Next in the keynote, Nicola announced that we are now recommending starting with a framework like Expo for all new apps created with React Native. With the change, he also announced a new React Native homepage and new Getting Started docs. You can view the new Getting Started guide in the &lt;a href=&quot;https://reactnative.dev/docs/next/environment-setup&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Native docs&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Finally, to end the keynote, &lt;a href=&quot;https://twitter.com/kadikraman&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Kadi Kraman&lt;/a&gt; shared the latest features and improvements in Expo, and how to get started developing with React Native using Expo.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Watch the full day 2 keynote here:&lt;/p&gt;
&lt;div class=&quot;relative h-0 overflow-hidden pt-[56.25%]&quot;&gt;&lt;iframe class=&quot;absolute inset-0 w-full h-full&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; title=&quot;YouTube video player&quot; src=&quot;https://www.youtube.com/embed/0ckOUBiuxVY?t=1720s&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id=&quot;q-and-a&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Q&amp;amp;A &lt;a href=&quot;https://react.dev/blog/2024/05/22/react-conf-2024-recap#q-and-a&quot; aria-label=&quot;Link for Q&amp;amp;A &quot; title=&quot;Link for Q&amp;amp;A &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The React and React Native teams also ended each day with a Q&amp;amp;A session:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=27518s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Q&amp;amp;A&lt;/a&gt; hosted by &lt;a href=&quot;https://twitter.com/chantastic&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Michael Chan&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=27935s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Native Q&amp;amp;A&lt;/a&gt; hosted by &lt;a href=&quot;https://twitter.com/jamonholmgren&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jamon Holmgren&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;and-more&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;And more… &lt;a href=&quot;https://react.dev/blog/2024/05/22/react-conf-2024-recap#and-more&quot; aria-label=&quot;Link for And more… &quot; title=&quot;Link for And more… &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We also heard talks on accessibility, error reporting, css, and more:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=20655s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Demystifying accessibility in React apps&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/krambertech&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Kateryna Porshnieva&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=21696s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Pigment CSS, CSS in the server component age&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/olivtassinari&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Olivier Tassinari&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=24070s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Real-time React Server Components&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/threepointone&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sunil Pai&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=T8TZQ6k4SLE&amp;amp;t=25862s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Let’s break React Rules&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/c_isambert&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Charlotte Isambert&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0ckOUBiuxVY&amp;amp;t=19881s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Solve 100% of your errors&lt;/a&gt; by &lt;a href=&quot;https://github.com/ryan953&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ryan Albrecht&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;thank-you&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Thank you &lt;a href=&quot;https://react.dev/blog/2024/05/22/react-conf-2024-recap#thank-you&quot; aria-label=&quot;Link for Thank you &quot; title=&quot;Link for Thank you &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to all the staff, speakers, and participants who made React Conf 2024 possible. There are too many to list, but we want to thank a few in particular.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to &lt;a href=&quot;https://twitter.com/barbara_markie&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Barbara Markiewicz&lt;/a&gt;, the team at &lt;a href=&quot;https://www.callstack.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Callstack&lt;/a&gt;, and our React Team Developer Advocate &lt;a href=&quot;https://twitter.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt; for helping to plan the entire event; and to &lt;a href=&quot;https://zeroslopeevents.com/about&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sunny Leggett&lt;/a&gt; and everyone from &lt;a href=&quot;https://zeroslopeevents.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Zero Slope&lt;/a&gt; for helping to organize the event.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you &lt;a href=&quot;https://twitter.com/_darkfadr&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ashley Narcisse&lt;/a&gt; for being our MC and Chief Vibes Officer; and to &lt;a href=&quot;https://twitter.com/chantastic&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Michael Chan&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/jamonholmgren&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jamon Holmgren&lt;/a&gt; for hosting the Q&amp;amp;A sessions.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you &lt;a href=&quot;https://twitter.com/sethwebster&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Seth Webster&lt;/a&gt; and &lt;a href=&quot;https://x.com/Eli_White&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Eli White&lt;/a&gt; for welcoming us each day and providing direction on structure and content; and to &lt;a href=&quot;https://twitter.com/tomocchino&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Tom Occhino&lt;/a&gt; for joining us with a special message during the after-party.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you &lt;a href=&quot;https://www.youtube.com/watch?v=FxTZL2U-uKg&amp;amp;t=1263s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ricky Hanlon&lt;/a&gt; for providing detailed feedback on talks, working on slide designs, and generally filling in the gaps to sweat the details.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you &lt;a href=&quot;https://www.callstack.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Callstack&lt;/a&gt; for building the conference website; and to &lt;a href=&quot;https://twitter.com/kadikraman&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Kadi Kraman&lt;/a&gt; and the &lt;a href=&quot;https://expo.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Expo&lt;/a&gt; team for building the conference mobile app.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to all the sponsors who made the event possible: &lt;a href=&quot;https://remix.run/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Remix&lt;/a&gt;, &lt;a href=&quot;https://developer.amazon.com/apps-and-games?cmp=US_2024_05_3P_React-Conf-2024&amp;amp;ch=prtnr&amp;amp;chlast=prtnr&amp;amp;pub=ref&amp;amp;publast=ref&amp;amp;type=org&amp;amp;typelast=org&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Amazon&lt;/a&gt;, &lt;a href=&quot;https://mui.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;MUI&lt;/a&gt;, &lt;a href=&quot;https://sentry.io/for/react/?utm_source=sponsored-conf&amp;amp;utm_medium=sponsored-event&amp;amp;utm_campaign=frontend-fy25q2-evergreen&amp;amp;utm_content=logo-reactconf2024-learnmore&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sentry&lt;/a&gt;, &lt;a href=&quot;https://www.jobs.abbott/software&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Abbott&lt;/a&gt;, &lt;a href=&quot;https://expo.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Expo&lt;/a&gt;, &lt;a href=&quot;https://rwsdk.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RedwoodJS&lt;/a&gt;, and &lt;a href=&quot;https://vercel.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Vercel&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to the AV Team for the visuals, stage, and sound; and to the Westin Hotel for hosting us.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thank you to all the speakers who shared their knowledge and experiences with the community.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Finally, thank you to everyone who attended in person and online to show what makes React, React. React is more than a library, it is a community, and it was inspiring to see everyone come together to share and learn together.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See you next time!&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2024/10/21/react-compiler-beta-release&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Compiler Beta Release and Roadmap&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React 19 RC&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2024/05/22/react-conf-2024-recap</link><guid isPermaLink="false">https://react.dev/blog/2024/05/22/react-conf-2024-recap</guid><pubDate>Tue, 21 May 2024 16:00:00 GMT</pubDate></item><item><title>React 19 Upgrade Guide</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;April 25, 2024 by &lt;a href=&quot;https://twitter.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ricky Hanlon&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The improvements added to React 19 require some breaking changes, but we’ve worked to make the upgrade as smooth as possible, and we don’t expect the changes to impact most apps.&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;react-18-3&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;React 18.3 has also been published &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#react-18-3&quot; aria-label=&quot;Link for React 18.3 has also been published &quot; title=&quot;Link for React 18.3 has also been published &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To help make the upgrade to React 19 easier, we’ve published a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react@18.3&lt;/code&gt; release that is identical to 18.2 but adds warnings for deprecated APIs and other changes that are needed for React 19.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We recommend upgrading to React 18.3 first to help identify any issues before upgrading to React 19.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For a list of changes in 18.3 see the &lt;a href=&quot;https://github.com/react/react/blob/main/CHANGELOG.md#1830-april-25-2024&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Release Notes&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In this post, we will guide you through the steps for upgrading to React 19:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#installing&quot;&gt;Installing&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#codemods&quot;&gt;Codemods&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#breaking-changes&quot;&gt;Breaking changes&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#new-deprecations&quot;&gt;New deprecations&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#notable-changes&quot;&gt;Notable changes&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#typescript-changes&quot;&gt;TypeScript changes&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#changelog&quot;&gt;Changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you’d like to help us test React 19, follow the steps in this upgrade guide and &lt;a href=&quot;https://github.com/react/react/issues/new?assignees=&amp;amp;labels=React+19&amp;amp;projects=&amp;amp;template=19.md&amp;amp;title=%5BReact+19%5D&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;report any issues&lt;/a&gt; you encounter. For a list of new features added to React 19, see the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/12/05/react-19&quot;&gt;React 19 release post&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;installing&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Installing &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#installing&quot; aria-label=&quot;Link for Installing &quot; title=&quot;Link for Installing &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;new-jsx-transform-is-now-required&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;New JSX Transform is now required &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#new-jsx-transform-is-now-required&quot; aria-label=&quot;Link for New JSX Transform is now required &quot; title=&quot;Link for New JSX Transform is now required &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We introduced a &lt;a href=&quot;https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;new JSX transform&lt;/a&gt; in 2020 to improve bundle size and use JSX without importing React. In React 19, we’re adding additional improvements like using ref as a prop and JSX speed improvements that require the new transform.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If the new transform is not enabled, you will see this warning:&lt;/p&gt;&lt;div class=&quot;console-block mb-4 text-secondary bg-wash dark:bg-wash-dark rounded-lg&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;flex w-full rounded-t-lg bg-gray-200 dark:bg-gray-80&quot;&gt;&lt;div class=&quot;px-4 py-2 border-gray-300 dark:border-gray-90 border-r&quot;&gt;&lt;div class=&quot;bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:15px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex text-sm px-4&quot;&gt;&lt;div class=&quot;border-b-2 border-gray-300 dark:border-gray-90 text-tertiary dark:text-tertiary-dark&quot;&gt;Console&lt;/div&gt;&lt;div class=&quot;px-4 py-2 flex&quot;&gt;&lt;div class=&quot;me-2 bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;me-2 hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 divide-y divide-gray-300 dark:divide-gray-70 text-base&quot;&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;Your app (or one of its dependencies) is using an outdated JSX transform. Update to the modern JSX transform for faster performance: &lt;a href=&quot;https://react.dev/link/new-jsx-transform&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;https://react.dev/link/new-jsx-transform&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We expect most apps will not be affected since the transform is enabled in most environments already. For manual instructions on how to upgrade, please see the &lt;a href=&quot;https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;announcement post&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To install the latest version of React and React DOM:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install&lt;/span&gt; --&lt;span class=&quot;sp-syntax-plain&quot;&gt;save&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;exact &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;@^&lt;span class=&quot;sp-syntax-static&quot;&gt;19.0&lt;/span&gt;.&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;@^&lt;span class=&quot;sp-syntax-static&quot;&gt;19.0&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;.0&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Or, if you’re using Yarn:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;yarn &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;add&lt;/span&gt; --&lt;span class=&quot;sp-syntax-plain&quot;&gt;exact &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;@^&lt;span class=&quot;sp-syntax-static&quot;&gt;19.0&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;.0&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;@^&lt;span class=&quot;sp-syntax-static&quot;&gt;19.0&lt;/span&gt;.&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you’re using TypeScript, you also need to update the types.&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install&lt;/span&gt; --&lt;span class=&quot;sp-syntax-plain&quot;&gt;save&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;exact &lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;types&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;/react@^19.0.0 @types/&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;@^&lt;span class=&quot;sp-syntax-static&quot;&gt;19.0&lt;/span&gt;.&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Or, if you’re using Yarn:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;yarn &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;add&lt;/span&gt; --&lt;span class=&quot;sp-syntax-plain&quot;&gt;exact &lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;types&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;/react@^19.0.0 @types/&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;@^&lt;span class=&quot;sp-syntax-static&quot;&gt;19.0&lt;/span&gt;.&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re also including a codemod for the most common replacements. See &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#typescript-changes&quot;&gt;TypeScript changes&lt;/a&gt; below.&lt;/p&gt;
&lt;h2 id=&quot;codemods&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Codemods &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#codemods&quot; aria-label=&quot;Link for Codemods &quot; title=&quot;Link for Codemods &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To help with the upgrade, we’ve worked with the team at &lt;a href=&quot;https://codemod.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;codemod.com&lt;/a&gt; to publish codemods that will automatically update your code to many of the new APIs and patterns in React 19.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;All codemods are available in the &lt;a href=&quot;https://github.com/reactjs/react-codemod&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-codemod&lt;/code&gt; repo&lt;/a&gt; and the Codemod team have joined in helping maintain the codemods. To run these codemods, we recommend using the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;codemod&lt;/code&gt; command instead of the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-codemod&lt;/code&gt; because it runs faster, handles more complex code migrations, and provides better support for TypeScript.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h4 id=&quot;run-all-react-19-codemods&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Run all React 19 codemods &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#run-all-react-19-codemods&quot; aria-label=&quot;Link for Run all React 19 codemods &quot; title=&quot;Link for Run all React 19 codemods &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Run all codemods listed in this guide with the React 19 &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;codemod&lt;/code&gt; recipe:&lt;/p&gt;&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npx &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;codemod&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;/&lt;span class=&quot;sp-syntax-static&quot;&gt;19&lt;/span&gt;/&lt;span class=&quot;sp-syntax-plain&quot;&gt;migration&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;recipe&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This will run the following codemods from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-codemod&lt;/code&gt;:&lt;/p&gt;&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://github.com/reactjs/react-codemod?tab=readme-ov-file#replace-reactdom-render&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;replace-reactdom-render&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://github.com/reactjs/react-codemod?tab=readme-ov-file#replace-string-ref&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;replace-string-ref&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://github.com/reactjs/react-codemod?tab=readme-ov-file#replace-act-import&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;replace-act-import&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://github.com/reactjs/react-codemod?tab=readme-ov-file#replace-use-form-state&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;replace-use-form-state&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://github.com/reactjs/react-codemod#react-proptypes-to-prop-types&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;prop-types-typescript&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This does not include the TypeScript changes. See &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#typescript-changes&quot;&gt;TypeScript changes&lt;/a&gt; below.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Changes that include a codemod include the command below.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For a list of all available codemods, see the &lt;a href=&quot;https://github.com/reactjs/react-codemod&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-codemod&lt;/code&gt; repo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;breaking-changes&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Breaking changes &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#breaking-changes&quot; aria-label=&quot;Link for Breaking changes &quot; title=&quot;Link for Breaking changes &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;errors-in-render-are-not-re-thrown&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Errors in render are not re-thrown &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#errors-in-render-are-not-re-thrown&quot; aria-label=&quot;Link for Errors in render are not re-thrown &quot; title=&quot;Link for Errors in render are not re-thrown &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In previous versions of React, errors thrown during render were caught and rethrown. In DEV, we would also log to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;console.error&lt;/code&gt;, resulting in duplicate error logs.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, we’ve &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19#error-handling&quot;&gt;improved how errors are handled&lt;/a&gt; to reduce duplication by not re-throwing:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Uncaught Errors&lt;/strong&gt;: Errors that are not caught by an Error Boundary are reported to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;window.reportError&lt;/code&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Caught Errors&lt;/strong&gt;: Errors that are caught by an Error Boundary are reported to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;console.error&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This change should not impact most apps, but if your production error reporting relies on errors being re-thrown, you may need to update your error handling. To support this, we’ve added new methods to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createRoot&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hydrateRoot&lt;/code&gt; for custom error handling:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;root&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createRoot&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;onUncaughtError&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;errorInfo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;// ... log error report&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-yellow-40 border-yellow-40 text-yellow-60 dark:text-yellow-30&quot;&gt;onCaughtError&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;errorInfo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-comment&quot;&gt;// ... log error report&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more info, see the docs for &lt;a href=&quot;https://react.dev/reference/react-dom/client/createRoot&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createRoot&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://react.dev/reference/react-dom/client/hydrateRoot&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hydrateRoot&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;removed-deprecated-react-apis&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Removed deprecated React APIs &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-deprecated-react-apis&quot; aria-label=&quot;Link for Removed deprecated React APIs &quot; title=&quot;Link for Removed deprecated React APIs &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;removed-proptypes-and-defaultprops&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Removed: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;propTypes&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;defaultProps&lt;/code&gt; for functions &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-proptypes-and-defaultprops&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;PropTypes&lt;/code&gt; were deprecated in &lt;a href=&quot;https://legacy.reactjs.org/blog/2017/04/07/react-v15.5.0.html#new-deprecation-warnings&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;April 2017 (v15.5.0)&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, we’re removing the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;propType&lt;/code&gt; checks from the React package, and using them will be silently ignored. If you’re using &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;propTypes&lt;/code&gt;, we recommend migrating to TypeScript or another type-checking solution.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re also removing &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;defaultProps&lt;/code&gt; from function components in place of ES6 default parameters. Class components will continue to support &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;defaultProps&lt;/code&gt; since there is no ES6 alternative.&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;PropTypes&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;prop-types&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Heading&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;Heading&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;propTypes&lt;/span&gt; = &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;PropTypes&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;Heading&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;defaultProps&lt;/span&gt; = &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;Hello, world!&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;interface &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;Props &lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-plain&quot;&gt;text&lt;/span&gt;?&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Heading&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-property&quot;&gt;text&lt;/span&gt; = &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;Hello, world!&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; Props&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Codemod &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;propTypes&lt;/code&gt; to TypeScript with:&lt;/p&gt;&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npx &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;codemod&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;/&lt;span class=&quot;sp-syntax-plain&quot;&gt;prop&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;types&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;typescript&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4 id=&quot;removed-removing-legacy-context&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Removed: Legacy Context using &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;contextTypes&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;getChildContext&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-removing-legacy-context&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Legacy Context was deprecated in &lt;a href=&quot;https://legacy.reactjs.org/blog/2018/10/23/react-v-16-6.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;October 2018 (v16.6.0)&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Legacy Context was only available in class components using the APIs &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;contextTypes&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;getChildContext&lt;/code&gt;, and was replaced with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;contextType&lt;/code&gt; due to subtle bugs that were easy to miss. In React 19, we’re removing Legacy Context to make React slightly smaller and faster.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you’re still using Legacy Context in class components, you’ll need to migrate to the new &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;contextType&lt;/code&gt; API:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;PropTypes&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;prop-types&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;class&lt;/span&gt; Parent &lt;span class=&quot;sp-syntax-keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;childContextTypes&lt;/span&gt; = &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-property&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;PropTypes&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;string&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;isRequired&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;getChildContext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;bar&#39;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Child&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;class&lt;/span&gt; Child &lt;span class=&quot;sp-syntax-keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;contextTypes&lt;/span&gt; = &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-property&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;PropTypes&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;string&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;isRequired&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;this&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;context&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;FooContext&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;createContext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;class&lt;/span&gt; Parent &lt;span class=&quot;sp-syntax-keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;FooContext&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;bar&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Child&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;FooContext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;class&lt;/span&gt; Child &lt;span class=&quot;sp-syntax-keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;contextType&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;FooContext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;this&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h4 id=&quot;removed-string-refs&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Removed: string refs &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-string-refs&quot; aria-label=&quot;Link for Removed: string refs &quot; title=&quot;Link for Removed: string refs &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;String refs were deprecated in &lt;a href=&quot;https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;March, 2018 (v16.3.0)&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Class components supported string refs before being replaced by ref callbacks due to &lt;a href=&quot;https://github.com/react/react/issues/1373&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;multiple downsides&lt;/a&gt;. In React 19, we’re removing string refs to make React simpler and easier to understand.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you’re still using string refs in class components, you’ll need to migrate to ref callbacks:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;class&lt;/span&gt; MyComponent &lt;span class=&quot;sp-syntax-keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;componentDidMount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;this&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;refs&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;input&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;focus&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;ref&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;input&#39;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;class&lt;/span&gt; MyComponent &lt;span class=&quot;sp-syntax-keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;componentDidMount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;this&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;input&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;focus&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line bg-github-highlight dark:bg-opacity-10&quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;ref&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;this&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;input&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Codemod string refs with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt; callbacks:&lt;/p&gt;&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npx &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;codemod&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;/&lt;span class=&quot;sp-syntax-static&quot;&gt;19&lt;/span&gt;/&lt;span class=&quot;sp-syntax-plain&quot;&gt;replace&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;string&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;ref&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4 id=&quot;removed-module-pattern-factories&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Removed: Module pattern factories &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-module-pattern-factories&quot; aria-label=&quot;Link for Removed: Module pattern factories &quot; title=&quot;Link for Removed: Module pattern factories &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Module pattern factories were deprecated in &lt;a href=&quot;https://legacy.reactjs.org/blog/2019/08/08/react-v16.9.0.html#deprecating-module-pattern-factories&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;August 2019 (v16.9.0)&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This pattern was rarely used and supporting it causes React to be slightly larger and slower than necessary. In React 19, we’re removing support for module pattern factories, and you’ll need to migrate to regular functions:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;FactoryComponent&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;FactoryComponent&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h4 id=&quot;removed-createfactory&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Removed: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;React.createFactory&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-createfactory&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createFactory&lt;/code&gt; was deprecated in &lt;a href=&quot;https://legacy.reactjs.org/blog/2020/02/26/react-v16.13.0.html#deprecating-createfactory&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;February 2020 (v16.13.0)&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Using &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createFactory&lt;/code&gt; was common before broad support for JSX, but it’s rarely used today and can be replaced with JSX. In React 19, we’re removing &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createFactory&lt;/code&gt; and you’ll need to migrate to JSX:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;createFactory&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;button&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createFactory&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;button&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;button&lt;/span&gt; = &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h4 id=&quot;removed-react-test-renderer-shallow&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Removed: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-test-renderer/shallow&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-react-test-renderer-shallow&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 18, we updated &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-test-renderer/shallow&lt;/code&gt; to re-export &lt;a href=&quot;https://github.com/enzymejs/react-shallow-renderer&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react-shallow-renderer&lt;/a&gt;. In React 19, we’re removing &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-test-render/shallow&lt;/code&gt; to prefer installing the package directly:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;shallow&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;renderer&lt;/span&gt; --&lt;span class=&quot;sp-syntax-plain&quot;&gt;save&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ShallowRenderer &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;from &lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-test-renderer/shallow&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;+ &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ShallowRenderer &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;from &lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-shallow-renderer&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;h5 id=&quot;please-reconsider-shallow-rendering&quot; class=&quot;mdx-heading text-lg font-display font-bold leading-9 my-2&quot;&gt;Please reconsider shallow rendering &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#please-reconsider-shallow-rendering&quot; aria-label=&quot;Link for Please reconsider shallow rendering &quot; title=&quot;Link for Please reconsider shallow rendering &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Shallow rendering depends on React internals and can block you from future upgrades. We recommend migrating your tests to &lt;a href=&quot;https://testing-library.com/docs/react-testing-library/intro/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@testing-library/react&lt;/a&gt; or &lt;a href=&quot;https://testing-library.com/docs/react-native-testing-library/intro&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@testing-library/react-native&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;removed-deprecated-react-dom-apis&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Removed deprecated React DOM APIs &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-deprecated-react-dom-apis&quot; aria-label=&quot;Link for Removed deprecated React DOM APIs &quot; title=&quot;Link for Removed deprecated React DOM APIs &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;removed-react-dom-test-utils&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Removed: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom/test-utils&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-react-dom-test-utils&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve moved &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;act&lt;/code&gt; from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom/test-utils&lt;/code&gt; to the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt; package:&lt;/p&gt;
&lt;div class=&quot;console-block mb-4 text-secondary bg-wash dark:bg-wash-dark rounded-lg&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;flex w-full rounded-t-lg bg-gray-200 dark:bg-gray-80&quot;&gt;&lt;div class=&quot;px-4 py-2 border-gray-300 dark:border-gray-90 border-r&quot;&gt;&lt;div class=&quot;bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:15px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex text-sm px-4&quot;&gt;&lt;div class=&quot;border-b-2 border-gray-300 dark:border-gray-90 text-tertiary dark:text-tertiary-dark&quot;&gt;Console&lt;/div&gt;&lt;div class=&quot;px-4 py-2 flex&quot;&gt;&lt;div class=&quot;me-2 bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;me-2 hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 divide-y divide-gray-300 dark:divide-gray-70 text-base&quot;&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOMTestUtils.act&lt;/code&gt; is deprecated in favor of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;React.act&lt;/code&gt;. Import &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;act&lt;/code&gt; from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt; instead of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom/test-utils&lt;/code&gt;. See &lt;a href=&quot;https://react.dev/warnings/react-dom-test-utils&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;https://react.dev/warnings/react-dom-test-utils&lt;/a&gt; for more info.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To fix this warning, you can import &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;act&lt;/code&gt; from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;act&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;from &lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom/test-utils&#39;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;+ &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;act&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;from &lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;All other &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;test-utils&lt;/code&gt; functions have been removed. These utilities were uncommon, and made it too easy to depend on low level implementation details of your components and React. In React 19, these functions will error when called and their exports will be removed in a future version.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See the &lt;a href=&quot;https://react.dev/warnings/react-dom-test-utils&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;warning page&lt;/a&gt; for alternatives.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Codemod &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOMTestUtils.act&lt;/code&gt; to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;React.act&lt;/code&gt;:&lt;/p&gt;&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npx &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;codemod&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;/&lt;span class=&quot;sp-syntax-static&quot;&gt;19&lt;/span&gt;/&lt;span class=&quot;sp-syntax-plain&quot;&gt;replace&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;act&lt;/span&gt;-&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4 id=&quot;removed-reactdom-render&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Removed: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.render&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-reactdom-render&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.render&lt;/code&gt; was deprecated in &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;March 2022 (v18.0.0)&lt;/a&gt;. In React 19, we’re removing &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.render&lt;/code&gt; and you’ll need to migrate to using &lt;a href=&quot;https://react.dev/reference/react-dom/client/createRoot&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.createRoot&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;root&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;createRoot&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom/client&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;root&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createRoot&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;root&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;root&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Codemod &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.render&lt;/code&gt; to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOMClient.createRoot&lt;/code&gt;:&lt;/p&gt;&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npx &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;codemod&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;/&lt;span class=&quot;sp-syntax-static&quot;&gt;19&lt;/span&gt;/&lt;span class=&quot;sp-syntax-plain&quot;&gt;replace&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;reactdom&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;render&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4 id=&quot;removed-reactdom-hydrate&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Removed: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.hydrate&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-reactdom-hydrate&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.hydrate&lt;/code&gt; was deprecated in &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;March 2022 (v18.0.0)&lt;/a&gt;. In React 19, we’re removing &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.hydrate&lt;/code&gt; you’ll need to migrate to using &lt;a href=&quot;https://react.dev/reference/react-dom/client/hydrateRoot&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.hydrateRoot&lt;/code&gt;&lt;/a&gt;,&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;hydrate&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;hydrate&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;root&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;hydrateRoot&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom/client&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;hydrateRoot&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;root&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Codemod &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.hydrate&lt;/code&gt; to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOMClient.hydrateRoot&lt;/code&gt;:&lt;/p&gt;&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npx &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;codemod&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;/&lt;span class=&quot;sp-syntax-static&quot;&gt;19&lt;/span&gt;/&lt;span class=&quot;sp-syntax-plain&quot;&gt;replace&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;reactdom&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;render&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4 id=&quot;removed-unmountcomponentatnode&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Removed: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unmountComponentAtNode&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-unmountcomponentatnode&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.unmountComponentAtNode&lt;/code&gt; was deprecated in &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;March 2022 (v18.0.0)&lt;/a&gt;. In React 19, you’ll need to migrate to using &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;root.unmount()&lt;/code&gt;.&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;unmountComponentAtNode&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;root&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;root&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;unmount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more see &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;root.unmount()&lt;/code&gt; for &lt;a href=&quot;https://react.dev/reference/react-dom/client/createRoot#root-unmount&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createRoot&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://react.dev/reference/react-dom/client/hydrateRoot#root-unmount&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hydrateRoot&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Codemod &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unmountComponentAtNode&lt;/code&gt; to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;root.unmount&lt;/code&gt;:&lt;/p&gt;&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npx &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;codemod&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;/&lt;span class=&quot;sp-syntax-static&quot;&gt;19&lt;/span&gt;/&lt;span class=&quot;sp-syntax-plain&quot;&gt;replace&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;reactdom&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;render&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4 id=&quot;removed-reactdom-finddomnode&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;Removed: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.findDOMNode&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-reactdom-finddomnode&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.findDOMNode&lt;/code&gt; was &lt;a href=&quot;https://legacy.reactjs.org/blog/2018/10/23/react-v-16-6.html#deprecations-in-strictmode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;deprecated in October 2018 (v16.6.0)&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re removing &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;findDOMNode&lt;/code&gt; because it was a legacy escape hatch that was slow to execute, fragile to refactoring, only returned the first child, and broke abstraction levels (see more &lt;a href=&quot;https://legacy.reactjs.org/docs/strict-mode.html#warning-about-deprecated-finddomnode-usage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;here&lt;/a&gt;). You can replace &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.findDOMNode&lt;/code&gt; with &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/manipulating-the-dom-with-refs&quot;&gt;DOM refs&lt;/a&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;findDOMNode&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;AutoselectingInput&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;input&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;findDOMNode&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-plain&quot;&gt;input&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;defaultValue&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;Hello&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;AutoselectingInput&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ref&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRef&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-plain&quot;&gt;ref&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;current&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;ref&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;defaultValue&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;Hello&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h2 id=&quot;new-deprecations&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New deprecations &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#new-deprecations&quot; aria-label=&quot;Link for New deprecations &quot; title=&quot;Link for New deprecations &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;deprecated-element-ref&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Deprecated: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;element.ref&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#deprecated-element-ref&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 19 supports &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19#ref-as-a-prop&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt; as a prop&lt;/a&gt;, so we’re deprecating the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;element.ref&lt;/code&gt; in place of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;element.props.ref&lt;/code&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Accessing &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;element.ref&lt;/code&gt; will warn:&lt;/p&gt;
&lt;div class=&quot;console-block mb-4 text-secondary bg-wash dark:bg-wash-dark rounded-lg&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;flex w-full rounded-t-lg bg-gray-200 dark:bg-gray-80&quot;&gt;&lt;div class=&quot;px-4 py-2 border-gray-300 dark:border-gray-90 border-r&quot;&gt;&lt;div class=&quot;bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:15px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex text-sm px-4&quot;&gt;&lt;div class=&quot;border-b-2 border-gray-300 dark:border-gray-90 text-tertiary dark:text-tertiary-dark&quot;&gt;Console&lt;/div&gt;&lt;div class=&quot;px-4 py-2 flex&quot;&gt;&lt;div class=&quot;me-2 bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;me-2 hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 divide-y divide-gray-300 dark:divide-gray-70 text-base&quot;&gt;&lt;div class=&quot;ps-4 pe-2 pt-1 pb-2 grid grid-cols-[18px_auto] font-mono rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5 text-[.7rem] w-6&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-2 pt-1 whitespace-break-spaces text-code leading-tight&quot;&gt;Accessing element.ref is no longer supported. ref is now a regular prop. It will be removed from the JSX Element type in a future release.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;deprecated-react-test-renderer&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Deprecated: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-test-renderer&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#deprecated-react-test-renderer&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We are deprecating &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-test-renderer&lt;/code&gt; because it implements its own renderer environment that doesn’t match the environment users use, promotes testing implementation details, and relies on introspection of React’s internals.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The test renderer was created before there were more viable testing strategies available like &lt;a href=&quot;https://testing-library.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Testing Library&lt;/a&gt;, and we now recommend using a modern testing library instead.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-test-renderer&lt;/code&gt; logs a deprecation warning, and has switched to concurrent rendering. We recommend migrating your tests to &lt;a href=&quot;https://testing-library.com/docs/react-testing-library/intro/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@testing-library/react&lt;/a&gt; or &lt;a href=&quot;https://testing-library.com/docs/react-native-testing-library/intro&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@testing-library/react-native&lt;/a&gt; for a modern and well supported testing experience.&lt;/p&gt;
&lt;h2 id=&quot;notable-changes&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Notable changes &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#notable-changes&quot; aria-label=&quot;Link for Notable changes &quot; title=&quot;Link for Notable changes &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;strict-mode-improvements&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;StrictMode changes &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#strict-mode-improvements&quot; aria-label=&quot;Link for StrictMode changes &quot; title=&quot;Link for StrictMode changes &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 19 includes several fixes and improvements to Strict Mode.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When double rendering in Strict Mode in development, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useMemo&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useCallback&lt;/code&gt; will reuse the memoized results from the first render during the second render. Components that are already Strict Mode compatible should not notice a difference in behavior.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As with all Strict Mode behaviors, these features are designed to proactively surface bugs in your components during development so you can fix them before they are shipped to production. For example, during development, Strict Mode will double-invoke ref callback functions on initial mount, to simulate what happens when a mounted component is replaced by a Suspense fallback.&lt;/p&gt;
&lt;h3 id=&quot;improvements-to-suspense&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Improvements to Suspense &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#improvements-to-suspense&quot; aria-label=&quot;Link for Improvements to Suspense &quot; title=&quot;Link for Improvements to Suspense &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, when a component suspends, React will immediately commit the fallback of the nearest Suspense boundary without waiting for the entire sibling tree to render. After the fallback commits, React schedules another render for the suspended siblings to “pre-warm” lazy requests in the rest of the tree:&lt;/p&gt;
&lt;figure class=&quot;flex flex-col px-0 p-0 sm:p-10 first:mt-0 mt-10 sm:mt-0 justify-center items-center&quot;&gt;&lt;div class=&quot;dark-image&quot;&gt;&lt;img alt=&quot;Diagram showing a tree of three components, one parent labeled Accordion and two children labeled Panel. Both Panel components contain isActive with value false.&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;162&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprerender.dark.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprerender.dark.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://react.dev/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprerender.dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/div&gt;&lt;div class=&quot;light-image&quot;&gt;&lt;img alt=&quot;Diagram showing a tree of three components, one parent labeled Accordion and two children labeled Panel. Both Panel components contain isActive with value false.&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;162&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprerender.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprerender.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://react.dev/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprerender.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/div&gt;&lt;div class=&quot;w-full flex justify-center&quot;&gt;&lt;figcaption class=&quot;p-1 sm:p-2 mt-0 sm:mt-0 text-gray-40 text-base lg:text-lg text-center leading-tight table-caption max-w-lg&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Previously, when a component suspended, the suspended siblings were rendered and then the fallback was committed.&lt;/p&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;figure class=&quot;flex flex-col px-0 p-0 sm:p-10 first:mt-0 mt-10 sm:mt-0 justify-center items-center&quot;&gt;&lt;div class=&quot;dark-image&quot;&gt;&lt;img alt=&quot;The same diagram as the previous, with the isActive of the first child Panel component highlighted indicating a click with the isActive value set to true. The second Panel component still contains value false.&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;162&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprewarm.dark.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprewarm.dark.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://react.dev/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprewarm.dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/div&gt;&lt;div class=&quot;light-image&quot;&gt;&lt;img alt=&quot;The same diagram as the previous, with the isActive of the first child Panel component highlighted indicating a click with the isActive value set to true. The second Panel component still contains value false.&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;162&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprewarm.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprewarm.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://react.dev/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fprewarm.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/div&gt;&lt;div class=&quot;w-full flex justify-center&quot;&gt;&lt;figcaption class=&quot;p-1 sm:p-2 mt-0 sm:mt-0 text-gray-40 text-base lg:text-lg text-center leading-tight table-caption max-w-lg&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 19, when a component suspends, the fallback is committed and then the suspended siblings are rendered.&lt;/p&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This change means Suspense fallbacks display faster, while still warming lazy requests in the suspended tree.&lt;/p&gt;
&lt;h3 id=&quot;umd-builds-removed&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;UMD builds removed &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#umd-builds-removed&quot; aria-label=&quot;Link for UMD builds removed &quot; title=&quot;Link for UMD builds removed &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;UMD was widely used in the past as a convenient way to load React without a build step. Now, there are modern alternatives for loading modules as scripts in HTML documents. Starting with React 19, React will no longer produce UMD builds to reduce the complexity of its testing and release process.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To load React 19 with a script tag, we recommend using an ESM-based CDN such as &lt;a href=&quot;https://esm.sh/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;esm.sh&lt;/a&gt;.&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;script&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;module&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;https://esm.sh/react@19/?dev&quot;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ReactDOMClient&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;https://esm.sh/react-dom@19/client?dev&quot;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;...&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h3 id=&quot;libraries-depending-on-react-internals-may-block-upgrades&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Libraries depending on React internals may block upgrades &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#libraries-depending-on-react-internals-may-block-upgrades&quot; aria-label=&quot;Link for Libraries depending on React internals may block upgrades &quot; title=&quot;Link for Libraries depending on React internals may block upgrades &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This release includes changes to React internals that may impact libraries that ignore our pleas to not use internals like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED&lt;/code&gt;. These changes are necessary to land improvements in React 19, and will not break libraries that follow our guidelines.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Based on our &lt;a href=&quot;https://react.dev/community/versioning-policy#what-counts-as-a-breaking-change&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Versioning Policy&lt;/a&gt;, these updates are not listed as breaking changes, and we are not including docs for how to upgrade them. The recommendation is to remove any code that depends on internals.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To reflect the impact of using internals, we have renamed the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;SECRET_INTERNALS&lt;/code&gt; suffix to:&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE&lt;/code&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the future we will more aggressively block accessing internals from React to discourage usage and ensure users are not blocked from upgrading.&lt;/p&gt;
&lt;h2 id=&quot;typescript-changes&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;TypeScript changes &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#typescript-changes&quot; aria-label=&quot;Link for TypeScript changes &quot; title=&quot;Link for TypeScript changes &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;removed-deprecated-typescript-types&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Removed deprecated TypeScript types &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-deprecated-typescript-types&quot; aria-label=&quot;Link for Removed deprecated TypeScript types &quot; title=&quot;Link for Removed deprecated TypeScript types &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve cleaned up the TypeScript types based on the removed APIs in React 19. Some of the removed have types been moved to more relevant packages, and others are no longer needed to describe React’s behavior.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve published &lt;a href=&quot;https://github.com/eps1lon/types-react-codemod/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;types-react-codemod&lt;/code&gt;&lt;/a&gt; to migrate most type related breaking changes:&lt;/p&gt;&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npx &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;types&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;codemod&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;preset&lt;/span&gt;-&lt;span class=&quot;sp-syntax-static&quot;&gt;19&lt;/span&gt; ./&lt;span class=&quot;sp-syntax-plain&quot;&gt;path&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;to&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;app&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you have a lot of unsound access to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;element.props&lt;/code&gt;, you can run this additional codemod:&lt;/p&gt;&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npx &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;types&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;codemod&lt;/span&gt;@&lt;span class=&quot;sp-syntax-plain&quot;&gt;latest&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;element&lt;/span&gt;-&lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;any&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;props&lt;/span&gt; ./&lt;span class=&quot;sp-syntax-plain&quot;&gt;path&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;to&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;your&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;ts&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;files&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Check out &lt;a href=&quot;https://github.com/eps1lon/types-react-codemod/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;types-react-codemod&lt;/code&gt;&lt;/a&gt; for a list of supported replacements. If you feel a codemod is missing, it can be tracked in the &lt;a href=&quot;https://github.com/eps1lon/types-react-codemod/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22React+19%22+label%3Aenhancement&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;list of missing React 19 codemods&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;ref-cleanup-required&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ref&lt;/code&gt; cleanups required &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#ref-cleanup-required&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;This change is included in the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-19&lt;/code&gt; codemod preset as &lt;a href=&quot;https://github.com/eps1lon/types-react-codemod/#no-implicit-ref-callback-return&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;no-implicit-ref-callback-return &lt;/code&gt;&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Due to the introduction of ref cleanup functions, returning anything else from a ref callback will now be rejected by TypeScript. The fix is usually to stop using implicit returns:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;ref&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;current&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;instance&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;current&lt;/span&gt;&lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-blue-40 border-blue-40 text-blue-60 dark:text-blue-30&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;+ &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;ref&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;current&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-yellow-40 border-yellow-40 text-yellow-60 dark:text-yellow-30&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;instance&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;current&lt;/span&gt;&lt;span class=&quot;code-step bg-opacity-10 dark:bg-opacity-20 relative rounded px-1 py-[1.5px] border-b-[2px] border-opacity-60 bg-yellow-40 border-yellow-40 text-yellow-60 dark:text-yellow-30&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The original code returned the instance of the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;HTMLDivElement&lt;/code&gt; and TypeScript wouldn’t know if this was supposed to be a cleanup function or not.&lt;/p&gt;
&lt;h3 id=&quot;useref-requires-argument&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useRef&lt;/code&gt; requires an argument &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#useref-requires-argument&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;This change is included in the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-19&lt;/code&gt; codemod preset as &lt;a href=&quot;https://github.com/eps1lon/types-react-codemod/#refobject-defaults&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;refobject-defaults&lt;/code&gt;&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;A long-time complaint of how TypeScript and React work has been &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useRef&lt;/code&gt;. We’ve changed the types so that &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useRef&lt;/code&gt; now requires an argument. This significantly simplifies its type signature. It’ll now behave more like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createContext&lt;/code&gt;.&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// @ts-expect-error: Expected 1 argument but saw none&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;useRef&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Passes&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;useRef&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// @ts-expect-error: Expected 1 argument but saw none&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;createContext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Passes&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;createContext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This now also means that all refs are mutable. You’ll no longer hit the issue where you can’t mutate a ref because you initialised it with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;null&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;ref&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;useRef&lt;/span&gt;&amp;lt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;number&lt;/span&gt;&amp;gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Cannot assign to &#39;current&#39; because it is a read-only property&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;ref&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;current&lt;/span&gt; = &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;MutableRef&lt;/code&gt; is now deprecated in favor of a single &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;RefObject&lt;/code&gt; type which &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useRef&lt;/code&gt; will always return:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;interface &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;RefObject&lt;/span&gt;&amp;lt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;T&lt;/span&gt;&amp;gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-property&quot;&gt;current&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;T&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;declare &lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;useRef&lt;/span&gt;&amp;lt;T&amp;gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;RefObject&lt;/span&gt;&amp;lt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;T&lt;/span&gt;&amp;gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useRef&lt;/code&gt; still has a convenience overload for &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useRef&amp;lt;T&amp;gt;(null)&lt;/code&gt; that automatically returns &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;RefObject&amp;lt;T | null&amp;gt;&lt;/code&gt;. To ease migration due to the required argument for &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useRef&lt;/code&gt;, a convenience overload for &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useRef(undefined)&lt;/code&gt; was added that automatically returns &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;RefObject&amp;lt;T | undefined&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Check out &lt;a href=&quot;https://github.com/DefinitelyTyped/DefinitelyTyped/pull/64772&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;[RFC] Make all refs mutable&lt;/a&gt; for prior discussions about this change.&lt;/p&gt;
&lt;h3 id=&quot;changes-to-the-reactelement-typescript-type&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Changes to the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactElement&lt;/code&gt; TypeScript type &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#changes-to-the-reactelement-typescript-type&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;This change is included in the &lt;a href=&quot;https://github.com/eps1lon/types-react-codemod#react-element-default-any-props&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-element-default-any-props&lt;/code&gt;&lt;/a&gt; codemod.&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;props&lt;/code&gt; of React elements now default to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unknown&lt;/code&gt; instead of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;any&lt;/code&gt; if the element is typed as &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactElement&lt;/code&gt;. This does not affect you if you pass a type argument to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactElement&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;type &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;Example2&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;ReactElement&lt;/span&gt;&amp;lt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&amp;gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;props&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;//   ^? { id: string }&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;But if you relied on the default, you now have to handle &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unknown&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;type &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;Example&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;ReactElement&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;props&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;//   ^? Before, was &#39;any&#39;, now &#39;unknown&#39;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You should only need it if you have a lot of legacy code relying on unsound access of element props. Element introspection only exists as an escape hatch, and you should make it explicit that your props access is unsound via an explicit &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;any&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;the-jsx-namespace-in-typescript&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;The JSX namespace in TypeScript &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#the-jsx-namespace-in-typescript&quot; aria-label=&quot;Link for The JSX namespace in TypeScript &quot; title=&quot;Link for The JSX namespace in TypeScript &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This change is included in the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-19&lt;/code&gt; codemod preset as &lt;a href=&quot;https://github.com/eps1lon/types-react-codemod#scoped-jsx&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;scoped-jsx&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;A long-time request is to remove the global &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;JSX&lt;/code&gt; namespace from our types in favor of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;React.JSX&lt;/code&gt;. This helps prevent pollution of global types which prevents conflicts between different UI libraries that leverage JSX.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You’ll now need to wrap module augmentation of the JSX namespace in `declare module ”…”:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// global.d.ts&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;+ &lt;span class=&quot;sp-syntax-plain&quot;&gt;declare &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;module &lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;react&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-plain&quot;&gt;namespace &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;JSX &lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-plain&quot;&gt;interface &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;IntrinsicElements &lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        &lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;my-element&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;          myElementProps&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;+ &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The exact module specifier depends on the JSX runtime you specified in the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;compilerOptions&lt;/code&gt; of your &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;tsconfig.json&lt;/code&gt;:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;For &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;jsx&quot;: &quot;react-jsx&quot;&lt;/code&gt; it would be &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react/jsx-runtime&lt;/code&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;For &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;jsx&quot;: &quot;react-jsxdev&quot;&lt;/code&gt; it would be &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react/jsx-dev-runtime&lt;/code&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;For &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;jsx&quot;: &quot;react&quot;&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;jsx&quot;: &quot;preserve&quot;&lt;/code&gt; it would be &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;better-usereducer-typings&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Better &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useReducer&lt;/code&gt; typings &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#better-usereducer-typings&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useReducer&lt;/code&gt; now has improved type inference thanks to &lt;a href=&quot;https://github.com/mfp22&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@mfp22&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;However, this required a breaking change where &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useReducer&lt;/code&gt; doesn’t accept the full reducer type as a type parameter but instead either needs none (and rely on contextual typing) or needs both the state and action type.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The new best practice is &lt;em&gt;not&lt;/em&gt; to pass type arguments to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useReducer&lt;/code&gt;.&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-plain&quot;&gt;useReducer&lt;/span&gt;&amp;lt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;Reducer&lt;/span&gt;&amp;lt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;State&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Action&lt;/span&gt;&amp;gt;&amp;gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;reducer&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;+ &lt;span class=&quot;sp-syntax-definition&quot;&gt;useReducer&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;reducer&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This may not work in edge cases where you can explicitly type the state and action, by passing in the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;Action&lt;/code&gt; in a tuple:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-plain&quot;&gt;useReducer&lt;/span&gt;&amp;lt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;Reducer&lt;/span&gt;&amp;lt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;State&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Action&lt;/span&gt;&amp;gt;&amp;gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;reducer&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;+ &lt;span class=&quot;sp-syntax-plain&quot;&gt;useReducer&lt;/span&gt;&amp;lt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;State&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;Action&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&amp;gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;reducer&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you define the reducer inline, we encourage to annotate the function parameters instead:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;- &lt;span class=&quot;sp-syntax-plain&quot;&gt;useReducer&lt;/span&gt;&amp;lt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;Reducer&lt;/span&gt;&amp;lt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;State&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;Action&lt;/span&gt;&amp;gt;&amp;gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;+ &lt;span class=&quot;sp-syntax-definition&quot;&gt;useReducer&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; State&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; Action&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This is also what you’d also have to do if you move the reducer outside of the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useReducer&lt;/code&gt; call:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;reducer&lt;/span&gt; = &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; State&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; Action&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h2 id=&quot;changelog&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Changelog &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#changelog&quot; aria-label=&quot;Link for Changelog &quot; title=&quot;Link for Changelog &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;other-breaking-changes&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Other breaking changes &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#other-breaking-changes&quot; aria-label=&quot;Link for Other breaking changes &quot; title=&quot;Link for Other breaking changes &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react-dom&lt;/strong&gt;: Error for javascript URLs in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;src&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;href&lt;/code&gt; &lt;a href=&quot;https://github.com/react/react/pull/26507&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#26507&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react-dom&lt;/strong&gt;: Remove &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;errorInfo.digest&lt;/code&gt; from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;onRecoverableError&lt;/code&gt; &lt;a href=&quot;https://github.com/react/react/pull/28222&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#28222&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react-dom&lt;/strong&gt;: Remove &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unstable_flushControlled&lt;/code&gt; &lt;a href=&quot;https://github.com/react/react/pull/26397&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#26397&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react-dom&lt;/strong&gt;: Remove &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unstable_createEventHandle&lt;/code&gt; &lt;a href=&quot;https://github.com/react/react/pull/28271&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#28271&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react-dom&lt;/strong&gt;: Remove &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unstable_renderSubtreeIntoContainer&lt;/code&gt; &lt;a href=&quot;https://github.com/react/react/pull/28271&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#28271&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react-dom&lt;/strong&gt;: Remove &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unstable_runWithPriority&lt;/code&gt; &lt;a href=&quot;https://github.com/react/react/pull/28271&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#28271&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react-is&lt;/strong&gt;: Remove deprecated methods from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-is&lt;/code&gt; &lt;a href=&quot;https://github.com/react/react/pull/28224&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;28224&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;other-notable-changes&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Other notable changes &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide#other-notable-changes&quot; aria-label=&quot;Link for Other notable changes &quot; title=&quot;Link for Other notable changes &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react&lt;/strong&gt;: Batch sync, default and continuous lanes &lt;a href=&quot;https://github.com/react/react/pull/25700&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#25700&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react&lt;/strong&gt;: Don’t prerender siblings of suspended component &lt;a href=&quot;https://github.com/react/react/pull/26380&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#26380&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react&lt;/strong&gt;: Detect infinite update loops caused by render phase updates &lt;a href=&quot;https://github.com/react/react/pull/26625&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#26625&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react-dom&lt;/strong&gt;: Transitions in popstate are now synchronous &lt;a href=&quot;https://github.com/react/react/pull/26025&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#26025&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react-dom&lt;/strong&gt;: Remove layout effect warning during SSR &lt;a href=&quot;https://github.com/react/react/pull/26395&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#26395&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;react-dom&lt;/strong&gt;: Warn and don’t set empty string for src/href (except anchor tags) &lt;a href=&quot;https://github.com/react/react/pull/28124&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#28124&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For a full list of changes, please see the &lt;a href=&quot;https://github.com/react/react/blob/main/CHANGELOG.md#1900-december-5-2024&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks to &lt;a href=&quot;https://twitter.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Andrew Clark&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/Eli_White&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Eli White&lt;/a&gt;, &lt;a href=&quot;https://github.com/jackpope&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jack Pope&lt;/a&gt;, &lt;a href=&quot;https://github.com/kassens&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jan Kassens&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/joshcstory&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Josh Story&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/noahlemen&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Noah Lemen&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/sophiebits&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sophie Alpert&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/sebsilbermann&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sebastian Silbermann&lt;/a&gt; for reviewing and editing this post.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React 19 RC&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Labs: What We&#39;ve Been Working On – February 2024&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2024/04/25/react-19-upgrade-guide</link><guid isPermaLink="false">https://react.dev/blog/2024/04/25/react-19-upgrade-guide</guid><pubDate>Wed, 24 Apr 2024 16:00:00 GMT</pubDate></item><item><title>React Labs: What We&#39;ve Been Working On – February 2024</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;February 15, 2024 by &lt;a href=&quot;https://twitter.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joseph Savona&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ricky Hanlon&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Andrew Clark&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt;, and &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React Labs posts, we write about projects in active research and development. We’ve made significant progress since our &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023&quot;&gt;last update&lt;/a&gt;, and we’d like to share our progress.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;react-compiler&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Compiler &lt;a href=&quot;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024#react-compiler&quot; aria-label=&quot;Link for React Compiler &quot; title=&quot;Link for React Compiler &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Compiler is no longer a research project: the compiler now powers instagram.com in production, and we are working to ship the compiler across additional surfaces at Meta and to prepare the first open source release.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As discussed in our &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-optimizing-compiler&quot;&gt;previous post&lt;/a&gt;, React can &lt;em&gt;sometimes&lt;/em&gt; re-render too much when state changes. Since the early days of React our solution for such cases has been manual memoization. In our current APIs, this means applying the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useMemo&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useMemo&lt;/code&gt;&lt;/a&gt;, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useCallback&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useCallback&lt;/code&gt;&lt;/a&gt;, and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/memo&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;memo&lt;/code&gt;&lt;/a&gt; APIs to manually tune how much React re-renders on state changes. But manual memoization is a compromise. It clutters up our code, is easy to get wrong, and requires extra work to keep up to date.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Manual memoization is a reasonable compromise, but we weren’t satisfied. Our vision is for React to &lt;em&gt;automatically&lt;/em&gt; re-render just the right parts of the UI when state changes, &lt;em&gt;without compromising on React’s core mental model&lt;/em&gt;. We believe that React’s approach — UI as a simple function of state, with standard JavaScript values and idioms — is a key part of why React has been approachable for so many developers. That’s why we’ve invested in building an optimizing compiler for React.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;JavaScript is a notoriously challenging language to optimize, thanks to its loose rules and dynamic nature. React Compiler is able to compile code safely by modeling both the rules of JavaScript &lt;em&gt;and&lt;/em&gt; the “rules of React”. For example, React components must be idempotent — returning the same value given the same inputs — and can’t mutate props or state values. These rules limit what developers can do and help to carve out a safe space for the compiler to optimize.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Of course, we understand that developers sometimes bend the rules a bit, and our goal is to make React Compiler work out of the box on as much code as possible. The compiler attempts to detect when code doesn’t strictly follow React’s rules and will either compile the code where safe or skip compilation if it isn’t safe. We’re testing against Meta’s large and varied codebase in order to help validate this approach.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For developers who are curious about making sure their code follows React’s rules, we recommend &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/StrictMode&quot;&gt;enabling Strict Mode&lt;/a&gt; and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/editor-setup#linting&quot;&gt;configuring React’s ESLint plugin&lt;/a&gt;. These tools can help to catch subtle bugs in your React code, improving the quality of your applications today, and future-proofs your applications for upcoming features such as React Compiler. We are also working on consolidated documentation of the rules of React and updates to our ESLint plugin to help teams understand and apply these rules to create more robust apps.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To see the compiler in action, you can check out our &lt;a href=&quot;https://www.youtube.com/watch?v=qOQClO3g8-Y&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;talk from last fall&lt;/a&gt;. At the time of the talk, we had early experimental data from trying React Compiler on one page of instagram.com. Since then, we shipped the compiler to production across instagram.com. We’ve also expanded our team to accelerate the rollout to additional surfaces at Meta and to open source. We’re excited about the path ahead and will have more to share in the coming months.&lt;/p&gt;
&lt;h2 id=&quot;actions&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Actions &lt;a href=&quot;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024#actions&quot; aria-label=&quot;Link for Actions &quot; title=&quot;Link for Actions &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components&quot;&gt;previously shared&lt;/a&gt; that we were exploring solutions for sending data from the client to the server with Server Actions, so that you can execute database mutations and implement forms. During development of Server Actions, we extended these APIs to support data handling in client-only applications as well.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We refer to this broader collection of features as simply “Actions”. Actions allow you to pass a function to DOM elements such as &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/form&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form/&amp;gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;form&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;action&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;query&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;submit&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Search&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;action&lt;/code&gt; function can operate synchronously or asynchronously. You can define them on the client side using standard JavaScript or on the server with the  &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rsc/use-server&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&#39;use server&#39;&lt;/code&gt;&lt;/a&gt; directive. When using an action, React will manage the life cycle of the data submission for you, providing hooks like &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/hooks/useFormStatus&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useFormStatus&lt;/code&gt;&lt;/a&gt;, and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useActionState&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useActionState&lt;/code&gt;&lt;/a&gt; to access the current state and response of the form action.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;By default, Actions are submitted within a &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useTransition&quot;&gt;transition&lt;/a&gt;, keeping the current page interactive while the action is processing. Since Actions support async functions, we’ve also added the ability to use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;async/await&lt;/code&gt; in transitions. This allows you to show pending UI with the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;isPending&lt;/code&gt; state of a transition when an async request like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;fetch&lt;/code&gt; starts, and show the pending UI all the way through the update being applied.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Alongside Actions, we’re introducing a feature named &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useOptimistic&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useOptimistic&lt;/code&gt;&lt;/a&gt; for managing optimistic state updates. With this hook, you can apply temporary updates that are automatically reverted once the final state commits. For Actions, this allows you to optimistically set the final state of the data on the client, assuming the submission is successful, and revert to the value for data received from the server. It works using regular &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;async&lt;/code&gt;/&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;await&lt;/code&gt;, so it works the same whether you’re using &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;fetch&lt;/code&gt; on the client, or a Server Action from the server.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Library authors can implement custom &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;action={fn}&lt;/code&gt; props in their own components with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useTransition&lt;/code&gt;. Our intent is for libraries to adopt the Actions pattern when designing their component APIs, to provide a consistent experience for React developers. For example, if your library provides a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Calendar onSelect={eventHandler}&amp;gt;&lt;/code&gt; component, consider also exposing a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Calendar selectAction={action}&amp;gt;&lt;/code&gt; API, too.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;While we initially focused on Server Actions for client-server data transfer, our philosophy for React is to provide the same programming model across all platforms and environments. When possible, if we introduce a feature on the client, we aim to make it also work on the server, and vice versa. This philosophy allows us to create a single set of APIs that work no matter where your app runs, making it easier to upgrade to different environments later.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Actions are now available in the Canary channel and will ship in the next release of React.&lt;/p&gt;
&lt;h2 id=&quot;new-features-in-react-canary&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New Features in React Canary &lt;a href=&quot;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024#new-features-in-react-canary&quot; aria-label=&quot;Link for New Features in React Canary &quot; title=&quot;Link for New Features in React Canary &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We introduced &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2023/05/03/react-canaries&quot;&gt;React Canaries&lt;/a&gt; as an option to adopt individual new stable features as soon as their design is close to final, before they’re released in a stable semver version.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Canaries are a change to the way we develop React. Previously, features would be researched and built privately inside of Meta, so users would only see the final polished product when released to Stable. With Canaries, we’re building in public with the help of the community to finalize features we share in the React Labs blog series. This means you hear about new features sooner, as they’re being finalized instead of after they’re complete.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Server Components, Asset Loading, Document Metadata, and Actions have all landed in the React Canary, and we’ve added docs for these features on react.dev:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Directives&lt;/strong&gt;: &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rsc/use-client&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;use client&quot;&lt;/code&gt;&lt;/a&gt; and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/rsc/use-server&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;use server&quot;&lt;/code&gt;&lt;/a&gt; are bundler features designed for full-stack React frameworks. They mark the “split points” between the two environments: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;use client&quot;&lt;/code&gt; instructs the bundler to generate a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag (like &lt;a href=&quot;https://docs.astro.build/en/concepts/islands/#creating-an-island&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Astro Islands&lt;/a&gt;), while &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;use server&quot;&lt;/code&gt; tells the bundler to generate a POST endpoint (like &lt;a href=&quot;https://trpc.io/docs/concepts&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;tRPC Mutations&lt;/a&gt;). Together, they let you write reusable components that compose client-side interactivity with the related server-side logic.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Document Metadata&lt;/strong&gt;: we added built-in support for rendering &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/title&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;title&amp;gt;&lt;/code&gt;&lt;/a&gt;, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/meta&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;&lt;/a&gt;, and metadata &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/link&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;link&amp;gt;&lt;/code&gt;&lt;/a&gt; tags anywhere in your component tree. These work the same way in all environments, including fully client-side code, SSR, and RSC. This provides built-in support for features pioneered by libraries like &lt;a href=&quot;https://github.com/nfl/react-helmet&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Helmet&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Asset Loading&lt;/strong&gt;: we integrated Suspense with the loading lifecycle of resources such as stylesheets, fonts, and scripts so that React takes them into account to determine whether the content in elements like &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/style&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;style&amp;gt;&lt;/code&gt;&lt;/a&gt;, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/link&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;link&amp;gt;&lt;/code&gt;&lt;/a&gt;, and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/script&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;script&amp;gt;&lt;/code&gt;&lt;/a&gt; are ready to be displayed. We’ve also added new &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom#resource-preloading-apis&quot;&gt;Resource Loading APIs&lt;/a&gt; like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;preload&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;preinit&lt;/code&gt; to provide greater control for when a resource should load and initialize.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Actions&lt;/strong&gt;: As shared above, we’ve added Actions to manage sending data from the client to the server. You can add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;action&lt;/code&gt; to elements like &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/form&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;form/&amp;gt;&lt;/code&gt;&lt;/a&gt;, access the status with &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/hooks/useFormStatus&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useFormStatus&lt;/code&gt;&lt;/a&gt;, handle the result with &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useActionState&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useActionState&lt;/code&gt;&lt;/a&gt;, and optimistically update the UI with &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useOptimistic&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useOptimistic&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Since all of these features work together, it’s difficult to release them in the Stable channel individually. Releasing Actions without the complementary hooks for accessing form states would limit the practical usability of Actions. Introducing React Server Components without integrating Server Actions would complicate modifying data on the server.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Before we can release a set of features to the Stable channel, we need to ensure they work cohesively and developers have everything they need to use them in production. React Canaries allow us to develop these features individually, and release the stable APIs incrementally until the entire feature set is complete.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The current set of features in React Canary are complete and ready to release.&lt;/p&gt;
&lt;h2 id=&quot;the-next-major-version-of-react&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;The Next Major Version of React &lt;a href=&quot;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024#the-next-major-version-of-react&quot; aria-label=&quot;Link for The Next Major Version of React &quot; title=&quot;Link for The Next Major Version of React &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;After a couple of years of iteration, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react@canary&lt;/code&gt; is now ready to ship to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react@latest&lt;/code&gt;. The new features mentioned above are compatible with any environment your app runs in, providing everything needed for production use. Since Asset Loading and Document Metadata may be a breaking change for some apps, the next version of React will be a major version: &lt;strong class=&quot;font-bold&quot;&gt;React 19&lt;/strong&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;There’s still more to be done to prepare for release. In React 19, we’re also adding long-requested improvements which require breaking changes like support for Web Components. Our focus now is to land these changes, prepare for release, finalize docs for new features, and publish announcements for what’s included.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ll share more information about everything React 19 includes, how to adopt the new client features, and how to build support for React Server Components in the coming months.&lt;/p&gt;
&lt;h2 id=&quot;offscreen-renamed-to-activity&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Offscreen (renamed to Activity). &lt;a href=&quot;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024#offscreen-renamed-to-activity&quot; aria-label=&quot;Link for Offscreen (renamed to Activity). &quot; title=&quot;Link for Offscreen (renamed to Activity). &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Since our last update, we’ve renamed a capability we’re researching from “Offscreen” to “Activity”. The name “Offscreen” implied that it only applied to parts of the app that were not visible, but while researching the feature we realized that it’s possible for parts of the app to be visible and inactive, such as content behind a modal. The new name more closely reflects the behavior of marking certain parts of the app “active” or “inactive”.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Activity is still under research and our remaining work is to finalize the primitives that are exposed to library developers. We’ve deprioritized this area while we focus on shipping features that are more complete.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In addition to this update, our team has presented at conferences and made appearances on podcasts to speak more on our work and answer questions.&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a href=&quot;https://github.com/gsathya&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sathya Gunasekaran&lt;/a&gt; spoke about the React Compiler at the &lt;a href=&quot;https://www.youtube.com/watch?v=kjOacmVsLSE&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React India&lt;/a&gt; conference&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/team#dan-abramov&quot;&gt;Dan Abramov&lt;/a&gt; gave a talk at &lt;a href=&quot;https://www.youtube.com/watch?v=zMf_xeGPn6s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RemixConf&lt;/a&gt; titled “React from Another Dimension” which explores an alternative history of how React Server Components and Actions could have been created&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/team#dan-abramov&quot;&gt;Dan Abramov&lt;/a&gt; was interviewed on &lt;a href=&quot;https://changelog.com/jsparty/311&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;the Changelog’s JS Party podcast&lt;/a&gt; about React Server Components&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/team#matt-carroll&quot;&gt;Matt Carroll&lt;/a&gt; was interviewed on the &lt;a href=&quot;https://www.buzzsprout.com/2226499/14462424-interview-the-two-reacts-with-rachel-nabors-evan-bacon-and-matt-carroll&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Front-End Fire podcast&lt;/a&gt; where he discussed &lt;a href=&quot;https://overreacted.io/the-two-reacts/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;The Two Reacts&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks &lt;a href=&quot;https://twitter.com/potetotes&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lauren Tan&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/sophiebits&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sophie Alpert&lt;/a&gt;, &lt;a href=&quot;https://threads.net/someextent&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jason Bonta&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/Eli_White&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Eli White&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/_gsathya&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sathya Gunasekaran&lt;/a&gt; for reviewing this post.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks for reading, and &lt;a href=&quot;https://conf.react.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;see you at React Conf&lt;/a&gt;!&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React 19 RC Upgrade Guide&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2023/05/03/react-canaries&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Canaries: Enabling Incremental Feature Rollout Outside Meta&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024</link><guid isPermaLink="false">https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024</guid><pubDate>Wed, 14 Feb 2024 16:00:00 GMT</pubDate></item><item><title>React Canaries: Enabling Incremental Feature Rollout Outside Meta</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;May 3, 2023 by &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/sophiebits&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sophie Alpert&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Rick Hanlon&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sebastian Markbåge&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Andrew Clark&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’d like to offer the React community an option to adopt individual new features as soon as their design is close to final, before they’re released in a stable version—similar to how Meta has long used bleeding-edge versions of React internally. We are introducing a new officially supported &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/versioning-policy#canary-channel&quot;&gt;Canary release channel&lt;/a&gt;. It lets curated setups like frameworks decouple adoption of individual React features from the React release schedule.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;tldr&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;tl;dr &lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries#tldr&quot; aria-label=&quot;Link for tl;dr &quot; title=&quot;Link for tl;dr &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;We’re introducing an officially supported &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/versioning-policy#canary-channel&quot;&gt;Canary release channel&lt;/a&gt; for React. Since it’s officially supported, if any regressions land, we’ll treat them with a similar urgency to bugs in stable releases.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Canaries let you start using individual new React features before they land in the semver-stable releases.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Unlike the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/versioning-policy#experimental-channel&quot;&gt;Experimental&lt;/a&gt; channel, React Canaries only include features that we reasonably believe to be ready for adoption. We encourage frameworks to consider bundling pinned Canary React releases.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;We will announce breaking changes and new features on our blog as they land in Canary releases.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;As always, React continues to follow semver for every Stable release.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-react-features-are-usually-developed&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;How React features are usually developed &lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries#how-react-features-are-usually-developed&quot; aria-label=&quot;Link for How React features are usually developed &quot; title=&quot;Link for How React features are usually developed &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Typically, every React feature has gone through the same stages:&lt;/p&gt;
&lt;ol class=&quot;ms-6 my-3 list-decimal&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;We develop an initial version and prefix it with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;experimental_&lt;/code&gt; or &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unstable_&lt;/code&gt;. The feature is only available in the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;experimental&lt;/code&gt; release channel. At this point, the feature is expected to change significantly.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;We find a team at Meta willing to help us test this feature and provide feedback on it. This leads to a round of changes. As the feature becomes more stable, we work with more teams at Meta to try it out.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Eventually, we feel confident in the design. We remove the prefix from the API name, and make the feature available on the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;main&lt;/code&gt; branch by default, which most Meta products use. At this point, any team at Meta can use this feature.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;As we build confidence in the direction, we also post an RFC for the new feature. At this point we know the design works for a broad set of cases, but we might make some last minute adjustments.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;When we are close to cutting an open source release, we write documentation for the feature and finally release the feature in a stable React release.&lt;/li&gt;
&lt;/ol&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This playbook works well for most features we’ve released so far. However, there can be a significant gap between when the feature is generally ready to use (step 3) and when it is released in open source (step 5).&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;We’d like to offer the React community an option to follow the same approach as Meta, and adopt individual new features earlier (as they become available) without having to wait for the next release cycle of React.&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As always, all React features will eventually make it into a Stable release.&lt;/p&gt;
&lt;h2 id=&quot;can-we-just-do-more-minor-releases&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Can we just do more minor releases? &lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries#can-we-just-do-more-minor-releases&quot; aria-label=&quot;Link for Can we just do more minor releases? &quot; title=&quot;Link for Can we just do more minor releases? &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Generally, we &lt;em&gt;do&lt;/em&gt; use minor releases for introducing new features.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;However, this isn’t always possible. Sometimes, new features are interconnected with &lt;em&gt;other&lt;/em&gt; new features which have not yet been fully completed and that we’re still actively iterating on. We can’t release them separately because their implementations are related. We can’t version them separately because they affect the same packages (for example, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;). And we need to keep the ability to iterate on the pieces that aren’t ready without a flurry of major version releases, which semver would require us to do.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;At Meta, we’ve solved this problem by building React from the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;main&lt;/code&gt; branch, and manually updating it to a specific pinned commit every week. This is also the approach that React Native releases have been following for the last several years. Every &lt;em&gt;stable&lt;/em&gt; release of React Native is pinned to a specific commit from the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;main&lt;/code&gt; branch of the React repository. This lets React Native include important bugfixes and incrementally adopt new React features at the framework level without getting coupled to the global React release schedule.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We would like to make this workflow available to other frameworks and curated setups. For example, it lets a framework &lt;em&gt;on top of&lt;/em&gt; React include a React-related breaking change &lt;em&gt;before&lt;/em&gt; this breaking change gets included into a stable React release. This is particularly useful because some breaking changes only affect framework integrations. This lets a framework release such a change in its own minor version without breaking semver.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Rolling releases with the Canaries channel will allow us to have a tighter feedback loop and ensure that new features get comprehensive testing in the community. This workflow is closer to how TC39, the JavaScript standards committee, &lt;a href=&quot;https://tc39.es/process-document/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;handles changes in numbered stages&lt;/a&gt;. New React features may be available in frameworks built on React before they are in a React stable release, just as new JavaScript features ship in browsers before they are officially ratified as part of the specification.&lt;/p&gt;
&lt;h2 id=&quot;why-not-use-experimental-releases-instead&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Why not use experimental releases instead? &lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries#why-not-use-experimental-releases-instead&quot; aria-label=&quot;Link for Why not use experimental releases instead? &quot; title=&quot;Link for Why not use experimental releases instead? &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Although you &lt;em&gt;can&lt;/em&gt; technically use &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/versioning-policy#canary-channel&quot;&gt;Experimental releases&lt;/a&gt;, we recommend against using them in production because experimental APIs can undergo significant breaking changes on their way to stabilization (or can even be removed entirely). While Canaries can also contain mistakes (as with any release), going forward we plan to announce any significant breaking changes in Canaries on our blog. Canaries are the closest to the code Meta runs internally, so you can generally expect them to be relatively stable. However, you &lt;em&gt;do&lt;/em&gt; need to keep the version pinned and manually scan the GitHub commit log when updating between the pinned commits.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;We expect that most people using React outside a curated setup (like a framework) will want to continue using the Stable releases.&lt;/strong&gt; However, if you’re building a framework, you might want to consider bundling a Canary version of React pinned to a particular commit, and update it at your own pace. The benefit of that is that it lets you ship individual completed React features and bugfixes earlier for your users and at your own release schedule, similar to how React Native has been doing it for the last few years. The downside is that you would take on additional responsibility to review which React commits are being pulled in and communicate to your users which React changes are included with your releases.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you’re a framework author and want to try this approach, please get in touch with us.&lt;/p&gt;
&lt;h2 id=&quot;announcing-breaking-changes-and-new-features-early&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Announcing breaking changes and new features early &lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries#announcing-breaking-changes-and-new-features-early&quot; aria-label=&quot;Link for Announcing breaking changes and new features early &quot; title=&quot;Link for Announcing breaking changes and new features early &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Canary releases represent our best guess of what will go into the next stable React release at any given time.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Traditionally, we’ve only announced breaking changes at the &lt;em&gt;end&lt;/em&gt; of the release cycle (when doing a major release). Now that Canary releases are an officially supported way to consume React, we plan to shift towards announcing breaking changes and significant new features &lt;em&gt;as they land&lt;/em&gt; in Canaries. For example, if we merge a breaking change that will go out in a Canary, we will write a post about it on the React blog, including codemods and migration instructions if necessary. Then, if you’re a framework author cutting a major release that updates the pinned React canary to include that change, you can link to our blog post from your release notes. Finally, when a stable major version of React is ready, we will link to those already published blog posts, which we hope will help our team make progress faster.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We plan to document APIs as they land in Canaries—even if these APIs are not yet available outside of them. APIs that are only available in Canaries will be marked with a special note on the corresponding pages. This will include APIs like &lt;a href=&quot;https://github.com/reactjs/rfcs/pull/229&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt;&lt;/a&gt;, and some others (like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;cache&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createServerContext&lt;/code&gt;) which we’ll send RFCs for.&lt;/p&gt;
&lt;h2 id=&quot;canaries-must-be-pinned&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Canaries must be pinned &lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries#canaries-must-be-pinned&quot; aria-label=&quot;Link for Canaries must be pinned &quot; title=&quot;Link for Canaries must be pinned &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you decide to adopt the Canary workflow for your app or framework, make sure you always pin the &lt;em&gt;exact&lt;/em&gt; version of the Canary you’re using. Since Canaries are pre-releases, they may still include breaking changes.&lt;/p&gt;
&lt;h2 id=&quot;example-react-server-components&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Example: React Server Components &lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries#example-react-server-components&quot; aria-label=&quot;Link for Example: React Server Components &quot; title=&quot;Link for Example: React Server Components &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As we &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components&quot;&gt;announced in March&lt;/a&gt;, the React Server Components conventions have been finalized, and we do not expect significant breaking changes related to their user-facing API contract. However, we can’t release support for React Server Components in a stable version of React yet because we are still working on several intertwined framework-only features (such as &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#asset-loading&quot;&gt;asset loading&lt;/a&gt;) and expect more breaking changes there.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This means that React Server Components are ready to be adopted by frameworks. However, until the next major React release, the only way for a framework to adopt them is to ship a pinned Canary version of React. (To avoid bundling two copies of React, frameworks that wish to do this would need to enforce resolution of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt; to the pinned Canary they ship with their framework, and explain that to their users. As an example, this is what Next.js App Router does.)&lt;/p&gt;
&lt;h2 id=&quot;testing-libraries-against-both-stable-and-canary-versions&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Testing libraries against both Stable and Canary versions &lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries#testing-libraries-against-both-stable-and-canary-versions&quot; aria-label=&quot;Link for Testing libraries against both Stable and Canary versions &quot; title=&quot;Link for Testing libraries against both Stable and Canary versions &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We do not expect library authors to test every single Canary release since it would be prohibitively difficult. However, just as when we &lt;a href=&quot;https://legacy.reactjs.org/blog/2019/10/22/react-release-channels.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;originally introduced the different React pre-release channels three years ago&lt;/a&gt;, we encourage libraries to run tests against &lt;em&gt;both&lt;/em&gt; the latest Stable and latest Canary versions. If you see a change in behavior that wasn’t announced, please file a bug in the React repository so that we can help diagnose it. We expect that as this practice becomes widely adopted, it will reduce the amount of effort necessary to upgrade libraries to new major versions of React, since accidental regressions would be found as they land.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Strictly speaking, Canary is not a &lt;em&gt;new&lt;/em&gt; release channel—it used to be called Next. However, we’ve decided to rename it to avoid confusion with Next.js. We’re announcing it as a &lt;em&gt;new&lt;/em&gt; release channel to communicate the new expectations, such as Canaries being an officially supported way to use React.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;stable-releases-work-like-before&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Stable releases work like before &lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries#stable-releases-work-like-before&quot; aria-label=&quot;Link for Stable releases work like before &quot; title=&quot;Link for Stable releases work like before &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We are not introducing any changes to stable React releases.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Labs: What We&#39;ve Been Working On – February 2024&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Labs: What We&#39;ve Been Working On – March 2023&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2023/05/03/react-canaries</link><guid isPermaLink="false">https://react.dev/blog/2023/05/03/react-canaries</guid><pubDate>Tue, 02 May 2023 16:00:00 GMT</pubDate></item><item><title>React Labs: What We&#39;ve Been Working On – March 2023</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;March 22, 2023 by &lt;a href=&quot;https://twitter.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joseph Savona&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/joshcstory&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Josh Story&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/potetotes&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lauren Tan&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/mengdi_en&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mengdi Chen&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/SamuelSusla&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Samuel Susla&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/_gsathya&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sathya Gunasekaran&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sebastian Markbåge&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Andrew Clark&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React Labs posts, we write about projects in active research and development. We’ve made significant progress on them since our &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022&quot;&gt;last update&lt;/a&gt;, and we’d like to share what we learned.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;react-server-components&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Server Components &lt;a href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components&quot; aria-label=&quot;Link for React Server Components &quot; title=&quot;Link for React Server Components &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Server Components (or RSC) is a new application architecture designed by the React team.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve first shared our research on RSC in an &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2020/12/21/data-fetching-with-react-server-components&quot;&gt;introductory talk&lt;/a&gt; and an &lt;a href=&quot;https://github.com/reactjs/rfcs/pull/188&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RFC&lt;/a&gt;. To recap them, we are introducing a new kind of component—Server Components—that run ahead of time and are excluded from your JavaScript bundle. Server Components can run during the build, letting you read from the filesystem or fetch static content. They can also run on the server, letting you access your data layer without having to build an API. You can pass data by props from Server Components to the interactive Client Components in the browser.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;RSC combines the simple “request/response” mental model of server-centric Multi-Page Apps with the seamless interactivity of client-centric Single-Page Apps, giving you the best of both worlds.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Since our last update, we have merged the &lt;a href=&quot;https://github.com/reactjs/rfcs/blob/main/text/0188-server-components.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Server Components RFC&lt;/a&gt; to ratify the proposal. We resolved outstanding issues with the &lt;a href=&quot;https://github.com/reactjs/rfcs/blob/main/text/0227-server-module-conventions.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Server Module Conventions&lt;/a&gt; proposal, and reached consensus with our partners to go with the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&quot;use client&quot;&lt;/code&gt; convention. These documents also act as specification for what an RSC-compatible implementation should support.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The biggest change is that we introduced &lt;a href=&quot;https://github.com/reactjs/rfcs/pull/229&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;async&lt;/code&gt; / &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;await&lt;/code&gt;&lt;/a&gt; as the primary way to do data fetching from Server Components. We also plan to support data loading from the client by introducing a new Hook called &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;use&lt;/code&gt; that unwraps Promises. Although we can’t support &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;async / await&lt;/code&gt; in arbitrary components in client-only apps, we plan to add support for it when you structure your client-only app similar to how RSC apps are structured.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Now that we have data fetching pretty well sorted, we’re exploring the other direction: sending data from the client to the server, so that you can execute database mutations and implement forms. We’re doing this by letting you pass Server Action functions across the server/client boundary, which the client can then call, providing seamless RPC. Server Actions also give you progressively enhanced forms before JavaScript loads.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React Server Components has shipped in &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/creating-a-react-app#nextjs-app-router&quot;&gt;Next.js App Router&lt;/a&gt;. This showcases a deep integration of a router that really buys into RSC as a primitive, but it’s not the only way to build a RSC-compatible router and framework. There’s a clear separation for features provided by the RSC spec and implementation. React Server Components is meant as a spec for components that work across compatible React frameworks.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We generally recommend using an existing framework, but if you need to build your own custom framework, it is possible. Building your own RSC-compatible framework is not as easy as we’d like it to be, mainly due to the deep bundler integration needed. The current generation of bundlers are great for use on the client, but they weren’t designed with first-class support for splitting a single module graph between the server and the client. This is why we’re now partnering directly with bundler developers to get the primitives for RSC built-in.&lt;/p&gt;
&lt;h2 id=&quot;asset-loading&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Asset Loading &lt;a href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#asset-loading&quot; aria-label=&quot;Link for Asset Loading &quot; title=&quot;Link for Asset Loading &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/Suspense&quot;&gt;Suspense&lt;/a&gt; lets you specify what to display on the screen while the data or code for your components is still being loaded. This lets your users progressively see more content while the page is loading as well as during the router navigations that load more data and code. However, from the user’s perspective, data loading and rendering do not tell the whole story when considering whether new content is ready. By default, browsers load stylesheets, fonts, and images independently, which can lead to UI jumps and consecutive layout shifts.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re working to fully integrate Suspense with the loading lifecycle of stylesheets, fonts, and images, so that React takes them into account to determine whether the content is ready to be displayed. Without any change to the way you author your React components, updates will behave in a more coherent and pleasing manner. As an optimization, we will also provide a manual way to preload assets like fonts directly from components.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We are currently implementing these features and will have more to share soon.&lt;/p&gt;
&lt;h2 id=&quot;document-metadata&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Document Metadata &lt;a href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#document-metadata&quot; aria-label=&quot;Link for Document Metadata &quot; title=&quot;Link for Document Metadata &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Different pages and screens in your app may have different metadata like the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;title&amp;gt;&lt;/code&gt; tag, description, and other &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags specific to this screen. From the maintenance perspective, it’s more scalable to keep this information close to the React component for that page or screen. However, the HTML tags for this metadata need to be in the document &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; which is typically rendered in a component at the very root of your app.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Today, people solve this problem with one of the two techniques.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;One technique is to render a special third-party component that moves &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;, and other tags inside it into the document &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. This works for major browsers but there are many clients which do not run client-side JavaScript, such as Open Graph parsers, and so this technique is not universally suitable.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Another technique is to server-render the page in two parts. First, the main content is rendered and all such tags are collected. Then, the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; is rendered with these tags. Finally, the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; and the main content are sent to the browser. This approach works, but it prevents you from taking advantage of the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/server/renderToReadableStream&quot;&gt;React 18’s Streaming Server Renderer&lt;/a&gt; because you’d have to wait for all content to render before sending the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This is why we’re adding built-in support for rendering &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;, and metadata &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tags anywhere in your component tree out of the box. It would work the same way in all environments, including fully client-side code, SSR, and in the future, RSC. We will share more details about this soon.&lt;/p&gt;
&lt;h2 id=&quot;react-optimizing-compiler&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Optimizing Compiler &lt;a href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-optimizing-compiler&quot; aria-label=&quot;Link for React Optimizing Compiler &quot; title=&quot;Link for React Optimizing Compiler &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Since our previous update we’ve been actively iterating on the design of &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022#react-compiler&quot;&gt;React Forget&lt;/a&gt;, an optimizing compiler for React. We’ve previously talked about it as an “auto-memoizing compiler”, and that is true in some sense. But building the compiler has helped us understand React’s programming model even more deeply. A better way to understand React Forget is as an automatic &lt;em&gt;reactivity&lt;/em&gt; compiler.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The core idea of React is that developers define their UI as a function of the current state. You work with plain JavaScript values — numbers, strings, arrays, objects — and use standard JavaScript idioms — if/else, for, etc — to describe your component logic. The mental model is that React will re-render whenever the application state changes. We believe this simple mental model and keeping close to JavaScript semantics is an important principle in React’s programming model.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The catch is that React can sometimes be &lt;em&gt;too&lt;/em&gt; reactive: it can re-render too much. For example, in JavaScript we don’t have cheap ways to compare if two objects or arrays are equivalent (having the same keys and values), so creating a new object or array on each render may cause React to do more work than it strictly needs to. This means developers have to explicitly memoize components so as to not over-react to changes.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Our goal with React Forget is to ensure that React apps have just the right amount of reactivity by default: that apps re-render only when state values &lt;em&gt;meaningfully&lt;/em&gt; change. From an implementation perspective this means automatically memoizing, but we believe that the reactivity framing is a better way to understand React and Forget. One way to think about this is that React currently re-renders when object identity changes. With Forget, React re-renders when the semantic value changes — but without incurring the runtime cost of deep comparisons.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In terms of concrete progress, since our last update we have substantially iterated on the design of the compiler to align with this automatic reactivity approach and to incorporate feedback from using the compiler internally. After some significant refactors to the compiler starting late last year, we’ve now begun using the compiler in production in limited areas at Meta. We plan to open-source it once we’ve proved it in production.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Finally, a lot of people have expressed interest in how the compiler works. We’re looking forward to sharing a lot more details when we prove the compiler and open-source it. But there are a few bits we can share now:&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The core of the compiler is almost completely decoupled from Babel, and the core compiler API is (roughly) old AST in, new AST out (while retaining source location data). Under the hood we use a custom code representation and transformation pipeline in order to do low-level semantic analysis. However, the primary public interface to the compiler will be via Babel and other build system plugins. For ease of testing we currently have a Babel plugin which is a very thin wrapper that calls the compiler to generate a new version of each function and swap it in.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As we refactored the compiler over the last few months, we wanted to focus on refining the core compilation model to ensure we could handle complexities such as conditionals, loops, reassignment, and mutation. However, JavaScript has a lot of ways to express each of those features: if/else, ternaries, for, for-in, for-of, etc. Trying to support the full language up-front would have delayed the point where we could validate the core model. Instead, we started with a small but representative subset of the language: let/const, if/else, for loops, objects, arrays, primitives, function calls, and a few other features. As we gained confidence in the core model and refined our internal abstractions, we expanded the supported language subset. We’re also explicit about syntax we don’t yet support, logging diagnostics and skipping compilation for unsupported input. We have utilities to try the compiler on Meta’s codebases and see what unsupported features are most common so we can prioritize those next. We’ll continue incrementally expanding towards supporting the whole language.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Making plain JavaScript in React components reactive requires a compiler with a deep understanding of semantics so that it can understand exactly what the code is doing. By taking this approach, we’re creating a system for reactivity within JavaScript that lets you write product code of any complexity with the full expressivity of the language, instead of being limited to a domain specific language.&lt;/p&gt;
&lt;h2 id=&quot;offscreen-rendering&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Offscreen Rendering &lt;a href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#offscreen-rendering&quot; aria-label=&quot;Link for Offscreen Rendering &quot; title=&quot;Link for Offscreen Rendering &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Offscreen rendering is an upcoming capability in React for rendering screens in the background without additional performance overhead. You can think of it as a version of the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/content-visibility&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;content-visibility&lt;/code&gt; CSS property&lt;/a&gt; that works not only for DOM elements but React components, too. During our research, we’ve discovered a variety of use cases:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;A router can prerender screens in the background so that when a user navigates to them, they’re instantly available.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;A tab switching component can preserve the state of hidden tabs, so the user can switch between them without losing their progress.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;A virtualized list component can prerender additional rows above and below the visible window.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;When opening a modal or popup, the rest of the app can be put into “background” mode so that events and updates are disabled for everything except the modal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Most React developers will not interact with React’s offscreen APIs directly. Instead, offscreen rendering will be integrated into things like routers and UI libraries, and then developers who use those libraries will automatically benefit without additional work.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The idea is that you should be able to render any React tree offscreen without changing the way you write your components. When a component is rendered offscreen, it does not actually &lt;em&gt;mount&lt;/em&gt; until the component becomes visible — its effects are not fired. For example, if a component uses &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffect&lt;/code&gt; to log analytics when it appears for the first time, prerendering won’t mess up the accuracy of those analytics. Similarly, when a component goes offscreen, its effects are unmounted, too. A key feature of offscreen rendering is that you can toggle the visibility of a component without losing its state.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Since our last update, we’ve tested an experimental version of prerendering internally at Meta in our React Native apps on Android and iOS, with positive performance results. We’ve also improved how offscreen rendering works with Suspense — suspending inside an offscreen tree will not trigger Suspense fallbacks. Our remaining work involves finalizing the primitives that are exposed to library developers. We expect to publish an RFC later this year, alongside an experimental API for testing and feedback.&lt;/p&gt;
&lt;h2 id=&quot;transition-tracing&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Transition Tracing &lt;a href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#transition-tracing&quot; aria-label=&quot;Link for Transition Tracing &quot; title=&quot;Link for Transition Tracing &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The Transition Tracing API lets you detect when &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useTransition&quot;&gt;React Transitions&lt;/a&gt; become slower and investigate why they may be slow. Following our last update, we have completed the initial design of the API and published an &lt;a href=&quot;https://github.com/reactjs/rfcs/pull/238&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;RFC&lt;/a&gt;. The basic capabilities have also been implemented. The project is currently on hold. We welcome feedback on the RFC and look forward to resuming its development to provide a better performance measurement tool for React. This will be particularly useful with routers built on top of React Transitions, like the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/creating-a-react-app#nextjs-app-router&quot;&gt;Next.js App Router&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In addition to this update, our team has made recent guest appearances on community podcasts and livestreams to speak more on our work and answer questions.&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joe Savona&lt;/a&gt; were interviewed by &lt;a href=&quot;https://www.youtube.com/watch?v=h7tur48JSaw&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Kent C. Dodds on his YouTube channel&lt;/a&gt;, where they discussed concerns around React Server Components.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joe Savona&lt;/a&gt; were guests on the &lt;a href=&quot;https://jsparty.fm/267&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;JSParty podcast&lt;/a&gt; and shared their thoughts about the future of React.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks to &lt;a href=&quot;https://twitter.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Andrew Clark&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/mcc_abe&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dave McCabe&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/lunaleaps&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Luna Wei&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/DevRelSean&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sean Keegan&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/sebsilbermann&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sebastian Silbermann&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/sethwebster&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Seth Webster&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/sophiebits&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sophie Alpert&lt;/a&gt; for reviewing this post.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks for reading, and see you in the next update!&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2023/05/03/react-canaries&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Canaries: Enabling Incremental Feature Rollout Outside Meta&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;Introducing react.dev&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023</link><guid isPermaLink="false">https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023</guid><pubDate>Tue, 21 Mar 2023 16:00:00 GMT</pubDate></item><item><title>Introducing react.dev</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;March 16, 2023 by &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/rachelnabors&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Rachel Nabors&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Today we are thrilled to launch &lt;a href=&quot;https://react.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react.dev&lt;/a&gt;, the new home for React and its documentation. In this post, we would like to give you a tour of the new site.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;tldr&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;tl;dr &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#tldr&quot; aria-label=&quot;Link for tl;dr &quot; title=&quot;Link for tl;dr &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;The new React site (&lt;a href=&quot;https://react.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react.dev&lt;/a&gt;) teaches modern React with function components and Hooks.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;We’ve included diagrams, illustrations, challenges, and over 600 new interactive examples.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;The previous React documentation site has now moved to &lt;a href=&quot;https://legacy.reactjs.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;legacy.reactjs.org&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;new-site-new-domain-new-homepage&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New site, new domain, new homepage &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#new-site-new-domain-new-homepage&quot; aria-label=&quot;Link for New site, new domain, new homepage &quot; title=&quot;Link for New site, new domain, new homepage &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;First, a little bit of housekeeping.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To celebrate the launch of the new docs and, more importantly, to clearly separate the old and the new content, we’ve moved to the shorter &lt;a href=&quot;https://react.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react.dev&lt;/a&gt; domain. The old &lt;a href=&quot;https://reactjs.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;reactjs.org&lt;/a&gt; domain will now redirect here.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The old React docs are now archived at &lt;a href=&quot;https://legacy.reactjs.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;legacy.reactjs.org&lt;/a&gt;. All existing links to the old content will automatically redirect there to avoid “breaking the web”, but the legacy site will not get many more updates.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Believe it or not, React will soon be ten years old. In JavaScript years, it’s like a whole century! We’ve &lt;a href=&quot;https://react.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;refreshed the React homepage&lt;/a&gt; to reflect why we think React is a great way to create user interfaces today, and updated the getting started guides to more prominently mention modern React-based frameworks.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you haven’t seen the new homepage yet, check it out!&lt;/p&gt;
&lt;h2 id=&quot;going-all-in-on-modern-react-with-hooks&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Going all-in on modern React with Hooks &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#going-all-in-on-modern-react-with-hooks&quot; aria-label=&quot;Link for Going all-in on modern React with Hooks &quot; title=&quot;Link for Going all-in on modern React with Hooks &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When we released React Hooks in 2018, the Hooks docs assumed the reader is familiar with class components. This helped the community adopt Hooks very swiftly, but after a while the old docs failed to serve the new readers. New readers had to learn React twice: once with class components and then once again with Hooks.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;The new docs teach React with Hooks from the beginning.&lt;/strong&gt; The docs are divided in two main sections:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn&quot;&gt;Learn React&lt;/a&gt;&lt;/strong&gt; is a self-paced course that teaches React from scratch.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference&quot;&gt;API Reference&lt;/a&gt;&lt;/strong&gt; provides the details and usage examples for every React API.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Let’s have a closer look at what you can find in each section.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;There are still a few rare class component use cases that do not yet have a Hook-based equivalent. Class components remain supported, and are documented in the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/legacy&quot;&gt;Legacy API&lt;/a&gt; section of the new site.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;quick-start&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Quick start &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#quick-start&quot; aria-label=&quot;Link for Quick start &quot; title=&quot;Link for Quick start &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The Learn section begins with the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn&quot;&gt;Quick Start&lt;/a&gt; page. It is a short introductory tour of React. It introduces the syntax for concepts like components, props, and state, but doesn’t go into much detail on how to use them.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you like to learn by doing, we recommend checking out the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/tutorial-tic-tac-toe&quot;&gt;Tic-Tac-Toe Tutorial&lt;/a&gt; next. It walks you through building a little game with React, while teaching the skills you’ll use every day. Here’s what you’ll build:&lt;/p&gt;
&lt;/div&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/App.js&quot; type=&quot;button&quot;&gt;App.js&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:R9iicq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;App.js&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for App.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useState&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Square&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onSquareClick&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;square&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;onSquareClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Board&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;xIsNext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onPlay&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;calculateWinner&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; || &lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;nextSquares&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;xIsNext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-plain&quot;&gt;nextSquares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;X&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-plain&quot;&gt;nextSquares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;O&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-definition&quot;&gt;onPlay&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;nextSquares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;winner&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;calculateWinner&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;winner&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-plain&quot;&gt;status&lt;/span&gt; = &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;Winner: &#39;&lt;/span&gt; + &lt;span class=&quot;sp-syntax-plain&quot;&gt;winner&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-plain&quot;&gt;status&lt;/span&gt; = &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;Next player: &#39;&lt;/span&gt; + &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;xIsNext&lt;/span&gt; ? &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;X&#39;&lt;/span&gt; : &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;O&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;board-row&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Square&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onSquareClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Square&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onSquareClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Square&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onSquareClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;board-row&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Square&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onSquareClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Square&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onSquareClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Square&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onSquareClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;board-row&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Square&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onSquareClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Square&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onSquareClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Square&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onSquareClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Game&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;history&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setHistory&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;currentMove&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setCurrentMove&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;xIsNext&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;currentMove&lt;/span&gt; % &lt;span class=&quot;sp-syntax-static&quot;&gt;2&lt;/span&gt; === &lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;currentSquares&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;history&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;currentMove&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handlePlay&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;nextSquares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;nextHistory&lt;/span&gt; = &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;history&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;currentMove&lt;/span&gt; + &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;nextSquares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-definition&quot;&gt;setHistory&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;nextHistory&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-definition&quot;&gt;setCurrentMove&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;nextHistory&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;length&lt;/span&gt; - &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;jumpTo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;nextMove&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-definition&quot;&gt;setCurrentMove&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;nextMove&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;moves&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;history&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;move&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;move&lt;/span&gt; &amp;gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-plain&quot;&gt;description&lt;/span&gt; = &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;Go to move #&#39;&lt;/span&gt; + &lt;span class=&quot;sp-syntax-plain&quot;&gt;move&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-plain&quot;&gt;description&lt;/span&gt; = &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;Go to game start&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;key&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;move&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;jumpTo&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;move&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;game&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;game-board&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Board&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;xIsNext&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;xIsNext&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;squares&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;currentSquares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onPlay&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;handlePlay&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;game-info&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;ol&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;moves&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;ol&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;calculateWinner&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;lines&lt;/span&gt; = &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;i&lt;/span&gt; = &lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;i&lt;/span&gt; &amp;lt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;lines&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;i&lt;/span&gt;++&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; === &lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; === &lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;squares&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button translate=&quot;yes&quot; class=&quot;sandpack-expand flex text-base justify-between dark:border-card-dark bg-wash dark:bg-card-dark items-center z-10 p-1 w-full order-2 xl:order-last border-b-1 relative top-0&quot;&gt;&lt;span class=&quot;flex p-2 focus:outline-none text-primary dark:text-primary-dark leading-[20px]&quot;&gt;&lt;svg class=&quot;rotate-0 inline me-1.5 text-xl&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;Show more&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’d also like to highlight &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/thinking-in-react&quot;&gt;Thinking in React&lt;/a&gt;—that’s the tutorial that made React “click” for many of us. &lt;strong class=&quot;font-bold&quot;&gt;We’ve updated both of these classic tutorials to use function components and Hooks,&lt;/strong&gt; so they’re as good as new.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The example above is a &lt;em&gt;sandbox&lt;/em&gt;. We’ve added a lot of sandboxes—over 600!—everywhere throughout the site. You can edit any sandbox, or press “Fork” in the upper right corner to open it in a separate tab. Sandboxes let you quickly play with the React APIs, explore your ideas, and check your understanding.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;learn-react-step-by-step&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Learn React step by step &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#learn-react-step-by-step&quot; aria-label=&quot;Link for Learn React step by step &quot; title=&quot;Link for Learn React step by step &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’d like everyone in the world to have an equal opportunity to learn React for free on their own.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This is why the Learn section is organized like a self-paced course split into chapters. The first two chapters describe the fundamentals of React. If you’re new to React, or want to refresh it in your memory, start here:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/describing-the-ui&quot;&gt;Describing the UI&lt;/a&gt;&lt;/strong&gt; teaches how to display information with components.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/adding-interactivity&quot;&gt;Adding Interactivity&lt;/a&gt;&lt;/strong&gt; teaches how to update the screen in response to user input.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The next two chapters are more advanced, and will give you a deeper insight into the trickier parts:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/managing-state&quot;&gt;Managing State&lt;/a&gt;&lt;/strong&gt; teaches how to organize your logic as your app grows in complexity.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/escape-hatches&quot;&gt;Escape Hatches&lt;/a&gt;&lt;/strong&gt; teaches how you can “step outside” React, and when it makes most sense to do so.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Every chapter consists of several related pages. Most of these pages teach a specific skill or a technique—for example, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/writing-markup-with-jsx&quot;&gt;Writing Markup with JSX&lt;/a&gt;, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/updating-objects-in-state&quot;&gt;Updating Objects in State&lt;/a&gt;, or &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/sharing-state-between-components&quot;&gt;Sharing State Between Components&lt;/a&gt;. Some of the pages focus on explaining an idea—like &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/render-and-commit&quot;&gt;Render and Commit&lt;/a&gt;, or &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/state-as-a-snapshot&quot;&gt;State as a Snapshot&lt;/a&gt;. And there are a few, like &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/you-might-not-need-an-effect&quot;&gt;You Might Not Need an Effect&lt;/a&gt;, that share our suggestions based on what we’ve learned over these years.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You don’t have to read these chapters as a sequence. Who has the time for this?! But you could. Pages in the Learn section only rely on concepts introduced by the earlier pages. If you want to read it like a book, go for it!&lt;/p&gt;
&lt;h3 id=&quot;check-your-understanding-with-challenges&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Check your understanding with challenges &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#check-your-understanding-with-challenges&quot; aria-label=&quot;Link for Check your understanding with challenges &quot; title=&quot;Link for Check your understanding with challenges &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Most pages in the Learn section end with a few challenges to check your understanding. For example, here are a few challenges from the page about &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/conditional-rendering#challenges&quot;&gt;Conditional Rendering&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You don’t have to solve them right now! Unless you &lt;em&gt;really&lt;/em&gt; want to.&lt;/p&gt;
&lt;/div&gt;&lt;div class=&quot;max-w-7xl mx-auto py-4 w-full&quot;&gt;&lt;div class=&quot;border-gray-10 bg-card dark:bg-card-dark shadow-inner rounded-none -mx-5 sm:mx-auto sm:rounded-2xl&quot;&gt;&lt;div class=&quot;py-2 px-5 sm:px-8 pb-0 md:pb-0&quot;&gt;&lt;div class=&quot;flex items-center justify-between&quot;&gt;&lt;div class=&quot;overflow-hidden&quot;&gt;&lt;div class=&quot;flex relative transition-transform content-box overflow-x-auto&quot;&gt;&lt;button class=&quot;py-2 me-4 text-base border-b-4 duration-100 ease-in transition whitespace-nowrap text-ellipsis text-link border-link hover:text-link dark:text-link-dark dark:border-link-dark dark:hover:text-link-dark&quot;&gt;1&lt;!-- --&gt;. &lt;!-- --&gt;Show an icon for incomplete items with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;? :&lt;/code&gt; &lt;/button&gt;&lt;button class=&quot;py-2 me-4 text-base border-b-4 duration-100 ease-in transition whitespace-nowrap text-ellipsis&quot;&gt;2&lt;!-- --&gt;. &lt;!-- --&gt;Show the item importance with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;amp;&amp;amp;&lt;/code&gt; &lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex z-10 pb-2 ps-2&quot;&gt;&lt;button aria-label=&quot;Scroll left&quot; class=&quot;bg-secondary-button dark:bg-secondary-button-dark h-8 px-2 rounded-l rtl:rounded-r rtl:rounded-l-none border-gray-20 border-r rtl:border-l rtl:border-r-0 text-gray-30&quot;&gt;&lt;svg class=&quot;rotate-90 rtl:-rotate-90&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/button&gt;&lt;button aria-label=&quot;Scroll right&quot; class=&quot;bg-secondary-button dark:bg-secondary-button-dark h-8 px-2 rounded-e text-primary dark:text-primary-dark&quot;&gt;&lt;svg class=&quot;-rotate-90 rtl:rotate-90&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;p-5 sm:py-8 sm:px-8&quot;&gt;&lt;div&gt;&lt;h4 id=&quot;show-an-icon-for-incomplete-items-with--&quot; class=&quot;mdx-heading text-xl text-primary dark:text-primary-dark mb-2 mt-0 font-medium text-xl font-display font-bold leading-9 my-4&quot;&gt;&lt;div class=&quot;font-bold block md:inline&quot;&gt;Challenge&lt;!-- --&gt; &lt;!-- --&gt;1&lt;!-- --&gt; of&lt;!-- --&gt; &lt;!-- --&gt;2&lt;span class=&quot;text-primary dark:text-primary-dark&quot;&gt;: &lt;/span&gt;&lt;/div&gt;Show an icon for incomplete items with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;? :&lt;/code&gt; &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#show-an-icon-for-incomplete-items-with--&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Use the conditional operator (&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;cond ? a : b&lt;/code&gt;) to render a ❌ if &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;isPacked&lt;/code&gt; isn’t &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;true&lt;/code&gt;.&lt;/p&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/App.js&quot; type=&quot;button&quot;&gt;App.js&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:R4pd34cq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;App.js&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for App.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;isPacked&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;item&quot;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;isPacked&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;✅&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;PackingList&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;section&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Sally Ride&#39;s Packing List&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Item&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;isPacked&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;Space suit&quot;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Item&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;isPacked&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;Helmet with a golden leaf&quot;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Item&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;isPacked&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;sp-syntax-property&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;Photo of Tam&quot;&lt;/span&gt;
        &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;section&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button translate=&quot;yes&quot; class=&quot;sandpack-expand flex text-base justify-between dark:border-card-dark bg-wash dark:bg-card-dark items-center z-10 p-1 w-full order-2 xl:order-last border-b-1 relative top-0&quot;&gt;&lt;span class=&quot;flex p-2 focus:outline-none text-primary dark:text-primary-dark leading-[20px]&quot;&gt;&lt;svg class=&quot;rotate-0 inline me-1.5 text-xl&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;Show more&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;/div&gt;&lt;div class=&quot;flex justify-between items-center mt-4&quot;&gt;&lt;button class=&quot;me-2 text-base leading-tight font-bold rounded-full py-2 px-4 focus:outline focus:outline-offset-2 focus:outline-link dark:focus:outline-link-dark inline-flex items-center my-1 bg-transparent text-primary dark:text-primary-dark active:text-primary shadow-secondary-button-stroke dark:shadow-secondary-button-stroke-dark hover:bg-gray-40/5 active:bg-gray-40/10  hover:dark:bg-gray-60/5 active:dark:bg-gray-60/10&quot;&gt;&lt;svg class=&quot;inline me-1.5&quot; width=&quot;0.75em&quot; height=&quot;0.75em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M2.21908 8.74479V12.7448H0.885742V0.078125H7.14041C7.26418 0.0781911 7.3855 0.112714 7.49076 0.177827C7.59602 0.242939 7.68108 0.336071 7.73641 0.446792L8.21908 1.41146H12.2191C12.3959 1.41146 12.5655 1.4817 12.6905 1.60672C12.8155 1.73174 12.8857 1.90131 12.8857 2.07812V9.41146C12.8857 9.58827 12.8155 9.75784 12.6905 9.88286C12.5655 10.0079 12.3959 10.0781 12.2191 10.0781H7.96441C7.84063 10.0781 7.71932 10.0435 7.61406 9.97842C7.50879 9.91331 7.42374 9.82018 7.36841 9.70946L6.88574 8.74479H2.21908ZM2.21908 1.41146V7.41146H7.70974L8.37641 8.74479H11.5524V2.74479H7.39508L6.72841 1.41146H2.21908Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;!-- --&gt;Show solution&lt;/button&gt;&lt;button class=&quot;bg-link dark:bg-link-dark text-base leading-tight font-bold rounded-full py-2 px-4 focus:outline focus:outline-offset-2 focus:outline-link dark:focus:outline-link-dark inline-flex items-center my-1 bg-link border-link text-white hover:bg-link focus:bg-link active:bg-link&quot;&gt;Next &lt;!-- --&gt;Challenge&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;block ms-1.5 rtl:rotate-180&quot;&gt;&lt;path d=&quot;M6.86612 13.6161C6.37796 14.1043 6.37796 14.8957 6.86612 15.3839C7.35427 15.872 8.14572 15.872 8.63388 15.3839L13.1339 10.8839C13.622 10.3957 13.622 9.60428 13.1339 9.11612L8.63388 4.61612C8.14572 4.12797 7.35427 4.12797 6.86612 4.61612C6.37796 5.10428 6.37796 5.89573 6.86612 6.38388L10.4822 10L6.86612 13.6161Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Notice the “Show solution” button in the left bottom corner. It’s handy if you want to check yourself!&lt;/p&gt;
&lt;h3 id=&quot;build-an-intuition-with-diagrams-and-illustrations&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Build an intuition with diagrams and illustrations &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#build-an-intuition-with-diagrams-and-illustrations&quot; aria-label=&quot;Link for Build an intuition with diagrams and illustrations &quot; title=&quot;Link for Build an intuition with diagrams and illustrations &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When we couldn’t figure out how to explain something with code and words alone, we’ve added diagrams that help provide some intuition. For example, here is one of the diagrams from &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/preserving-and-resetting-state&quot;&gt;Preserving and Resetting State&lt;/a&gt;:&lt;/p&gt;
&lt;figure class=&quot;flex flex-col px-0 p-0 sm:p-10 first:mt-0 mt-10 sm:mt-0 justify-center items-center&quot;&gt;&lt;div class=&quot;dark-image&quot;&gt;&lt;img alt=&quot;Diagram with three sections, with an arrow transitioning each section in between. The first section contains a React component labeled &#39;div&#39; with a single child labeled &#39;section&#39;, which has a single child labeled &#39;Counter&#39; containing a state bubble labeled &#39;count&#39; with value 3. The middle section has the same &#39;div&#39; parent, but the child components have now been deleted, indicated by a yellow &#39;proof&#39; image. The third section has the same &#39;div&#39; parent again, now with a new child labeled &#39;div&#39;, highlighted in yellow, also with a new child labeled &#39;Counter&#39; containing a state bubble labeled &#39;count&#39; with value 0, all highlighted in yellow.&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;350&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fpreserving_state_diff_same_pt1.dark.png&amp;amp;w=828&amp;amp;q=75 1x, /_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fpreserving_state_diff_same_pt1.dark.png&amp;amp;w=1920&amp;amp;q=75 2x&quot; src=&quot;https://react.dev/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fpreserving_state_diff_same_pt1.dark.png&amp;amp;w=1920&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/div&gt;&lt;div class=&quot;light-image&quot;&gt;&lt;img alt=&quot;Diagram with three sections, with an arrow transitioning each section in between. The first section contains a React component labeled &#39;div&#39; with a single child labeled &#39;section&#39;, which has a single child labeled &#39;Counter&#39; containing a state bubble labeled &#39;count&#39; with value 3. The middle section has the same &#39;div&#39; parent, but the child components have now been deleted, indicated by a yellow &#39;proof&#39; image. The third section has the same &#39;div&#39; parent again, now with a new child labeled &#39;div&#39;, highlighted in yellow, also with a new child labeled &#39;Counter&#39; containing a state bubble labeled &#39;count&#39; with value 0, all highlighted in yellow.&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;350&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fpreserving_state_diff_same_pt1.png&amp;amp;w=828&amp;amp;q=75 1x, /_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fpreserving_state_diff_same_pt1.png&amp;amp;w=1920&amp;amp;q=75 2x&quot; src=&quot;https://react.dev/_next/image?url=%2Fimages%2Fdocs%2Fdiagrams%2Fpreserving_state_diff_same_pt1.png&amp;amp;w=1920&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/div&gt;&lt;div class=&quot;w-full flex justify-center&quot;&gt;&lt;figcaption class=&quot;p-1 sm:p-2 mt-0 sm:mt-0 text-gray-40 text-base lg:text-lg text-center leading-tight table-caption max-w-lg&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;section&lt;/code&gt; changes to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;div&lt;/code&gt;, the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;section&lt;/code&gt; is deleted and the new &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;div&lt;/code&gt; is added&lt;/p&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You’ll also see some illustrations throughout the docs—here’s one of the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/render-and-commit#epilogue-browser-paint&quot;&gt;browser painting the screen&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;&lt;div class=&quot;relative group before:absolute before:-inset-y-16 before:inset-x-0 my-16 mx-0 2xl:mx-auto max-w-4xl 2xl:max-w-6xl&quot;&gt;&lt;figure class=&quot;my-8 flex justify-center&quot;&gt;&lt;img src=&quot;https://react.dev/images/docs/illustrations/i_browser-paint.png&quot; alt=&quot;A browser painting &#39;still life with card element&#39;.&quot; style=&quot;max-height:300px&quot; class=&quot;rounded-lg&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;div class=&quot;sr-only group-hover:not-sr-only group-focus-within:not-sr-only hover:sr-only&quot;&gt;&lt;p class=&quot;bg-card dark:bg-card-dark text-center text-sm text-secondary dark:text-secondary-dark leading-tight p-2 rounded-lg absolute start-1/2 -top-4 -translate-x-1/2 -translate-y-full group-hover:flex group-hover:opacity-100 after:content-[&#39;&#39;] after:absolute after:start-1/2 after:top-[95%] after:-translate-x-1/2 after:border-8 after:border-x-transparent after:border-b-transparent after:border-t-card after:dark:border-t-card-dark opacity-0 transition-opacity duration-300&quot;&gt;&lt;cite&gt;Illustrated by&lt;!-- --&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noreferrer&quot; class=&quot;text-link dark:text-link-dark&quot; href=&quot;https://nearestnabors.com/&quot;&gt;Rachel Lee Nabors&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve confirmed with the browser vendors that this depiction is 100% scientifically accurate.&lt;/p&gt;
&lt;h2 id=&quot;a-new-detailed-api-reference&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;A new, detailed API Reference &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#a-new-detailed-api-reference&quot; aria-label=&quot;Link for A new, detailed API Reference &quot; title=&quot;Link for A new, detailed API Reference &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react&quot;&gt;API Reference&lt;/a&gt;, every React API now has a dedicated page. This includes all kinds of APIs:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Built-in Hooks like &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useState&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useState&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Built-in components like &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/Suspense&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Built-in browser components like &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/components/input&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;input&amp;gt;&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Framework-oriented APIs like &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/server/renderToReadableStream&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToPipeableStream&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Other React APIs like &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/memo&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;memo&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You’ll notice that every API page is split into at least two segments: &lt;em&gt;Reference&lt;/em&gt; and &lt;em&gt;Usage&lt;/em&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useState#reference&quot;&gt;Reference&lt;/a&gt; describes the formal API signature by listing its arguments and return values. It’s concise, but it can feel a bit abstract if you’re not familiar with that API. It describes what an API does, but not how to use it.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useState#usage&quot;&gt;Usage&lt;/a&gt; shows why and how you would use this API in practice, like a colleague or a friend might explain. It shows the &lt;strong class=&quot;font-bold&quot;&gt;canonical scenarios for how each API was meant to be used by the React team.&lt;/strong&gt; We’ve added color-coded snippets, examples of using different APIs together, and recipes that you can copy and paste from:&lt;/p&gt;
&lt;/div&gt;&lt;div class=&quot;max-w-7xl mx-auto py-4 w-full&quot;&gt;&lt;div class=&quot;border-gray-10 bg-card dark:bg-card-dark shadow-inner rounded-none -mx-5 sm:mx-auto sm:rounded-2xl&quot;&gt;&lt;div class=&quot;py-2 px-5 sm:px-8 pb-0 md:pb-0&quot;&gt;&lt;h4 id=&quot;examples-basic&quot; class=&quot;mdx-heading mb-2 leading-10 relative text-xl text-purple-50 dark:text-purple-30 text-xl font-display font-bold leading-9 my-4&quot;&gt;Basic useState examples&lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#examples-basic&quot; aria-label=&quot;Link for Basic useState examples&quot; title=&quot;Link for Basic useState examples&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class=&quot;flex items-center justify-between&quot;&gt;&lt;div class=&quot;overflow-hidden&quot;&gt;&lt;div class=&quot;flex relative transition-transform content-box overflow-x-auto&quot;&gt;&lt;button class=&quot;py-2 me-4 text-base border-b-4 duration-100 ease-in transition whitespace-nowrap text-ellipsis text-purple-50 border-purple-50 hover:text-purple-50 dark:text-purple-30 dark:border-purple-30 dark:hover:text-purple-30&quot;&gt;1&lt;!-- --&gt;. &lt;!-- --&gt;Counter (number) &lt;/button&gt;&lt;button class=&quot;py-2 me-4 text-base border-b-4 duration-100 ease-in transition whitespace-nowrap text-ellipsis&quot;&gt;2&lt;!-- --&gt;. &lt;!-- --&gt;Text field (string) &lt;/button&gt;&lt;button class=&quot;py-2 me-4 text-base border-b-4 duration-100 ease-in transition whitespace-nowrap text-ellipsis&quot;&gt;3&lt;!-- --&gt;. &lt;!-- --&gt;Checkbox (boolean) &lt;/button&gt;&lt;button class=&quot;py-2 me-4 text-base border-b-4 duration-100 ease-in transition whitespace-nowrap text-ellipsis&quot;&gt;4&lt;!-- --&gt;. &lt;!-- --&gt;Form (two variables) &lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex z-10 pb-2 ps-2&quot;&gt;&lt;button aria-label=&quot;Scroll left&quot; class=&quot;bg-secondary-button dark:bg-secondary-button-dark h-8 px-2 rounded-l rtl:rounded-r rtl:rounded-l-none border-gray-20 border-r rtl:border-l rtl:border-r-0 text-gray-30&quot;&gt;&lt;svg class=&quot;rotate-90 rtl:-rotate-90&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/button&gt;&lt;button aria-label=&quot;Scroll right&quot; class=&quot;bg-secondary-button dark:bg-secondary-button-dark h-8 px-2 rounded-e text-primary dark:text-primary-dark&quot;&gt;&lt;svg class=&quot;-rotate-90 rtl:rotate-90&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;p-5 sm:py-8 sm:px-8&quot;&gt;&lt;div&gt;&lt;h4 id=&quot;counter-number&quot; class=&quot;mdx-heading text-xl text-primary dark:text-primary-dark mb-2 mt-0 font-medium text-xl font-display font-bold leading-9 my-4&quot;&gt;&lt;div class=&quot;font-bold block md:inline&quot;&gt;Example&lt;!-- --&gt; &lt;!-- --&gt;1&lt;!-- --&gt; of&lt;!-- --&gt; &lt;!-- --&gt;4&lt;span class=&quot;text-primary dark:text-primary-dark&quot;&gt;: &lt;/span&gt;&lt;/div&gt;Counter (number) &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#counter-number&quot; aria-label=&quot;Link for this heading&quot; title=&quot;Link for this heading&quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In this example, the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;count&lt;/code&gt; state variable holds a number. Clicking the button increments it.&lt;/p&gt;&lt;!--$--&gt;&lt;div class=&quot;sandpack sandpack--playground w-full my-8&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;shadow-lg dark:shadow-lg-dark rounded-lg&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;bg-wash dark:bg-card-dark flex justify-between items-center relative z-10 border-b border-border dark:border-border-dark rounded-t-lg text-lg&quot;&gt;&lt;div class=&quot;flex-1 grow min-w-0 px-4 lg:px-6&quot;&gt;&lt;div&gt;&lt;div class=&quot;relative overflow-hidden&quot;&gt;&lt;div class=&quot;w-[fit-content] invisible&quot;&gt;&lt;div class=&quot; sp-tabs&quot; translate=&quot;no&quot;&gt;&lt;div aria-label=&quot;Select active file&quot; class=&quot; sp-tabs-scrollable-container&quot; role=&quot;tablist&quot;&gt;&lt;button aria-selected=&quot;true&quot; class=&quot;  sp-tab-button&quot; data-active=&quot;true&quot; role=&quot;tab&quot; title=&quot;/src/App.js&quot; type=&quot;button&quot;&gt;App.js&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;button class=&quot;absolute top-0 start-[2px]&quot; id=&quot;headlessui-listbox-button-:R4pd38cq6:&quot; aria-haspopup=&quot;true&quot; aria-expanded=&quot;false&quot; data-headlessui-state=&quot;&quot;&gt;&lt;span class=&quot;h-full py-2 px-1 mt-px -mb-px flex border-b text-link dark:text-link-dark border-link dark:border-link-dark items-center text-md leading-tight truncate&quot; style=&quot;max-width:160px&quot;&gt;App.js&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;px-3 flex items-center justify-end text-start&quot; translate=&quot;yes&quot;&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Keep your edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;path d=&quot;M13.8982 5.20844C12.4626 4.88688 10.9686 4.93769 9.55821 5.35604L11.8524 3.06184C11.8989 3.0154 11.9357 2.96028 11.9608 2.89961C11.986 2.83894 11.9989 2.77391 11.9989 2.70824C11.9989 2.64256 11.986 2.57754 11.9608 2.51686C11.9357 2.45619 11.8989 2.40107 11.8524 2.35464L11.1456 1.64784C11.0992 1.60139 11.0441 1.56455 10.9834 1.53942C10.9227 1.51428 10.8577 1.50134 10.792 1.50134C10.7263 1.50134 10.6613 1.51428 10.6006 1.53942C10.54 1.56455 10.4848 1.60139 10.4384 1.64784L6.14571 5.94054C6.00654 6.07969 5.89615 6.2449 5.82083 6.42673C5.74551 6.60855 5.70675 6.80343 5.70675 7.00024C5.70675 7.19704 5.74551 7.39192 5.82083 7.57374C5.89615 7.75557 6.00654 7.92078 6.14571 8.05994L10.4387 12.3529C10.5325 12.4465 10.6595 12.4991 10.792 12.4991C10.9245 12.4991 11.0516 12.4465 11.1453 12.3529L11.8527 11.6455C11.9463 11.5518 11.9989 11.4247 11.9989 11.2922C11.9989 11.1598 11.9463 11.0327 11.8527 10.9389L8.77481 7.86104C9.99795 7.16236 11.415 6.8801 12.8125 7.05678C14.21 7.23347 15.5122 7.85953 16.523 8.84064C17.5338 9.82176 18.1983 11.1048 18.4165 12.4964C18.6347 13.888 18.3947 15.3129 17.7328 16.5562C17.0708 17.7996 16.0227 18.7942 14.7463 19.3902C13.47 19.9861 12.0345 20.1511 10.6563 19.8603C9.27798 19.5695 8.03152 18.8387 7.10469 17.778C6.17786 16.7172 5.62086 15.384 5.51761 13.9791C5.51156 13.8512 5.45689 13.7303 5.36477 13.6413C5.27265 13.5522 5.15001 13.5017 5.02191 13.5H4.02081C3.95297 13.4996 3.88574 13.5129 3.8232 13.5392C3.76065 13.5655 3.70408 13.6042 3.6569 13.6529C3.60972 13.7017 3.57291 13.7595 3.54869 13.8228C3.52448 13.8862 3.51336 13.9538 3.51601 14.0216C3.61349 15.5965 4.1473 17.1132 5.0577 18.4019C5.9681 19.6906 7.21917 20.7006 8.6709 21.3188C10.1226 21.937 11.7178 22.139 13.2778 21.9022C14.8378 21.6654 16.3011 20.9992 17.504 19.978C18.7069 18.9569 19.6019 17.6212 20.0889 16.1203C20.5759 14.6195 20.6356 13.0128 20.2614 11.4799C19.8872 9.94705 19.0938 8.54858 17.97 7.44098C16.8462 6.33339 15.4363 5.56037 13.8982 5.20844V5.20844Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Reload&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1&quot; title=&quot;Clear all edits and reload sandbox&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;inline mx-1 relative&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Clear&lt;/span&gt;&lt;/button&gt;&lt;a href=&quot;https://codesandbox.io/api/v1/sandboxes/define?undefined&amp;amp;environment=create-react-app&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot; title=&quot;Open in CodeSandbox&quot; class=&quot;text-sm text-primary dark:text-primary-dark inline-flex items-center hover:text-link duration-100 ease-in transition mx-1 ms-2 md:ms-1&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;inline mx-1 relative top-[1px]&quot;&gt;&lt;path d=&quot;M20.5001 2H15.5001C15.3675 2 15.2403 2.05268 15.1465 2.14645C15.0528 2.24021 15.0001 2.36739 15.0001 2.5V3.5C15.0001 3.63261 15.0528 3.75979 15.1465 3.85355C15.2403 3.94732 15.3675 4 15.5001 4H18.5901L7.6501 14.94C7.60323 14.9865 7.56604 15.0418 7.54065 15.1027C7.51527 15.1636 7.5022 15.229 7.5022 15.295C7.5022 15.361 7.51527 15.4264 7.54065 15.4873C7.56604 15.5482 7.60323 15.6035 7.6501 15.65L8.3501 16.35C8.39658 16.3969 8.45188 16.4341 8.51281 16.4594C8.57374 16.4848 8.63909 16.4979 8.7051 16.4979C8.7711 16.4979 8.83646 16.4848 8.89738 16.4594C8.95831 16.4341 9.01362 16.3969 9.0601 16.35L20.0001 5.41V8.5C20.0001 8.63261 20.0528 8.75979 20.1465 8.85355C20.2403 8.94732 20.3675 9 20.5001 9H21.5001C21.6327 9 21.7599 8.94732 21.8537 8.85355C21.9474 8.75979 22.0001 8.63261 22.0001 8.5V3.5C22.0001 3.10218 21.8421 2.72064 21.5608 2.43934C21.2795 2.15804 20.8979 2 20.5001 2V2Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13H20.5C20.3674 13 20.2402 13.0527 20.1464 13.1464C20.0527 13.2402 20 13.3674 20 13.5V20H4V4H10.5C10.6326 4 10.7598 3.94732 10.8536 3.85355C10.9473 3.75979 11 3.63261 11 3.5V2.5C11 2.36739 10.9473 2.24021 10.8536 2.14645C10.7598 2.05268 10.6326 2 10.5 2H3.5C3.10218 2 2.72064 2.15804 2.43934 2.43934C2.15804 2.72064 2 3.10218 2 3.5V20.5C2 20.8978 2.15804 21.2794 2.43934 21.5607C2.72064 21.842 3.10218 22 3.5 22H20.5C20.8978 22 21.2794 21.842 21.5607 21.5607C21.842 21.2794 22 20.8978 22 20.5V13.5C22 13.3674 21.9473 13.2402 21.8536 13.1464C21.7598 13.0527 21.6326 13 21.5 13Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class=&quot;hidden md:block&quot;&gt;Fork&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; rounded-b-lg overflow-hidden sp-layout&quot;&gt;&lt;div class=&quot; sp-editor sp-stack&quot;&gt;&lt;div class=&quot; sp-code-editor&quot;&gt;&lt;div aria-autocomplete=&quot;list&quot; aria-label=&quot;Code Editor for App.js&quot; aria-multiline=&quot;true&quot; class=&quot;sp-pristine sp-javascript   sp-cm&quot; role=&quot;textbox&quot; tabindex=&quot;0&quot; translate=&quot;no&quot;&gt;&lt;pre class=&quot; sp-pre-placeholder&quot; style=&quot;margin-left:var(--sp-space-11)&quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;useState&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;sp-syntax-keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;Counter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;setCount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;]&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-static&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-definition&quot;&gt;setCount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;count&lt;/span&gt; + &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;onClick&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      You pressed me &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; times
    &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-tag&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot; order-last xl:order-2 sp-stack&quot;&gt;&lt;div class=&quot;p-0 sm:p-2 md:p-4 lg:p-8 bg-card dark:bg-wash-dark h-full relative md:rounded-b-lg lg:rounded-b-none&quot;&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;iframe class=&quot;rounded-t-none bg-white md:shadow-md sm:rounded-lg w-full max-w-full transition-opacity absolute opacity-0 pointer-events-none duration-75&quot; title=&quot;Sandbox Preview&quot; style=&quot;height:15px;z-index:-1&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;&lt;/div&gt;&lt;div class=&quot;flex justify-between items-center mt-4&quot;&gt;&lt;button class=&quot;bg-purple-50 border-purple-50 hover:bg-purple-50 focus:bg-purple-50 active:bg-purple-50 text-base leading-tight font-bold rounded-full py-2 px-4 focus:outline focus:outline-offset-2 focus:outline-link dark:focus:outline-link-dark inline-flex items-center my-1 bg-link border-link text-white hover:bg-link focus:bg-link active:bg-link&quot;&gt;Next &lt;!-- --&gt;Example&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;block ms-1.5 rtl:rotate-180&quot;&gt;&lt;path d=&quot;M6.86612 13.6161C6.37796 14.1043 6.37796 14.8957 6.86612 15.3839C7.35427 15.872 8.14572 15.872 8.63388 15.3839L13.1339 10.8839C13.622 10.3957 13.622 9.60428 13.1339 9.11612L8.63388 4.61612C8.14572 4.12797 7.35427 4.12797 6.86612 4.61612C6.37796 5.10428 6.37796 5.89573 6.86612 6.38388L10.4822 10L6.86612 13.6161Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Some API pages also include &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useEffect#troubleshooting&quot;&gt;Troubleshooting&lt;/a&gt; (for common problems) and &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/findDOMNode#alternatives&quot;&gt;Alternatives&lt;/a&gt; (for deprecated APIs).&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We hope that this approach will make the API reference useful not only as a way to look up an argument, but as a way to see all the different things you can do with any given API—and how it connects to the other ones.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;What’s next? &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#whats-next&quot; aria-label=&quot;Link for What’s next? &quot; title=&quot;Link for What’s next? &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;That’s a wrap for our little tour! Have a look around the new website, see what you like or don’t like, and keep the feedback coming in our &lt;a href=&quot;https://github.com/reactjs/react.dev/issues&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;issue tracker&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We acknowledge this project has taken a long time to ship. We wanted to maintain a high quality bar that the React community deserves. While writing these docs and creating all of the examples, we found mistakes in some of our own explanations, bugs in React, and even gaps in the React design that we are now working to address. We hope that the new documentation will help us hold React itself to a higher bar in the future.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve heard many of your requests to expand the content and functionality of the website, for example:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Providing a TypeScript version for all examples;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Creating the updated performance, testing, and accessibility guides;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Documenting React Server Components independently from the frameworks that support them;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Working with our international community to get the new docs translated;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Adding missing features to the new website (for example, RSS for this blog).&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Now that &lt;a href=&quot;https://react.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;react.dev&lt;/a&gt; is out, we will be able to shift our focus from “catching up” with the third-party React educational resources to adding new information and further improving our new website.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We think there’s never been a better time to learn React.&lt;/p&gt;
&lt;h2 id=&quot;who-worked-on-this&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Who worked on this? &lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev#who-worked-on-this&quot; aria-label=&quot;Link for Who worked on this? &quot; title=&quot;Link for Who worked on this? &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;On the React team, &lt;a href=&quot;https://twitter.com/rachelnabors/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Rachel Nabors&lt;/a&gt; led the project (and provided the illustrations), and &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt; designed the curriculum. They co-authored most of the content together as well.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Of course, no project this large happens in isolation. We have a lot of people to thank!&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a href=&quot;https://twitter.com/SylwiaVargas&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sylwia Vargas&lt;/a&gt; overhauled our examples to go beyond “foo/bar/baz” and kittens, and feature scientists, artists and cities from around the world. &lt;a href=&quot;https://twitter.com/Mappletons&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Maggie Appleton&lt;/a&gt; turned our doodles into a clear diagram system.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks to &lt;a href=&quot;https://twitter.com/mcc_abe&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;David McCabe&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/sophiebits&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sophie Alpert&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Rick Hanlon&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Andrew Clark&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/mattcarrollcode&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Matt Carroll&lt;/a&gt; for additional writing contributions. We’d also like to thank &lt;a href=&quot;https://twitter.com/n_tepluhina&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Natalia Tepluhina&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sebastian Markbåge&lt;/a&gt; for their ideas and feedback.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Thanks to &lt;a href=&quot;https://twitter.com/lebo&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Lebowitz&lt;/a&gt; for the site design and &lt;a href=&quot;https://dribbble.com/GradinarRazvan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Razvan Gradinar&lt;/a&gt; for the sandbox design.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;On the development front, thanks to &lt;a href=&quot;https://twitter.com/jaredpalmer&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jared Palmer&lt;/a&gt; for prototype development. Thanks to &lt;a href=&quot;https://twitter.com/danecando&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dane Grant&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/dustinsgoodman&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dustin Goodman&lt;/a&gt; from &lt;a href=&quot;https://www.thisdot.co/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;ThisDotLabs&lt;/a&gt; for their support on UI development. Thanks to &lt;a href=&quot;https://twitter.com/CompuIves&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Ives van Hoorne&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/alexnmoldovan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Alex Moldovan&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/JasperDeMoor&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jasper De Moor&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/danilowoz&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Danilo Woznica&lt;/a&gt; from &lt;a href=&quot;https://codesandbox.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;CodeSandbox&lt;/a&gt; for their work with sandbox integration. Thanks to &lt;a href=&quot;https://twitter.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Rick Hanlon&lt;/a&gt; for spot development and design work, finessing our colors and finer details. Thanks to &lt;a href=&quot;https://www.strek.in/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Harish Kumar&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/lunaruan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Luna Ruan&lt;/a&gt; for adding new features to the site and helping maintain it.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Huge thanks to the folks who volunteered their time to participate in the alpha and beta testing program. Your enthusiasm and invaluable feedback helped us shape these docs. A special shout out to our beta tester, &lt;a href=&quot;https://twitter.com/debs_obrien&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Debbie O’Brien&lt;/a&gt;, who gave a talk about her experience using the React docs at React Conf 2021.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Finally, thanks to the React community for being the inspiration behind this effort. You are the reason we do this, and we hope that the new docs will help you use React to build any user interface that you want.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Labs: What We&#39;ve Been Working On – March 2023&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Labs: What We&#39;ve Been Working On – June 2022&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2023/03/16/introducing-react-dev</link><guid isPermaLink="false">https://react.dev/blog/2023/03/16/introducing-react-dev</guid><pubDate>Wed, 15 Mar 2023 16:00:00 GMT</pubDate></item><item><title>React Labs: What We&#39;ve Been Working On – June 2022</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;June 15, 2022 by &lt;a href=&quot;https://twitter.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Andrew Clark&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/danabra.mov&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Dan Abramov&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/kassens&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Jan Kassens&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/en_JS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Joseph Savona&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/joshcstory&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Josh Story&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/potetotes&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Lauren Tan&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/lunaruan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Luna Ruan&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/mengdi_en&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Mengdi Chen&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Rick Hanlon&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/jiaxuanzhang01&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Robert Zhang&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/_gsathya&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sathya Gunasekaran&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sebastian Markbåge&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/Huxpro&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Xuan Huang&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2022/03/29/react-v18&quot;&gt;React 18&lt;/a&gt; was years in the making, and with it brought valuable lessons for the React team. Its release was the result of many years of research and exploring many paths. Some of those paths were successful; many more were dead-ends that led to new insights. One lesson we’ve learned is that it’s frustrating for the community to wait for new features without having insight into these paths that we’re exploring.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We typically have a number of projects being worked on at any time, ranging from the more experimental to the clearly defined. Looking ahead, we’d like to start regularly sharing more about what we’ve been working on with the community across these projects.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To set expectations, this is not a roadmap with clear timelines. Many of these projects are under active research and are difficult to put concrete ship dates on. They may possibly never even ship in their current iteration depending on what we learn. Instead, we want to share with you the problem spaces we’re actively thinking about, and what we’ve learned so far.&lt;/p&gt;
&lt;h2 id=&quot;server-components&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Server Components &lt;a href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022#server-components&quot; aria-label=&quot;Link for Server Components &quot; title=&quot;Link for Server Components &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We announced an &lt;a href=&quot;https://legacy.reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;experimental demo of React Server Components&lt;/a&gt; (RSC) in December 2020. Since then we’ve been finishing up its dependencies in React 18, and working on changes inspired by experimental feedback.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In particular, we’re abandoning the idea of having forked I/O libraries (eg react-fetch), and instead adopting an async/await model for better compatibility. This doesn’t technically block RSC’s release because you can also use routers for data fetching. Another change is that we’re also moving away from the file extension approach in favor of &lt;a href=&quot;https://github.com/reactjs/rfcs/pull/189#issuecomment-1116482278&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;annotating boundaries&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re working together with Vercel and Shopify to unify bundler support for shared semantics in both webpack and Vite. Before launch, we want to make sure that the semantics of RSCs are the same across the whole React ecosystem. This is the major blocker for reaching stable.&lt;/p&gt;
&lt;h2 id=&quot;asset-loading&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Asset Loading &lt;a href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022#asset-loading&quot; aria-label=&quot;Link for Asset Loading &quot; title=&quot;Link for Asset Loading &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Currently, assets like scripts, external styles, fonts, and images are typically preloaded and loaded using external systems. This can make it tricky to coordinate across new environments like streaming, Server Components, and more.
We’re looking at adding APIs to preload and load deduplicated external assets through React APIs that work in all React environments.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re also looking at having these support Suspense so you can have images, CSS, and fonts that block display until they’re loaded but don’t block streaming and concurrent rendering. This can help avoid &lt;a href=&quot;https://twitter.com/sebmarkbage/status/1516852731251724293&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;“popcorning“&lt;/a&gt; as the visuals pop and layout shifts.&lt;/p&gt;
&lt;h2 id=&quot;static-server-rendering-optimizations&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Static Server Rendering Optimizations &lt;a href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022#static-server-rendering-optimizations&quot; aria-label=&quot;Link for Static Server Rendering Optimizations &quot; title=&quot;Link for Static Server Rendering Optimizations &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Static Site Generation (SSG) and Incremental Static Regeneration (ISR) are great ways to get performance for cacheable pages, but we think we can add features to improve performance of dynamic Server Side Rendering (SSR) – especially when most but not all of the content is cacheable. We’re exploring ways to optimize server rendering utilizing compilation and static passes.&lt;/p&gt;
&lt;h2 id=&quot;react-compiler&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Optimizing Compiler &lt;a href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022#react-compiler&quot; aria-label=&quot;Link for React Optimizing Compiler &quot; title=&quot;Link for React Optimizing Compiler &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We gave an &lt;a href=&quot;https://www.youtube.com/watch?v=lGEMwh32soc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;early preview&lt;/a&gt; of React Forget at React Conf 2021. It’s a compiler that automatically generates the equivalent of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useMemo&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useCallback&lt;/code&gt; calls to minimize the cost of re-rendering, while retaining React’s programming model.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Recently, we finished a rewrite of the compiler to make it more reliable and capable. This new architecture allows us to analyze and memoize more complex patterns such as the use of &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/keeping-components-pure#local-mutation-your-components-little-secret&quot;&gt;local mutations&lt;/a&gt;, and opens up many new compile-time optimization opportunities beyond just being on par with memoization Hooks.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re also working on a playground for exploring many aspects of the compiler. While the goal of the playground is to make development of the compiler easier, we think that it will make it easier to try it out and build intuition for what the compiler does. It reveals various insights into how it works under the hood, and live renders the compiler’s outputs as you type. This will be shipped together with the compiler when it’s released.&lt;/p&gt;
&lt;h2 id=&quot;offscreen&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Offscreen &lt;a href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022#offscreen&quot; aria-label=&quot;Link for Offscreen &quot; title=&quot;Link for Offscreen &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Today, if you want to hide and show a component, you have two options. One is to add or remove it from the tree completely. The problem with this approach is that the state of your UI is lost each time you unmount, including state stored in the DOM, like scroll position.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The other option is to keep the component mounted and toggle the appearance visually using CSS. This preserves the state of your UI, but it comes at a performance cost, because React must keep rendering the hidden component and all of its children whenever it receives new updates.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Offscreen introduces a third option: hide the UI visually, but deprioritize its content. The idea is similar in spirit to the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;content-visibility&lt;/code&gt; CSS property: when content is hidden, it doesn’t need to stay in sync with the rest of the UI. React can defer the rendering work until the rest of the app is idle, or until the content becomes visible again.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Offscreen is a low level capability that unlocks high level features. Similar to React’s other concurrent features like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startTransition&lt;/code&gt;, in most cases you won’t interact with the Offscreen API directly, but instead via an opinionated framework to implement patterns like:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Instant transitions.&lt;/strong&gt; Some routing frameworks already prefetch data to speed up subsequent navigations, like when hovering over a link. With Offscreen, they’ll also be able to prerender the next screen in the background.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Reusable state.&lt;/strong&gt; Similarly, when navigating between routes or tabs, you can use Offscreen to preserve the state of the previous screen so you can switch back and pick up where you left off.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Virtualized list rendering.&lt;/strong&gt; When displaying large lists of items, virtualized list frameworks will prerender more rows than are currently visible. You can use Offscreen to prerender the hidden rows at a lower priority than the visible items in the list.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Backgrounded content.&lt;/strong&gt; We’re also exploring a related feature for deprioritizing content in the background without hiding it, like when displaying a modal overlay.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;transition-tracing&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Transition Tracing &lt;a href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022#transition-tracing&quot; aria-label=&quot;Link for Transition Tracing &quot; title=&quot;Link for Transition Tracing &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Currently, React has two profiling tools. The &lt;a href=&quot;https://legacy.reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;original Profiler&lt;/a&gt; shows an overview of all the commits in a profiling session. For each commit, it also shows all components that rendered and the amount of time it took for them to render. We also have a beta version of a &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/76&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Timeline Profiler&lt;/a&gt; introduced in React 18 that shows when components schedule updates and when React works on these updates. Both of these profilers help developers identify performance problems in their code.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve realized that developers don’t find knowing about individual slow commits or components out of context that useful. It’s more useful to know about what actually causes the slow commits. And that developers want to be able to track specific interactions (eg a button click, an initial load, or a page navigation) to watch for performance regressions and to understand why an interaction was slow and how to fix it.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We previously tried to solve this issue by creating an &lt;a href=&quot;https://gist.github.com/bvaughn/8de925562903afd2e7a12554adcdda16&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Interaction Tracing API&lt;/a&gt;, but it had some fundamental design flaws that reduced the accuracy of tracking why an interaction was slow and sometimes resulted in interactions never ending. We ended up &lt;a href=&quot;https://github.com/react/react/pull/20037&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;removing this API&lt;/a&gt; because of these issues.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We are working on a new version for the Interaction Tracing API (tentatively called Transition Tracing because it is initiated via &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startTransition&lt;/code&gt;) that solves these problems.&lt;/p&gt;
&lt;h2 id=&quot;new-react-docs&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New React Docs &lt;a href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022#new-react-docs&quot; aria-label=&quot;Link for New React Docs &quot; title=&quot;Link for New React Docs &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Last year, we announced the beta version of the new React documentation website (&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev&quot;&gt;later shipped as react.dev&lt;/a&gt;) of the new React documentation website. The new learning materials teach Hooks first and has new diagrams, illustrations, as well as many interactive examples and challenges. We took a break from that work to focus on the React 18 release, but now that React 18 is out, we’re actively working to finish and ship the new documentation.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We are currently writing a detailed section about effects, as we’ve heard that is one of the more challenging topics for both new and experienced React users. &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/synchronizing-with-effects&quot;&gt;Synchronizing with Effects&lt;/a&gt; is the first published page in the series, and there are more to come in the following weeks. When we first started writing a detailed section about effects, we’ve realized that many common effect patterns can be simplified by adding a new primitive to React. We’ve shared some initial thoughts on that in the &lt;a href=&quot;https://github.com/reactjs/rfcs/pull/220&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;useEvent RFC&lt;/a&gt;. It is currently in early research, and we are still iterating on the idea. We appreciate the community’s comments on the RFC so far, as well as the &lt;a href=&quot;https://github.com/reactjs/react.dev/issues/3308&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;feedback&lt;/a&gt; and contributions to the ongoing documentation rewrite. We’d specifically like to thank &lt;a href=&quot;https://github.com/harish-sethuraman&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Harish Kumar&lt;/a&gt; for submitting and reviewing many improvements to the new website implementation.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;em&gt;Thanks to &lt;a href=&quot;https://twitter.com/sophiebits&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Sophie Alpert&lt;/a&gt; for reviewing this blog post!&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;Introducing react.dev&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2022/03/29/react-v18&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React v18.0&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022</link><guid isPermaLink="false">https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022</guid><pubDate>Tue, 14 Jun 2022 16:00:00 GMT</pubDate></item><item><title>React v18.0</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;March 29, 2022 by &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/community/team&quot;&gt;The React Team&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 18 is now available on npm! In our last post, we shared step-by-step instructions for &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide&quot;&gt;upgrading your app to React 18&lt;/a&gt;. In this post, we’ll give an overview of what’s new in React 18, and what it means for the future.&lt;/p&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Our latest major version includes out-of-the-box improvements like automatic batching, new APIs like startTransition, and streaming server-side rendering with support for Suspense.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Many of the features in React 18 are built on top of our new concurrent renderer, a behind-the-scenes change that unlocks powerful new capabilities. Concurrent React is opt-in — it’s only enabled when you use a concurrent feature — but we think it will have a big impact on the way people build applications.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve spent years researching and developing support for concurrency in React, and we’ve taken extra care to provide a gradual adoption path for existing users. Last summer, &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2021/06/08/the-plan-for-react-18&quot;&gt;we formed the React 18 Working Group&lt;/a&gt; to gather feedback from experts in the community and ensure a smooth upgrade experience for the entire React ecosystem.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In case you missed it, we shared a lot of this vision at React Conf 2021:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;In &lt;a href=&quot;https://www.youtube.com/watch?v=FZ0cG47msEk&amp;amp;list=PLNG_1j3cPCaZZ7etkzWA7JfdmKWT0pMsa&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;the keynote&lt;/a&gt;, we explain how React 18 fits into our mission to make it easy for developers to build great user experiences&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://twitter.com/shrutikapoor08&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Shruti Kapoor&lt;/a&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=ytudH8je5ko&amp;amp;list=PLNG_1j3cPCaZZ7etkzWA7JfdmKWT0pMsa&amp;amp;index=2&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;demonstrated how to use the new features in React 18&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;a href=&quot;https://twitter.com/shaundai&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Shaundai Person&lt;/a&gt; gave us an overview of &lt;a href=&quot;https://www.youtube.com/watch?v=pj5N-Khihgc&amp;amp;list=PLNG_1j3cPCaZZ7etkzWA7JfdmKWT0pMsa&amp;amp;index=3&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;streaming server rendering with Suspense&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Below is a full overview of what to expect in this release, starting with Concurrent Rendering.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For React Native users, React 18 will ship in React Native with the New React Native Architecture. For more information, see the &lt;a href=&quot;https://www.youtube.com/watch?v=FZ0cG47msEk&amp;amp;t=1530s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Conf keynote here&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;what-is-concurrent-react&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;What is Concurrent React? &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#what-is-concurrent-react&quot; aria-label=&quot;Link for What is Concurrent React? &quot; title=&quot;Link for What is Concurrent React? &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The most important addition in React 18 is something we hope you never have to think about: concurrency. We think this is largely true for application developers, though the story may be a bit more complicated for library maintainers.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Concurrency is not a feature, per se. It’s a new behind-the-scenes mechanism that enables React to prepare multiple versions of your UI at the same time. You can think of concurrency as an implementation detail — it’s valuable because of the features that it unlocks. React uses sophisticated techniques in its internal implementation, like priority queues and multiple buffering. But you won’t see those concepts anywhere in our public APIs.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When we design APIs, we try to hide implementation details from developers. As a React developer, you focus on &lt;em&gt;what&lt;/em&gt; you want the user experience to look like, and React handles &lt;em&gt;how&lt;/em&gt; to deliver that experience. So we don’t expect React developers to know how concurrency works under the hood.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;However, Concurrent React is more important than a typical implementation detail — it’s a foundational update to React’s core rendering model. So while it’s not super important to know how concurrency works, it may be worth knowing what it is at a high level.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;A key property of Concurrent React is that rendering is interruptible. When you first upgrade to React 18, before adding any concurrent features, updates are rendered the same as in previous versions of React — in a single, uninterrupted, synchronous transaction. With synchronous rendering, once an update starts rendering, nothing can interrupt it until the user can see the result on screen.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In a concurrent render, this is not always the case. React may start rendering an update, pause in the middle, then continue later. It may even abandon an in-progress render altogether. React guarantees that the UI will appear consistent even if a render is interrupted. To do this, it waits to perform DOM mutations until the end, once the entire tree has been evaluated. With this capability, React can prepare new screens in the background without blocking the main thread. This means the UI can respond immediately to user input even if it’s in the middle of a large rendering task, creating a fluid user experience.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Another example is reusable state. Concurrent React can remove sections of the UI from the screen, then add them back later while reusing the previous state. For example, when a user tabs away from a screen and back, React should be able to restore the previous screen in the same state it was in before. In an upcoming minor, we’re planning to add a new component called &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Offscreen&amp;gt;&lt;/code&gt; that implements this pattern. Similarly, you’ll be able to use Offscreen to prepare new UI in the background so that it’s ready before the user reveals it.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Concurrent rendering is a powerful new tool in React and most of our new features are built to take advantage of it, including Suspense, transitions, and streaming server rendering. But React 18 is just the beginning of what we aim to build on this new foundation.&lt;/p&gt;
&lt;h2 id=&quot;gradually-adopting-concurrent-features&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Gradually Adopting Concurrent Features &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#gradually-adopting-concurrent-features&quot; aria-label=&quot;Link for Gradually Adopting Concurrent Features &quot; title=&quot;Link for Gradually Adopting Concurrent Features &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Technically, concurrent rendering is a breaking change. Because concurrent rendering is interruptible, components behave slightly differently when it is enabled.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In our testing, we’ve upgraded thousands of components to React 18. What we’ve found is that nearly all existing components “just work” with concurrent rendering, without any changes. However, some of them may require some additional migration effort. Although the changes are usually small, you’ll still have the ability to make them at your own pace. The new rendering behavior in React 18 is &lt;strong class=&quot;font-bold&quot;&gt;only enabled in the parts of your app that use new features.&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The overall upgrade strategy is to get your application running on React 18 without breaking existing code. Then you can gradually start adding concurrent features at your own pace. You can use &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/StrictMode&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;StrictMode&amp;gt;&lt;/code&gt;&lt;/a&gt; to help surface concurrency-related bugs during development. Strict Mode doesn’t affect production behavior, but during development it will log extra warnings and double-invoke functions that are expected to be idempotent. It won’t catch everything, but it’s effective at preventing the most common types of mistakes.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;After you upgrade to React 18, you’ll be able to start using concurrent features immediately. For example, you can use startTransition to navigate between screens without blocking user input. Or useDeferredValue to throttle expensive re-renders.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;However, long term, we expect the main way you’ll add concurrency to your app is by using a concurrent-enabled library or framework. In most cases, you won’t interact with concurrent APIs directly. For example, instead of developers calling startTransition whenever they navigate to a new screen, router libraries will automatically wrap navigations in startTransition.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;It may take some time for libraries to upgrade to be concurrent compatible. We’ve provided new APIs to make it easier for libraries to take advantage of concurrent features. In the meantime, please be patient with maintainers as we work to gradually migrate the React ecosystem.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more info, see our previous post: &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide&quot;&gt;How to upgrade to React 18&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;suspense-in-data-frameworks&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Suspense in Data Frameworks &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#suspense-in-data-frameworks&quot; aria-label=&quot;Link for Suspense in Data Frameworks &quot; title=&quot;Link for Suspense in Data Frameworks &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 18, you can start using &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/Suspense&quot;&gt;Suspense&lt;/a&gt; for data fetching in opinionated frameworks like Relay, Next.js, Hydrogen, or Remix. Ad hoc data fetching with Suspense is technically possible, but still not recommended as a general strategy.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the future, we may expose additional primitives that could make it easier to access your data with Suspense, perhaps without the use of an opinionated framework. However, Suspense works best when it’s deeply integrated into your application’s architecture: your router, your data layer, and your server rendering environment. So even long term, we expect that libraries and frameworks will play a crucial role in the React ecosystem.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As in previous versions of React, you can also use Suspense for code splitting on the client with React.lazy. But our vision for Suspense has always been about much more than loading code — the goal is to extend support for Suspense so that eventually, the same declarative Suspense fallback can handle any asynchronous operation (loading code, data, images, etc).&lt;/p&gt;
&lt;h2 id=&quot;server-components-is-still-in-development&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Server Components is Still in Development &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#server-components-is-still-in-development&quot; aria-label=&quot;Link for Server Components is Still in Development &quot; title=&quot;Link for Server Components is Still in Development &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2020/12/21/data-fetching-with-react-server-components&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Server Components&lt;/strong&gt;&lt;/a&gt; is an upcoming feature that allows developers to build apps that span the server and client, combining the rich interactivity of client-side apps with the improved performance of traditional server rendering. Server Components is not inherently coupled to Concurrent React, but it’s designed to work best with concurrent features like Suspense and streaming server rendering.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Server Components is still experimental, but we expect to release an initial version in a minor 18.x release. In the meantime, we’re working with frameworks like Next.js, Hydrogen, and Remix to advance the proposal and get it ready for broad adoption.&lt;/p&gt;
&lt;h2 id=&quot;whats-new-in-react-18&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;What’s New in React 18 &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#whats-new-in-react-18&quot; aria-label=&quot;Link for What’s New in React 18 &quot; title=&quot;Link for What’s New in React 18 &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;new-feature-automatic-batching&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New Feature: Automatic Batching &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#new-feature-automatic-batching&quot; aria-label=&quot;Link for New Feature: Automatic Batching &quot; title=&quot;Link for New Feature: Automatic Batching &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Batching is when React groups multiple state updates into a single re-render for better performance. Without automatic batching, we only batched updates inside React event handlers. Updates inside of promises, setTimeout, native event handlers, or any other event were not batched in React by default. With automatic batching, these updates will be batched automatically:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before: only React events were batched.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setCount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; + &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setFlag&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; !&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// React will render twice, once for each state update (no batching)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After: updates inside of timeouts, promises,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// native event handlers or any other event are batched.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setCount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; + &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setFlag&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; !&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// React will only re-render once at the end (that&#39;s batching!)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more info, see this post for &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/21&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Automatic batching for fewer renders in React 18&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;new-feature-transitions&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New Feature: Transitions &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#new-feature-transitions&quot; aria-label=&quot;Link for New Feature: Transitions &quot; title=&quot;Link for New Feature: Transitions &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;A transition is a new concept in React to distinguish between urgent and non-urgent updates.&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Urgent updates&lt;/strong&gt; reflect direct interaction, like typing, clicking, pressing, and so on.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Transition updates&lt;/strong&gt; transition the UI from one view to another.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Urgent updates like typing, clicking, or pressing, need immediate response to match our intuitions about how physical objects behave. Otherwise they feel “wrong”. However, transitions are different because the user doesn’t expect to see every intermediate value on screen.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For example, when you select a filter in a dropdown, you expect the filter button itself to respond immediately when you click. However, the actual results may transition separately. A small delay would be imperceptible and often expected. And if you change the filter again before the results are done rendering, you only care to see the latest results.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Typically, for the best user experience, a single user input should result in both an urgent update and a non-urgent one. You can use startTransition API inside an input event to inform React which updates are urgent and which are “transitions”:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;startTransition&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Urgent: Show what was typed&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;setInputValue&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Mark any state updates inside as transitions&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;startTransition&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// Transition: Show the results&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setSearchQuery&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Updates wrapped in startTransition are handled as non-urgent and will be interrupted if more urgent updates like clicks or key presses come in. If a transition gets interrupted by the user (for example, by typing multiple characters in a row), React will throw out the stale rendering work that wasn’t finished and render only the latest update.&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useTransition&lt;/code&gt;: a Hook to start transitions, including a value to track the pending state.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startTransition&lt;/code&gt;: a method to start transitions when the Hook cannot be used.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Transitions will opt in to concurrent rendering, which allows the update to be interrupted. If the content re-suspends, transitions also tell React to continue showing the current content while rendering the transition content in the background (see the &lt;a href=&quot;https://github.com/reactjs/rfcs/blob/main/text/0213-suspense-in-react-18.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Suspense RFC&lt;/a&gt; for more info).&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useTransition&quot;&gt;See docs for transitions here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;new-suspense-features&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New Suspense Features &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#new-suspense-features&quot; aria-label=&quot;Link for New Suspense Features &quot; title=&quot;Link for New Suspense Features &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Suspense lets you declaratively specify the loading state for a part of the component tree if it’s not yet ready to be displayed:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;fallback&lt;/span&gt;=&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Spinner&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Comments&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;Suspense&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Suspense makes the “UI loading state” a first-class declarative concept in the React programming model. This lets us build higher-level features on top of it.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We introduced a limited version of Suspense several years ago. However, the only supported use case was code splitting with React.lazy, and it wasn’t supported at all when rendering on the server.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In React 18, we’ve added support for Suspense on the server and expanded its capabilities using concurrent rendering features.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Suspense in React 18 works best when combined with the transition API. If you suspend during a transition, React will prevent already-visible content from being replaced by a fallback. Instead, React will delay the render until enough data has loaded to prevent a bad loading state.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more, see the RFC for &lt;a href=&quot;https://github.com/reactjs/rfcs/blob/main/text/0213-suspense-in-react-18.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Suspense in React 18&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;new-client-and-server-rendering-apis&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New Client and Server Rendering APIs &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#new-client-and-server-rendering-apis&quot; aria-label=&quot;Link for New Client and Server Rendering APIs &quot; title=&quot;Link for New Client and Server Rendering APIs &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In this release we took the opportunity to redesign the APIs we expose for rendering on the client and server. These changes allow users to continue using the old APIs in React 17 mode while they upgrade to the new APIs in React 18.&lt;/p&gt;
&lt;h4 id=&quot;react-dom-client&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;React DOM Client &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#react-dom-client&quot; aria-label=&quot;Link for React DOM Client &quot; title=&quot;Link for React DOM Client &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;These new APIs are now exported from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom/client&lt;/code&gt;:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createRoot&lt;/code&gt;: New method to create a root to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;render&lt;/code&gt; or &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unmount&lt;/code&gt;. Use it instead of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.render&lt;/code&gt;. New features in React 18 don’t work without it.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hydrateRoot&lt;/code&gt;: New method to hydrate a server rendered application. Use it instead of  &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.hydrate&lt;/code&gt; in conjunction with the new React DOM Server APIs. New features in React 18 don’t work without it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Both &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createRoot&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hydrateRoot&lt;/code&gt; accept a new option called &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;onRecoverableError&lt;/code&gt; in case you want to be notified when React recovers from errors during rendering or hydration for logging. By default, React will use &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/reportError&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;reportError&lt;/code&gt;&lt;/a&gt;, or &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;console.error&lt;/code&gt; in the older browsers.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/client&quot;&gt;See docs for React DOM Client here&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;react-dom-server&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;React DOM Server &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#react-dom-server&quot; aria-label=&quot;Link for React DOM Server &quot; title=&quot;Link for React DOM Server &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;These new APIs are now exported from &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom/server&lt;/code&gt; and have full support for streaming Suspense on the server:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToPipeableStream&lt;/code&gt;: for streaming in Node environments.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToReadableStream&lt;/code&gt;: for modern edge runtime environments, such as Deno and Cloudflare workers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The existing &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToString&lt;/code&gt; method keeps working but is discouraged.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react-dom/server&quot;&gt;See docs for React DOM Server here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;new-strict-mode-behaviors&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New Strict Mode Behaviors &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#new-strict-mode-behaviors&quot; aria-label=&quot;Link for New Strict Mode Behaviors &quot; title=&quot;Link for New Strict Mode Behaviors &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the future, we’d like to add a feature that allows React to add and remove sections of the UI while preserving state. For example, when a user tabs away from a screen and back, React should be able to immediately show the previous screen. To do this, React would unmount and remount trees using the same component state as before.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This feature will give React apps better performance out-of-the-box, but requires components to be resilient to effects being mounted and destroyed multiple times. Most effects will work without any changes, but some effects assume they are only mounted or destroyed once.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To help surface these issues, React 18 introduces a new development-only check to Strict Mode. This new check will automatically unmount and remount every component, whenever a component mounts for the first time, restoring the previous state on the second mount.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Before this change, React would mount the component and create the effects:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;* &lt;span class=&quot;sp-syntax-plain&quot;&gt;React &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;mounts &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;the &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;component&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Layout &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;created&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;created&lt;/span&gt;.&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;With Strict Mode in React 18, React will simulate unmounting and remounting the component in development mode:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;* &lt;span class=&quot;sp-syntax-plain&quot;&gt;React &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;mounts &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;the &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;component&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Layout &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;created&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;created&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;* &lt;span class=&quot;sp-syntax-plain&quot;&gt;React &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;simulates &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;unmounting &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;the &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;component&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Layout &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;destroyed&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;destroyed&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;* &lt;span class=&quot;sp-syntax-plain&quot;&gt;React &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;simulates &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;mounting &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;the &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;component &lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;the &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;previous &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;state&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Layout &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;created&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;created&lt;/span&gt;.&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/StrictMode#fixing-bugs-found-by-re-running-effects-in-development&quot;&gt;See docs for ensuring reusable state here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;new-hooks&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New Hooks &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#new-hooks&quot; aria-label=&quot;Link for New Hooks &quot; title=&quot;Link for New Hooks &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;useid&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;useId &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#useid&quot; aria-label=&quot;Link for useId &quot; title=&quot;Link for useId &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useId&lt;/code&gt; is a new Hook for generating unique IDs on both the client and server, while avoiding hydration mismatches. It is primarily useful for component libraries integrating with accessibility APIs that require unique IDs. This solves an issue that already exists in React 17 and below, but it’s even more important in React 18 because of how the new streaming server renderer delivers HTML out-of-order. &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useId&quot;&gt;See docs here&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class=&quot;mdx-blockquote py-4 px-8 my-8 shadow-inner-border dark:shadow-inner-border-dark bg-highlight dark:bg-highlight-dark bg-opacity-50 rounded-2xl leading-6 flex relative&quot;&gt;&lt;span class=&quot;block relative&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Note&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useId&lt;/code&gt; is &lt;strong class=&quot;font-bold&quot;&gt;not&lt;/strong&gt; for generating &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/learn/rendering-lists#where-to-get-your-key&quot;&gt;keys in a list&lt;/a&gt;. Keys should be generated from your data.&lt;/p&gt;
&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 id=&quot;usetransition&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;useTransition &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#usetransition&quot; aria-label=&quot;Link for useTransition &quot; title=&quot;Link for useTransition &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useTransition&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startTransition&lt;/code&gt; let you mark some state updates as not urgent. Other state updates are considered urgent by default. React will allow urgent state updates (for example, updating a text input) to interrupt non-urgent state updates (for example, rendering a list of search results). &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useTransition&quot;&gt;See docs here&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;usedeferredvalue&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;useDeferredValue &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#usedeferredvalue&quot; aria-label=&quot;Link for useDeferredValue &quot; title=&quot;Link for useDeferredValue &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useDeferredValue&lt;/code&gt; lets you defer re-rendering a non-urgent part of the tree. It is similar to debouncing, but has a few advantages compared to it. There is no fixed time delay, so React will attempt the deferred render right after the first render is reflected on the screen. The deferred render is interruptible and doesn’t block user input. &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useDeferredValue&quot;&gt;See docs here&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;usesyncexternalstore&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;useSyncExternalStore &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#usesyncexternalstore&quot; aria-label=&quot;Link for useSyncExternalStore &quot; title=&quot;Link for useSyncExternalStore &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useSyncExternalStore&lt;/code&gt; is a new Hook that allows external stores to support concurrent reads by forcing updates to the store to be synchronous. It removes the need for useEffect when implementing subscriptions to external data sources, and is recommended for any library that integrates with state external to React. &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useSyncExternalStore&quot;&gt;See docs here&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class=&quot;mdx-blockquote py-4 px-8 my-8 shadow-inner-border dark:shadow-inner-border-dark bg-highlight dark:bg-highlight-dark bg-opacity-50 rounded-2xl leading-6 flex relative&quot;&gt;&lt;span class=&quot;block relative&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Note&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useSyncExternalStore&lt;/code&gt; is intended to be used by libraries, not application code.&lt;/p&gt;
&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 id=&quot;useinsertioneffect&quot; class=&quot;mdx-heading text-xl font-display font-bold leading-9 my-4&quot;&gt;useInsertionEffect &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#useinsertioneffect&quot; aria-label=&quot;Link for useInsertionEffect &quot; title=&quot;Link for useInsertionEffect &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useInsertionEffect&lt;/code&gt; is a new Hook that allows CSS-in-JS libraries to address performance issues of injecting styles in render. Unless you’ve already built a CSS-in-JS library we don’t expect you to ever use this. This Hook will run after the DOM is mutated, but before layout effects read the new layout. This solves an issue that already exists in React 17 and below, but is even more important in React 18 because React yields to the browser during concurrent rendering, giving it a chance to recalculate layout. &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/reference/react/useInsertionEffect&quot;&gt;See docs here&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class=&quot;mdx-blockquote py-4 px-8 my-8 shadow-inner-border dark:shadow-inner-border-dark bg-highlight dark:bg-highlight-dark bg-opacity-50 rounded-2xl leading-6 flex relative&quot;&gt;&lt;span class=&quot;block relative&quot;&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Note&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useInsertionEffect&lt;/code&gt; is intended to be used by libraries, not application code.&lt;/p&gt;
&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 id=&quot;how-to-upgrade&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;How to Upgrade &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#how-to-upgrade&quot; aria-label=&quot;Link for How to Upgrade &quot; title=&quot;Link for How to Upgrade &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide&quot;&gt;How to Upgrade to React 18&lt;/a&gt; for step-by-step instructions and a full list of breaking and notable changes.&lt;/p&gt;
&lt;h2 id=&quot;changelog&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Changelog &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#changelog&quot; aria-label=&quot;Link for Changelog &quot; title=&quot;Link for Changelog &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;react&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#react&quot; aria-label=&quot;Link for React &quot; title=&quot;Link for React &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useTransition&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useDeferredValue&lt;/code&gt; to separate urgent updates from transitions. (&lt;a href=&quot;https://github.com/react/react/pull/10426&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#10426&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/10715&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#10715&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/15593&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#15593&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/15272&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#15272&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/15578&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#15578&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/15769&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#15769&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/17058&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#17058&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/18796&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#18796&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/19121&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#19121&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/19703&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#19703&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/19719&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#19719&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/19724&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#19724&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/20672&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#20672&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/20976&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#20976&lt;/a&gt; by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;, &lt;a href=&quot;https://github.com/lunaruan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@lunaruan&lt;/a&gt;, &lt;a href=&quot;https://github.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@rickhanlonii&lt;/a&gt;, and &lt;a href=&quot;https://github.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useId&lt;/code&gt; for generating unique IDs. (&lt;a href=&quot;https://github.com/react/react/pull/17322&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#17322&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/18576&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#18576&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22644&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22644&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22672&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22672&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/21260&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21260&lt;/a&gt; by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;, &lt;a href=&quot;https://github.com/lunaruan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@lunaruan&lt;/a&gt;, and &lt;a href=&quot;https://github.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useSyncExternalStore&lt;/code&gt; to help external store libraries integrate with React. (&lt;a href=&quot;https://github.com/react/react/pull/15022&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#15022&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/18000&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#18000&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/18771&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#18771&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22211&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22211&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22292&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22292&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22239&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22239&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22347&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22347&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/23150&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23150&lt;/a&gt; by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;, &lt;a href=&quot;https://github.com/bvaughn&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@bvaughn&lt;/a&gt;, and &lt;a href=&quot;https://github.com/drarmstr&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@drarmstr&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startTransition&lt;/code&gt; as a version of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useTransition&lt;/code&gt; without pending feedback. (&lt;a href=&quot;https://github.com/react/react/pull/19696&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#19696&lt;/a&gt;  by &lt;a href=&quot;https://github.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@rickhanlonii&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useInsertionEffect&lt;/code&gt; for CSS-in-JS libraries. (&lt;a href=&quot;https://github.com/react/react/pull/21913&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21913&lt;/a&gt;  by &lt;a href=&quot;https://github.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@rickhanlonii&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Make Suspense remount layout effects when content reappears.  (&lt;a href=&quot;https://github.com/react/react/pull/19322&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#19322&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/19374&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#19374&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/19523&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#19523&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/20625&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#20625&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/21079&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21079&lt;/a&gt; by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;, &lt;a href=&quot;https://github.com/bvaughn&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@bvaughn&lt;/a&gt;, and &lt;a href=&quot;https://github.com/lunaruan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@lunaruan&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Make &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;StrictMode&amp;gt;&lt;/code&gt; re-run effects to check for restorable state. (&lt;a href=&quot;https://github.com/react/react/pull/19523&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#19523&lt;/a&gt; , &lt;a href=&quot;https://github.com/react/react/pull/21418&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21418&lt;/a&gt;  by &lt;a href=&quot;https://github.com/bvaughn&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@bvaughn&lt;/a&gt; and &lt;a href=&quot;https://github.com/lunaruan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@lunaruan&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Assume Symbols are always available. (&lt;a href=&quot;https://github.com/react/react/pull/23348&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23348&lt;/a&gt;  by &lt;a href=&quot;https://github.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Remove &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;object-assign&lt;/code&gt; polyfill. (&lt;a href=&quot;https://github.com/react/react/pull/23351&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23351&lt;/a&gt;  by &lt;a href=&quot;https://github.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Remove unsupported &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unstable_changedBits&lt;/code&gt; API.  (&lt;a href=&quot;https://github.com/react/react/pull/20953&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#20953&lt;/a&gt;  by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Allow components to render undefined. (&lt;a href=&quot;https://github.com/react/react/pull/21869&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21869&lt;/a&gt;  by &lt;a href=&quot;https://github.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@rickhanlonii&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Flush &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useEffect&lt;/code&gt; resulting from discrete events like clicks synchronously. (&lt;a href=&quot;https://github.com/react/react/pull/21150&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21150&lt;/a&gt;  by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Suspense &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;fallback={undefined}&lt;/code&gt; now behaves the same as &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;null&lt;/code&gt; and isn’t ignored. (&lt;a href=&quot;https://github.com/react/react/pull/21854&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21854&lt;/a&gt;  by &lt;a href=&quot;https://github.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@rickhanlonii&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Consider all &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;lazy()&lt;/code&gt; resolving to the same component equivalent. (&lt;a href=&quot;https://github.com/react/react/pull/20357&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#20357&lt;/a&gt;  by &lt;a href=&quot;https://github.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Don’t patch console during first render. (&lt;a href=&quot;https://github.com/react/react/pull/22308&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22308&lt;/a&gt;  by &lt;a href=&quot;https://github.com/lunaruan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@lunaruan&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Improve memory usage. (&lt;a href=&quot;https://github.com/react/react/pull/21039&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21039&lt;/a&gt;  by &lt;a href=&quot;https://github.com/bgirard&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@bgirard&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Improve messages if string coercion throws (Temporal.*, Symbol, etc.) (&lt;a href=&quot;https://github.com/react/react/pull/22064&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22064&lt;/a&gt;  by &lt;a href=&quot;https://github.com/justingrant&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@justingrant&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;setImmediate&lt;/code&gt; when available over &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;MessageChannel&lt;/code&gt;. (&lt;a href=&quot;https://github.com/react/react/pull/20834&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#20834&lt;/a&gt;  by &lt;a href=&quot;https://github.com/gaearon&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@gaearon&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix context failing to propagate inside suspended trees. (&lt;a href=&quot;https://github.com/react/react/pull/23095&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23095&lt;/a&gt;  by &lt;a href=&quot;https://github.com/gaearon&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@gaearon&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useReducer&lt;/code&gt; observing incorrect props by removing the eager bailout mechanism. (&lt;a href=&quot;https://github.com/react/react/pull/22445&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22445&lt;/a&gt;  by &lt;a href=&quot;https://github.com/josephsavona&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@josephsavona&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;setState&lt;/code&gt; being ignored in Safari when appending iframes. (&lt;a href=&quot;https://github.com/react/react/pull/23111&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23111&lt;/a&gt;  by &lt;a href=&quot;https://github.com/gaearon&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@gaearon&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix a crash when rendering &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ZonedDateTime&lt;/code&gt; in the tree. (&lt;a href=&quot;https://github.com/react/react/pull/20617&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#20617&lt;/a&gt;  by &lt;a href=&quot;https://github.com/dimaqq&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@dimaqq&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix a crash when document is set to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;null&lt;/code&gt; in tests. (&lt;a href=&quot;https://github.com/react/react/pull/22695&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22695&lt;/a&gt;  by &lt;a href=&quot;https://github.com/SimenB&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@SimenB&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;onLoad&lt;/code&gt; not triggering when concurrent features are on. (&lt;a href=&quot;https://github.com/react/react/pull/23316&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23316&lt;/a&gt;  by &lt;a href=&quot;https://github.com/gnoff&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@gnoff&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix a warning when a selector returns &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;NaN&lt;/code&gt;.  (&lt;a href=&quot;https://github.com/react/react/pull/23333&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23333&lt;/a&gt;  by &lt;a href=&quot;https://github.com/hachibeeDI&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@hachibeeDI&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix a crash when document is set to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;null&lt;/code&gt; in tests. (&lt;a href=&quot;https://github.com/react/react/pull/22695&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22695&lt;/a&gt; by &lt;a href=&quot;https://github.com/SimenB&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@SimenB&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix the generated license header. (&lt;a href=&quot;https://github.com/react/react/pull/23004&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23004&lt;/a&gt;  by &lt;a href=&quot;https://github.com/vitaliemiron&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@vitaliemiron&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;package.json&lt;/code&gt; as one of the entry points. (&lt;a href=&quot;https://github.com/react/react/pull/22954&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22954&lt;/a&gt;  by &lt;a href=&quot;https://github.com/Jack-Works&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@Jack&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Allow suspending outside a Suspense boundary. (&lt;a href=&quot;https://github.com/react/react/pull/23267&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23267&lt;/a&gt;  by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Log a recoverable error whenever hydration fails. (&lt;a href=&quot;https://github.com/react/react/pull/23319&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23319&lt;/a&gt;  by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;react-dom&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React DOM &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#react-dom&quot; aria-label=&quot;Link for React DOM &quot; title=&quot;Link for React DOM &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createRoot&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hydrateRoot&lt;/code&gt;. (&lt;a href=&quot;https://github.com/react/react/pull/10239&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#10239&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/11225&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#11225&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/12117&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#12117&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/13732&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#13732&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/15502&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#15502&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/15532&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#15532&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/17035&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#17035&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/17165&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#17165&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/20669&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#20669&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/20748&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#20748&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/20888&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#20888&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/21072&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21072&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/21417&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21417&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/21652&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21652&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/21687&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21687&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/23207&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23207&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/23385&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23385&lt;/a&gt; by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;, &lt;a href=&quot;https://github.com/bvaughn&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@bvaughn&lt;/a&gt;, &lt;a href=&quot;https://github.com/gaearon&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@gaearon&lt;/a&gt;, &lt;a href=&quot;https://github.com/lunaruan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@lunaruan&lt;/a&gt;, &lt;a href=&quot;https://github.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@rickhanlonii&lt;/a&gt;, &lt;a href=&quot;https://github.com/trueadm&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@trueadm&lt;/a&gt;, and &lt;a href=&quot;https://github.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add selective hydration. (&lt;a href=&quot;https://github.com/react/react/pull/14717&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#14717&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/14884&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#14884&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/16725&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#16725&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/16880&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#16880&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/17004&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#17004&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22416&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22416&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22629&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22629&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22448&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22448&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22856&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22856&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/23176&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23176&lt;/a&gt; by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;, &lt;a href=&quot;https://github.com/gaearon&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@gaearon&lt;/a&gt;, &lt;a href=&quot;https://github.com/salazarm&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@salazarm&lt;/a&gt;, and &lt;a href=&quot;https://github.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;aria-description&lt;/code&gt; to the list of known ARIA attributes. (&lt;a href=&quot;https://github.com/react/react/pull/22142&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22142&lt;/a&gt;  by &lt;a href=&quot;https://github.com/mahyareb&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@mahyareb&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;onResize&lt;/code&gt; event to video elements. (&lt;a href=&quot;https://github.com/react/react/pull/21973&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21973&lt;/a&gt;  by &lt;a href=&quot;https://github.com/rileyjshaw&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@rileyjshaw&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;imageSizes&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;imageSrcSet&lt;/code&gt; to known props. (&lt;a href=&quot;https://github.com/react/react/pull/22550&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22550&lt;/a&gt;  by &lt;a href=&quot;https://github.com/eps1lon&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@eps1lon&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Allow non-string &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;option&amp;gt;&lt;/code&gt; children if &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;value&lt;/code&gt; is provided.  (&lt;a href=&quot;https://github.com/react/react/pull/21431&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21431&lt;/a&gt;  by &lt;a href=&quot;https://github.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;aspectRatio&lt;/code&gt; style not being applied. (&lt;a href=&quot;https://github.com/react/react/pull/21100&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21100&lt;/a&gt;  by &lt;a href=&quot;https://github.com/gaearon&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@gaearon&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Warn if &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderSubtreeIntoContainer&lt;/code&gt; is called. (&lt;a href=&quot;https://github.com/react/react/pull/23355&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23355&lt;/a&gt;  by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;react-dom-server-1&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React DOM Server &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#react-dom-server-1&quot; aria-label=&quot;Link for React DOM Server &quot; title=&quot;Link for React DOM Server &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add the new streaming renderer. (&lt;a href=&quot;https://github.com/react/react/pull/14144&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#14144&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/20970&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#20970&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/21056&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21056&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/21255&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21255&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/21200&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21200&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/21257&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21257&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/21276&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21276&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22443&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22443&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/22450&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22450&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/23247&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23247&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/24025&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#24025&lt;/a&gt;, &lt;a href=&quot;https://github.com/react/react/pull/24030&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#24030&lt;/a&gt; by &lt;a href=&quot;https://github.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix context providers in SSR when handling multiple requests. (&lt;a href=&quot;https://github.com/react/react/pull/23171&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23171&lt;/a&gt;  by &lt;a href=&quot;https://github.com/frandiox&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@frandiox&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Revert to client render on text mismatch. (&lt;a href=&quot;https://github.com/react/react/pull/23354&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23354&lt;/a&gt;  by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Deprecate &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToNodeStream&lt;/code&gt;. (&lt;a href=&quot;https://github.com/react/react/pull/23359&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23359&lt;/a&gt;  by &lt;a href=&quot;https://github.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix a spurious error log in the new server renderer. (&lt;a href=&quot;https://github.com/react/react/pull/24043&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#24043&lt;/a&gt;  by &lt;a href=&quot;https://github.com/eps1lon&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@eps1lon&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix a bug in the new server renderer. (&lt;a href=&quot;https://github.com/react/react/pull/22617&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22617&lt;/a&gt;  by &lt;a href=&quot;https://github.com/shuding&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@shuding&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Ignore function and symbol values inside custom elements on the server. (&lt;a href=&quot;https://github.com/react/react/pull/21157&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21157&lt;/a&gt;  by &lt;a href=&quot;https://github.com/sebmarkbage&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@sebmarkbage&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;react-dom-test-utils&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React DOM Test Utils &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#react-dom-test-utils&quot; aria-label=&quot;Link for React DOM Test Utils &quot; title=&quot;Link for React DOM Test Utils &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Throw when &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;act&lt;/code&gt; is used in production. (&lt;a href=&quot;https://github.com/react/react/pull/21686&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21686&lt;/a&gt;  by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Support disabling spurious act warnings with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;global.IS_REACT_ACT_ENVIRONMENT&lt;/code&gt;. (&lt;a href=&quot;https://github.com/react/react/pull/22561&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22561&lt;/a&gt;  by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Expand act warning to cover all APIs that might schedule React work. (&lt;a href=&quot;https://github.com/react/react/pull/22607&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22607&lt;/a&gt;  by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Make &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;act&lt;/code&gt; batch updates. (&lt;a href=&quot;https://github.com/react/react/pull/21797&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#21797&lt;/a&gt;  by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Remove warning for dangling passive effects. (&lt;a href=&quot;https://github.com/react/react/pull/22609&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22609&lt;/a&gt;  by &lt;a href=&quot;https://github.com/acdlite&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@acdlite&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;react-refresh&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React Refresh &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#react-refresh&quot; aria-label=&quot;Link for React Refresh &quot; title=&quot;Link for React Refresh &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Track late-mounted roots in Fast Refresh. (&lt;a href=&quot;https://github.com/react/react/pull/22740&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22740&lt;/a&gt;  by &lt;a href=&quot;https://github.com/anc95&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@anc95&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;exports&lt;/code&gt; field to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;package.json&lt;/code&gt;. (&lt;a href=&quot;https://github.com/react/react/pull/23087&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23087&lt;/a&gt;  by &lt;a href=&quot;https://github.com/otakustay&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@otakustay&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;server-components-experimental&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Server Components (Experimental) &lt;a href=&quot;https://react.dev/blog/2022/03/29/react-v18#server-components-experimental&quot; aria-label=&quot;Link for Server Components (Experimental) &quot; title=&quot;Link for Server Components (Experimental) &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add Server Context support. (&lt;a href=&quot;https://github.com/react/react/pull/23244&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#23244&lt;/a&gt;  by &lt;a href=&quot;https://github.com/salazarm&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@salazarm&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Add &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;lazy&lt;/code&gt; support. (&lt;a href=&quot;https://github.com/react/react/pull/24068&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#24068&lt;/a&gt;  by &lt;a href=&quot;https://github.com/gnoff&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@gnoff&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Update webpack plugin for webpack 5 (&lt;a href=&quot;https://github.com/react/react/pull/22739&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22739&lt;/a&gt;  by &lt;a href=&quot;https://github.com/michenly&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@michenly&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Fix a mistake in the Node loader. (&lt;a href=&quot;https://github.com/react/react/pull/22537&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22537&lt;/a&gt;  by &lt;a href=&quot;https://github.com/btea&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@btea&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;Use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;globalThis&lt;/code&gt; instead of &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;window&lt;/code&gt; for edge environments. (&lt;a href=&quot;https://github.com/react/react/pull/22777&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;#22777&lt;/a&gt;  by &lt;a href=&quot;https://github.com/huozhi&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;@huozhi&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Labs: What We&#39;ve Been Working On – June 2022&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;How to Upgrade to React 18&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2022/03/29/react-v18</link><guid isPermaLink="false">https://react.dev/blog/2022/03/29/react-v18</guid><pubDate>Mon, 28 Mar 2022 16:00:00 GMT</pubDate></item><item><title>How to Upgrade to React 18</title><description>&lt;div class=&quot;max-w-7xl mx-auto lg:flex lg:flex-col lg:items-center&quot;&gt;&lt;div class=&quot;max-w-4xl ms-0 2xl:mx-auto&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;March 08, 2022 by &lt;a href=&quot;https://twitter.com/rickhanlonii&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Rick Hanlon&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;div class=&quot;font-display text-xl text-primary dark:text-primary-dark leading-relaxed&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;As we shared in the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2022/03/29/react-v18&quot;&gt;release post&lt;/a&gt;, React 18 introduces features powered by our new concurrent renderer, with a gradual adoption strategy for existing applications. In this post, we will guide you through the steps for upgrading to React 18.&lt;/p&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Please &lt;a href=&quot;https://github.com/react/react/issues/new/choose&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;report any issues&lt;/a&gt; you encounter while upgrading to React 18.&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For React Native users, React 18 will ship in a future version of React Native. This is because React 18 relies on the New React Native Architecture to benefit from the new capabilities presented in this blogpost. For more information, see the &lt;a href=&quot;https://www.youtube.com/watch?v=FZ0cG47msEk&amp;amp;t=1530s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React Conf keynote here&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr class=&quot;my-6 block border-b border-t-0 border-border dark:border-border-dark&quot;&gt;
&lt;h2 id=&quot;installing&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Installing &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#installing&quot; aria-label=&quot;Link for Installing &quot; title=&quot;Link for Installing &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To install the latest version of React:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;npm &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;install &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Or if you’re using yarn:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;yarn &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;add &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;react&lt;/span&gt;-&lt;span class=&quot;sp-syntax-plain&quot;&gt;dom&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;h2 id=&quot;updates-to-client-rendering-apis&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Updates to Client Rendering APIs &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#updates-to-client-rendering-apis&quot; aria-label=&quot;Link for Updates to Client Rendering APIs &quot; title=&quot;Link for Updates to Client Rendering APIs &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When you first install React 18, you will see a warning in the console:&lt;/p&gt;
&lt;div class=&quot;console-block mb-4 text-secondary bg-wash dark:bg-wash-dark rounded-lg&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;flex w-full rounded-t-lg bg-gray-200 dark:bg-gray-80&quot;&gt;&lt;div class=&quot;px-4 py-2 border-gray-300 dark:border-gray-90 border-r&quot;&gt;&lt;div class=&quot;bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:15px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex text-sm px-4&quot;&gt;&lt;div class=&quot;border-b-2 border-gray-300 dark:border-gray-90 text-tertiary dark:text-tertiary-dark&quot;&gt;Console&lt;/div&gt;&lt;div class=&quot;px-4 py-2 flex&quot;&gt;&lt;div class=&quot;me-2 bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;me-2 hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex px-4 pt-4 pb-6 items-center content-center font-mono text-code rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-3&quot;&gt;ReactDOM.render is no longer supported in React 18. Use createRoot instead. Until you switch to the new API, your app will behave as if it’s running React 17. Learn more: &lt;a href=&quot;https://reactjs.org/link/switch-to-createroot&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;https://reactjs.org/link/switch-to-createroot&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 18 introduces a new root API which provides better ergonomics for managing roots. The new root API also enables the new concurrent renderer, which allows you to opt-into concurrent features.&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;render&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;app&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;tab&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;home&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;createRoot&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom/client&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;app&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;root&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createRoot&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;sp-syntax-comment&quot;&gt;// createRoot(container!) if you use TypeScript&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;root&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;tab&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;home&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve also changed &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;unmountComponentAtNode&lt;/code&gt; to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;root.unmount&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;unmountComponentAtNode&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;root&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;unmount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’ve also removed the callback from render, since it usually does not have the expected result when using Suspense:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;app&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;tab&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;home&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-plain&quot;&gt;console&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;rendered&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;AppWithCallbackAfterRender&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-plain&quot;&gt;console&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;rendered&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;tab&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;home&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;app&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;root&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;createRoot&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;root&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;AppWithCallbackAfterRender&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;There is no one-to-one replacement for the old render callback API — it depends on your use case. See the working group post for &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/5&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Replacing render with createRoot&lt;/a&gt; for more information.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Finally, if your app uses server-side rendering with hydration, upgrade &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hydrate&lt;/code&gt; to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;hydrateRoot&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;hydrate&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;app&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;hydrate&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;tab&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;home&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;hydrateRoot&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom/client&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt; = &lt;span class=&quot;sp-syntax-plain&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;app&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;root&lt;/span&gt; = &lt;span class=&quot;sp-syntax-definition&quot;&gt;hydrateRoot&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;sp-syntax-property&quot;&gt;tab&lt;/span&gt;=&lt;span class=&quot;sp-syntax-string&quot;&gt;&quot;home&quot;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Unlike with createRoot, you don&#39;t need a separate root.render() call here.&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more information, see the &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/5&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;working group discussion here&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;expandable-callout pt-8 pb-4 px-5 sm:px-8 my-8 relative rounded-none shadow-inner-border -mx-5 sm:mx-auto sm:rounded-2xl bg-green-5 dark:bg-green-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg&quot;&gt;&lt;h3 class=&quot;text-2xl font-display font-bold text-green-60 dark:text-green-40&quot;&gt;&lt;svg class=&quot;inline me-2 mb-1 text-lg text-green-60 dark:text-green-40&quot; width=&quot;2em&quot; height=&quot;2em&quot; viewBox=&quot;0 0 72 72&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g clip-path=&quot;url(#clip0_40_48064)&quot;&gt;&lt;path d=&quot;M24 27C24 25.3431 25.3431 24 27 24H45C46.6569 24 48 25.3431 48 27C48 28.6569 46.6569 30 45 30H27C25.3431 30 24 28.6569 24 27Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M24 39C24 37.3431 25.3431 36 27 36H39C40.6569 36 42 37.3431 42 39C42 40.6569 40.6569 42 39 42H27C25.3431 42 24 40.6569 24 39Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 18C12 13.0294 16.0294 9 21 9H51C55.9706 9 60 13.0294 60 18V54C60 58.9706 55.9706 63 51 63H21C16.0294 63 12 58.9706 12 54V18ZM21 15H51C52.6569 15 54 16.3431 54 18V54C54 55.6569 52.6569 57 51 57H21C19.3431 57 18 55.6569 18 54V18C18 16.3431 19.3431 15 21 15Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;defs&gt;&lt;clipPath id=&quot;clip0_40_48064&quot;&gt;&lt;rect width=&quot;72&quot; height=&quot;72&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;/svg&gt;Note&lt;/h3&gt;&lt;div class=&quot;relative&quot;&gt;&lt;div class=&quot;py-2&quot;&gt;&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;If your app doesn’t work after upgrading, check whether it’s wrapped in &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;StrictMode&amp;gt;&lt;/code&gt;.&lt;/strong&gt; &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#updates-to-strict-mode&quot;&gt;Strict Mode has gotten stricter in React 18&lt;/a&gt;, and not all your components may be resilient to the new checks it adds in development mode. If removing Strict Mode fixes your app, you can remove it during the upgrade, and then add it back (either at the top or for a part of the tree) after you fix the issues that it’s pointing out.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;updates-to-server-rendering-apis&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Updates to Server Rendering APIs &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#updates-to-server-rendering-apis&quot; aria-label=&quot;Link for Updates to Server Rendering APIs &quot; title=&quot;Link for Updates to Server Rendering APIs &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In this release, we’re revamping our &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom/server&lt;/code&gt; APIs to fully support Suspense on the server and Streaming SSR. As part of these changes, we’re deprecating the old Node streaming API, which does not support incremental Suspense streaming on the server.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Using this API will now warn:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToNodeStream&lt;/code&gt;: &lt;strong class=&quot;font-bold&quot;&gt;Deprecated ⛔️️&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Instead, for streaming in Node environments, use:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToPipeableStream&lt;/code&gt;: &lt;strong class=&quot;font-bold&quot;&gt;New ✨&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;We’re also introducing a new API to support streaming SSR with Suspense for modern edge runtime environments, such as Deno and Cloudflare workers:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToReadableStream&lt;/code&gt;: &lt;strong class=&quot;font-bold&quot;&gt;New ✨&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The following APIs will continue working, but with limited support for Suspense:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToString&lt;/code&gt;: &lt;strong class=&quot;font-bold&quot;&gt;Limited&lt;/strong&gt; ⚠️&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToStaticMarkup&lt;/code&gt;: &lt;strong class=&quot;font-bold&quot;&gt;Limited&lt;/strong&gt; ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Finally, this API will continue to work for rendering e-mails:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToStaticNodeStream&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more information on the changes to server rendering APIs, see the working group post on &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/22&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Upgrading to React 18 on the server&lt;/a&gt;, a &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/37&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;deep dive on the new Suspense SSR Architecture&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/shaundai&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Shaundai Person’s&lt;/a&gt; talk on &lt;a href=&quot;https://www.youtube.com/watch?v=pj5N-Khihgc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Streaming Server Rendering with Suspense&lt;/a&gt; at React Conf 2021.&lt;/p&gt;
&lt;h2 id=&quot;updates-to-typescript-definitions&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Updates to TypeScript definitions &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#updates-to-typescript-definitions&quot; aria-label=&quot;Link for Updates to TypeScript definitions &quot; title=&quot;Link for Updates to TypeScript definitions &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If your project uses TypeScript, you will need to update your &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;@types/react&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;@types/react-dom&lt;/code&gt; dependencies to the latest versions. The new types are safer and catch issues that used to be ignored by the type checker. The most notable change is that the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;children&lt;/code&gt; prop now needs to be listed explicitly when defining props, for example:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;interface &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;MyButtonProps &lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  color&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-plain&quot;&gt;children&lt;/span&gt;?: &lt;span class=&quot;sp-syntax-plain&quot;&gt;React&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;ReactNode&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;See the &lt;a href=&quot;https://github.com/DefinitelyTyped/DefinitelyTyped/pull/56210&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;React 18 typings pull request&lt;/a&gt; for a full list of type-only changes. It links to example fixes in library types so you can see how to adjust your code. You can use the &lt;a href=&quot;https://github.com/eps1lon/types-react-codemod&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;automated migration script&lt;/a&gt; to help port your application code to the new and safer typings faster.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you find a bug in the typings, please &lt;a href=&quot;https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/new?category=issues-with-a-types-package&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;file an issue&lt;/a&gt; in the DefinitelyTyped repo.&lt;/p&gt;
&lt;h2 id=&quot;automatic-batching&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Automatic Batching &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#automatic-batching&quot; aria-label=&quot;Link for Automatic Batching &quot; title=&quot;Link for Automatic Batching &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 18 adds out-of-the-box performance improvements by doing more batching by default. Batching is when React groups multiple state updates into a single re-render for better performance. Before React 18, we only batched updates inside React event handlers. Updates inside of promises, setTimeout, native event handlers, or any other event were not batched in React by default:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// Before React 18 only React events were batched&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setCount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; + &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setFlag&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; !&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// React will only re-render once at the end (that&#39;s batching!)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setCount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; + &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setFlag&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; !&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// React will render twice, once for each state update (no batching)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Starting in React 18 with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createRoot&lt;/code&gt;, all updates will be automatically batched, no matter where they originate from. This means that updates inside of timeouts, promises, native event handlers or any other event will batch the same way as updates inside of React events:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// After React 18 updates inside of timeouts, promises,&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// native event handlers or any other event are batched.&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setCount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; + &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setFlag&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; !&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// React will only re-render once at the end (that&#39;s batching!)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-definition&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setCount&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; + &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;setFlag&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; !&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// React will only re-render once at the end (that&#39;s batching!)&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sp-syntax-static&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This is a breaking change, but we expect this to result in less work rendering, and therefore better performance in your applications. To opt-out of automatic batching, you can use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;flushSync&lt;/code&gt;:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;flushSync&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;sp-syntax-keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;sp-syntax-string&quot;&gt;&#39;react-dom&#39;&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;sp-syntax-definition&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;flushSync&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;setCounter&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;c&lt;/span&gt; + &lt;span class=&quot;sp-syntax-static&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// React has updated the DOM by now&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-definition&quot;&gt;flushSync&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    &lt;span class=&quot;sp-syntax-definition&quot;&gt;setFlag&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;=&amp;gt;&lt;/span&gt; !&lt;span class=&quot;sp-syntax-plain&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;  &lt;span class=&quot;sp-syntax-comment&quot;&gt;// React has updated the DOM by now&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more information, see the &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/21&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Automatic batching deep dive&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;new-apis-for-libraries&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;New APIs for Libraries &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#new-apis-for-libraries&quot; aria-label=&quot;Link for New APIs for Libraries &quot; title=&quot;Link for New APIs for Libraries &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the React 18 Working Group we worked with library maintainers to create new APIs needed to support concurrent rendering for use cases specific to their use case in areas like styles, and external stores. To support React 18, some libraries may need to switch to one of the following APIs:&lt;/p&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useSyncExternalStore&lt;/code&gt; is a new Hook that allows external stores to support concurrent reads by forcing updates to the store to be synchronous. This new API is recommended for any library that integrates with state external to React. For more information, see the &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/70&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;useSyncExternalStore overview post&lt;/a&gt; and &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/86&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;useSyncExternalStore API details&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useInsertionEffect&lt;/code&gt; is a new Hook that allows CSS-in-JS libraries to address performance issues of injecting styles in render. Unless you’ve already built a CSS-in-JS library we don’t expect you to ever use this. This Hook will run after the DOM is mutated, but before layout effects read the new layout. This solves an issue that already exists in React 17 and below, but is even more important in React 18 because React yields to the browser during concurrent rendering, giving it a chance to recalculate layout. For more information, see the &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/110&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Library Upgrade Guide for &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;style&amp;gt;&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;React 18 also introduces new APIs for concurrent rendering such as &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;startTransition&lt;/code&gt;, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useDeferredValue&lt;/code&gt; and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;useId&lt;/code&gt;, which we share more about in the &lt;a class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot; href=&quot;https://react.dev/blog/2022/03/29/react-v18&quot;&gt;release post&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;updates-to-strict-mode&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Updates to Strict Mode &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#updates-to-strict-mode&quot; aria-label=&quot;Link for Updates to Strict Mode &quot; title=&quot;Link for Updates to Strict Mode &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In the future, we’d like to add a feature that allows React to add and remove sections of the UI while preserving state. For example, when a user tabs away from a screen and back, React should be able to immediately show the previous screen. To do this, React would unmount and remount trees using the same component state as before.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;This feature will give React better performance out-of-the-box, but requires components to be resilient to effects being mounted and destroyed multiple times. Most effects will work without any changes, but some effects assume they are only mounted or destroyed once.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To help surface these issues, React 18 introduces a new development-only check to Strict Mode. This new check will automatically unmount and remount every component, whenever a component mounts for the first time, restoring the previous state on the second mount.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Before this change, React would mount the component and create the effects:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;* &lt;span class=&quot;sp-syntax-plain&quot;&gt;React &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;mounts &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;the &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;component&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Layout &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;created&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Effect &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;created&lt;/span&gt;.&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;With Strict Mode in React 18, React will simulate unmounting and remounting the component in development mode:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;* &lt;span class=&quot;sp-syntax-plain&quot;&gt;React &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;mounts &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;the &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;component&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Layout &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;created&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Effect &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;created&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;* &lt;span class=&quot;sp-syntax-plain&quot;&gt;React &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;simulates &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;unmounting &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;the &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;component&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Layout &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;destroyed&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Effects &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;are &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;destroyed&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;* &lt;span class=&quot;sp-syntax-plain&quot;&gt;React &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;simulates &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;mounting &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;the &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;component &lt;/span&gt;&lt;span class=&quot;sp-syntax-keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;sp-syntax-plain&quot;&gt;the &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;previous &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;state&lt;/span&gt;.&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Layout &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;effect &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;setup &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;code &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;runs&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;    * &lt;span class=&quot;sp-syntax-plain&quot;&gt;Effect &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;setup &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;code &lt;/span&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;runs&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;For more information, see the Working Group posts for &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/19&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;Adding Reusable State to StrictMode&lt;/a&gt; and &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/18&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;How to support Reusable State in Effects&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;configuring-your-testing-environment&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Configuring Your Testing Environment &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#configuring-your-testing-environment&quot; aria-label=&quot;Link for Configuring Your Testing Environment &quot; title=&quot;Link for Configuring Your Testing Environment &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;When you first update your tests to use &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;createRoot&lt;/code&gt;, you may see this warning in your test console:&lt;/p&gt;
&lt;div class=&quot;console-block mb-4 text-secondary bg-wash dark:bg-wash-dark rounded-lg&quot; translate=&quot;no&quot; dir=&quot;ltr&quot;&gt;&lt;div class=&quot;flex w-full rounded-t-lg bg-gray-200 dark:bg-gray-80&quot;&gt;&lt;div class=&quot;px-4 py-2 border-gray-300 dark:border-gray-90 border-r&quot;&gt;&lt;div class=&quot;bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:15px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex text-sm px-4&quot;&gt;&lt;div class=&quot;border-b-2 border-gray-300 dark:border-gray-90 text-tertiary dark:text-tertiary-dark&quot;&gt;Console&lt;/div&gt;&lt;div class=&quot;px-4 py-2 flex&quot;&gt;&lt;div class=&quot;me-2 bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;me-2 hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;hidden md:block bg-gray-300 dark:bg-gray-70&quot; style=&quot;width:60px;height:17px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex px-4 pt-4 pb-6 items-center content-center font-mono text-code rounded-b-md bg-red-30 text-red-50 dark:text-red-30 bg-opacity-5&quot;&gt;&lt;svg class=&quot;self-start mt-1.5&quot; width=&quot;1.33em&quot; height=&quot;1.33em&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;circle cx=&quot;10.1626&quot; cy=&quot;9.99951&quot; r=&quot;9.47021&quot; fill=&quot;currentColor&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6.22705 5.95996L14.2798 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.2798 5.95996L6.22705 14.0127&quot; stroke=&quot;white&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div class=&quot;px-3&quot;&gt;The current testing environment is not configured to support act(…)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;To fix this, set &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;globalThis.IS_REACT_ACT_ENVIRONMENT&lt;/code&gt; to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;true&lt;/code&gt; before running your test:&lt;/p&gt;
&lt;!--$--&gt;&lt;div dir=&quot;ltr&quot; class=&quot;sandpack sandpack--codeblock rounded-2xl h-full w-full overflow-x-auto flex items-center bg-wash dark:bg-gray-95 shadow-lg my-8&quot; style=&quot;contain:content&quot;&gt;&lt;div class=&quot;sp-wrapper&quot;&gt;&lt;div class=&quot;sp-stack&quot;&gt;&lt;div class=&quot;sp-code-editor&quot;&gt;&lt;pre class=&quot;sp-cm sp-pristine sp-javascript flex align-start&quot;&gt;&lt;code class=&quot;sp-pre-placeholder grow-[2]&quot;&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-comment&quot;&gt;// In your test setup file&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;cm-line &quot;&gt;&lt;span class=&quot;sp-syntax-plain&quot;&gt;globalThis&lt;/span&gt;.&lt;span class=&quot;sp-syntax-property&quot;&gt;IS_REACT_ACT_ENVIRONMENT&lt;/span&gt; = &lt;span class=&quot;sp-syntax-static&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sp-syntax-punctuation&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--/$--&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;The purpose of the flag is to tell React that it’s running in a unit test-like environment. React will log helpful warnings if you forget to wrap an update with &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;act&lt;/code&gt;.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can also set the flag to &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;false&lt;/code&gt; to tell React that &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;act&lt;/code&gt; isn’t needed. This can be useful for end-to-end tests that simulate a full browser environment.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;Eventually, we expect testing libraries will configure this for you automatically. For example, the &lt;a href=&quot;https://github.com/testing-library/react-testing-library/issues/509#issuecomment-917989936&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;next version of React Testing Library has built-in support for React 18&lt;/a&gt; without any additional configuration.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;&lt;a href=&quot;https://github.com/reactwg/react-18/discussions/102&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;More background on the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;act&lt;/code&gt; testing API and related changes&lt;/a&gt; is available in the working group.&lt;/p&gt;
&lt;h2 id=&quot;dropping-support-for-internet-explorer&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Dropping Support for Internet Explorer &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#dropping-support-for-internet-explorer&quot; aria-label=&quot;Link for Dropping Support for Internet Explorer &quot; title=&quot;Link for Dropping Support for Internet Explorer &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;In this release, React is dropping support for Internet Explorer, which is &lt;a href=&quot;https://blogs.windows.com/windowsexperience/2021/05/19/the-future-of-internet-explorer-on-windows-10-is-in-microsoft-edge&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;going out of support on June 15, 2022&lt;/a&gt;. We’re making this change now because new features introduced in React 18 are built using modern browser features such as microtasks which cannot be adequately polyfilled in IE.&lt;/p&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;If you need to support Internet Explorer we recommend you stay with React 17.&lt;/p&gt;
&lt;h2 id=&quot;deprecations&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Deprecations &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#deprecations&quot; aria-label=&quot;Link for Deprecations &quot; title=&quot;Link for Deprecations &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.render&lt;/code&gt; has been deprecated. Using it will warn and run your app in React 17 mode.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.hydrate&lt;/code&gt; has been deprecated. Using it will warn and run your app in React 17 mode.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.unmountComponentAtNode&lt;/code&gt; has been deprecated.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom&lt;/code&gt;: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOM.renderSubtreeIntoContainer&lt;/code&gt; has been deprecated.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;react-dom/server&lt;/code&gt;: &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;ReactDOMServer.renderToNodeStream&lt;/code&gt; has been deprecated.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;other-breaking-changes&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Other Breaking Changes &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#other-breaking-changes&quot; aria-label=&quot;Link for Other Breaking Changes &quot; title=&quot;Link for Other Breaking Changes &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Consistent useEffect timing&lt;/strong&gt;: React now always synchronously flushes effect functions if the update was triggered during a discrete user input event such as a click or a keydown event. Previously, the behavior wasn’t always predictable or consistent.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Stricter hydration errors&lt;/strong&gt;: Hydration mismatches due to missing or extra text content are now treated like errors instead of warnings. React will no longer attempt to “patch up” individual nodes by inserting or deleting a node on the client in an attempt to match the server markup, and will revert to client rendering up to the closest &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt; boundary in the tree. This ensures the hydrated tree is consistent and avoids potential privacy and security holes that can be caused by hydration mismatches.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Suspense trees are always consistent:&lt;/strong&gt; If a component suspends before it’s fully added to the tree, React will not add it to the tree in an incomplete state or fire its effects. Instead, React will throw away the new tree completely, wait for the asynchronous operation to finish, and then retry rendering again from scratch. React will render the retry attempt concurrently, and without blocking the browser.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Layout Effects with Suspense&lt;/strong&gt;: When a tree re-suspends and reverts to a fallback, React will now clean up layout effects, and then re-create them when the content inside the boundary is shown again. This fixes an issue which prevented component libraries from correctly measuring layout when used with Suspense.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;New JS Environment Requirements&lt;/strong&gt;: React now depends on modern browsers features including &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;Promise&lt;/code&gt;, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;Symbol&lt;/code&gt;, and &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;Object.assign&lt;/code&gt;. If you support older browsers and devices such as Internet Explorer which do not provide modern browser features natively or have non-compliant implementations, consider including a global polyfill in your bundled application.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;other-notable-changes&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Other Notable Changes &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#other-notable-changes&quot; aria-label=&quot;Link for Other Notable Changes &quot; title=&quot;Link for Other Notable Changes &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;react&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#react&quot; aria-label=&quot;Link for React &quot; title=&quot;Link for React &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Components can now render &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;undefined&lt;/code&gt;:&lt;/strong&gt; React no longer warns if you return &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;undefined&lt;/code&gt; from a component. This makes the allowed component return values consistent with values that are allowed in the middle of a component tree. We suggest to use a linter to prevent mistakes like forgetting a &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;return&lt;/code&gt; statement before JSX.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;In tests, &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;act&lt;/code&gt; warnings are now opt-in:&lt;/strong&gt; If you’re running end-to-end tests, the &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;act&lt;/code&gt; warnings are unnecessary. We’ve introduced an &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/102&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;opt-in&lt;/a&gt; mechanism so you can enable them only for unit tests where they are useful and beneficial.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;No warning about &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;setState&lt;/code&gt; on unmounted components:&lt;/strong&gt; Previously, React warned about memory leaks when you call &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;setState&lt;/code&gt; on an unmounted component. This warning was added for subscriptions, but people primarily run into it in scenarios where setting state is fine, and workarounds make the code worse. We’ve &lt;a href=&quot;https://github.com/react/react/pull/22114&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;removed&lt;/a&gt; this warning.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;No suppression of console logs:&lt;/strong&gt; When you use Strict Mode, React renders each component twice to help you find unexpected side effects. In React 17, we’ve suppressed console logs for one of the two renders to make the logs easier to read. In response to &lt;a href=&quot;https://github.com/react/react/issues/21783&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;community feedback&lt;/a&gt; about this being confusing, we’ve removed the suppression. Instead, if you have React DevTools installed, the second log’s renders will be displayed in grey, and there will be an option (off by default) to suppress them completely.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;Improved memory usage:&lt;/strong&gt; React now cleans up more internal fields on unmount, making the impact from unfixed memory leaks that may exist in your application code less severe.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;react-dom-server&quot; class=&quot;mdx-heading text-2xl font-display leading-9 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;React DOM Server &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#react-dom-server&quot; aria-label=&quot;Link for React DOM Server &quot; title=&quot;Link for React DOM Server &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul class=&quot;ms-6 my-3 list-disc&quot;&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToString&lt;/code&gt;:&lt;/strong&gt; Will no longer error when suspending on the server. Instead, it will emit the fallback HTML for the closest &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt; boundary and then retry rendering the same content on the client. It is still recommended that you switch to a streaming API like &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToPipeableStream&lt;/code&gt; or &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToReadableStream&lt;/code&gt; instead.&lt;/li&gt;
&lt;li class=&quot;leading-relaxed mb-1&quot;&gt;&lt;strong class=&quot;font-bold&quot;&gt;&lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;renderToStaticMarkup&lt;/code&gt;:&lt;/strong&gt; Will no longer error when suspending on the server. Instead, it will emit the fallback HTML for the closest &lt;code dir=&quot;ltr&quot; class=&quot;inline text-code text-secondary dark:text-secondary-dark px-1 rounded-md no-underline bg-gray-30 bg-opacity-10 py-px&quot;&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt; boundary.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;changelog&quot; class=&quot;mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6&quot;&gt;Changelog &lt;a href=&quot;https://react.dev/blog/2022/03/08/react-18-upgrade-guide#changelog&quot; aria-label=&quot;Link for Changelog &quot; title=&quot;Link for Changelog &quot; class=&quot;mdx-header-anchor inline-block&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 13 13&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;text-gray-70 ms-2 h-5 w-5&quot;&gt;&lt;g fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;path d=&quot;M7.778 7.975a2.5 2.5 0 0 0 .347-3.837L6.017 2.03a2.498 2.498 0 0 0-3.542-.007 2.5 2.5 0 0 0 .006 3.543l1.153 1.15c.07-.29.154-.563.25-.773.036-.077.084-.16.14-.25L3.18 4.85a1.496 1.496 0 0 1 .002-2.12 1.496 1.496 0 0 1 2.12 0l2.124 2.123a1.496 1.496 0 0 1-.333 2.37c.16.246.42.504.685.752z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5.657 4.557a2.5 2.5 0 0 0-.347 3.837l2.108 2.108a2.498 2.498 0 0 0 3.542.007 2.5 2.5 0 0 0-.006-3.543L9.802 5.815c-.07.29-.154.565-.25.774-.036.076-.084.16-.14.25l.842.84c.585.587.59 1.532 0 2.122-.587.585-1.532.59-2.12 0L6.008 7.68a1.496 1.496 0 0 1 .332-2.372c-.16-.245-.42-.503-.685-.75z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;whitespace-pre-wrap my-4&quot;&gt;You can view the &lt;a href=&quot;https://github.com/react/react/blob/main/CHANGELOG.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot; class=&quot;inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal&quot;&gt;full changelog here&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12&quot;&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80&quot; href=&quot;https://react.dev/blog/2022/03/29/react-v18&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition rotate-90 rtl:-rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Previous&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React v18.0&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a class=&quot;flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transparent text-base leading-base text-link dark:text-link-dark rounded-lg group focus:text-link dark:focus:text-link-dark focus:bg-highlight focus:border-link dark:focus:bg-highlight-dark dark:focus:border-link-dark focus:border-opacity-100 focus:border-2 focus:ring-1 focus:ring-offset-4 focus:ring-blue-40 active:ring-0 active:ring-offset-0 hover:bg-gray-5 dark:hover:bg-gray-80 flex-row-reverse justify-self-end text-end&quot; href=&quot;https://react.dev/blog/2021/12/17/react-conf-2021-recap&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 20 20&quot; class=&quot;duration-100 ease-in transition -rotate-90 rtl:rotate-90 inline text-tertiary dark:text-tertiary-dark group-focus:text-link dark:group-focus:text-link-dark&quot; style=&quot;min-width:20px;min-height:20px&quot;&gt;&lt;g fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; transform=&quot;translate(-446 -398)&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;nonzero&quot; d=&quot;M95.8838835,240.366117 C95.3957281,239.877961 94.6042719,239.877961 94.1161165,240.366117 C93.6279612,240.854272 93.6279612,241.645728 94.1161165,242.133883 L98.6161165,246.633883 C99.1042719,247.122039 99.8957281,247.122039 100.383883,246.633883 L104.883883,242.133883 C105.372039,241.645728 105.372039,240.854272 104.883883,240.366117 C104.395728,239.877961 103.604272,239.877961 103.116117,240.366117 L99.5,243.982233 L95.8838835,240.366117 Z&quot; transform=&quot;translate(356.5 164.5)&quot;&gt;&lt;/path&gt;&lt;polygon points=&quot;446 418 466 418 466 398 446 398&quot;&gt;&lt;/polygon&gt;&lt;/g&gt;&lt;/svg&gt;&lt;div class=&quot;flex flex-col overflow-hidden&quot;&gt;&lt;span class=&quot;text-sm font-bold tracking-wide no-underline uppercase text-secondary dark:text-secondary-dark group-focus:text-link dark:group-focus:text-link-dark group-focus:text-opacity-100&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;text-lg break-words group-hover:underline&quot;&gt;React Conf 2021 Recap&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>https://react.dev/blog/2022/03/08/react-18-upgrade-guide</link><guid isPermaLink="false">https://react.dev/blog/2022/03/08/react-18-upgrade-guide</guid><pubDate>Mon, 07 Mar 2022 16:00:00 GMT</pubDate></item></channel></rss>