useId Hook in React

For giving id to elements in React 19, you can use the useId hook. This hook generates a unique ID that can be used for accessibility purposes, such as linking labels to form inputs.

import React, { useId } from "react";
const MyComponent = () => {
  const id = useId();

  return (
    <div>
      <label htmlFor={id}>Name:</label>
      <input type="text" id={id} />
    </div>
  );
};
export default MyComponent;

Note: The useId hook is specific to React 19 and is not available in earlier versions. It is designed to generate unique IDs that are stable across server and client renders, making it ideal for use in server-side rendering scenarios.

Using useid to link multiple elements:

import React, { useId } from "react";
const MyComponent = () => {
  const nameId = useId();
  const emailId = useId();
  return (
    <div>
      <label htmlFor={nameId}>Name:</label>
      <input type="text" id={nameId} />

      <label htmlFor={emailId}>Email:</label>
      <input type="email" id={emailId} />
    </div>
  );
};
export default MyComponent;

This is ok but we can use the following way to link multiple elements with the same id:

import React, { useId } from "react";
const MyComponent = () => {
  const id = useId();

  return (
    <div>
      <label htmlFor={`${id}-name`}>Name:</label>
      <input type="text" id={`${id}-name`} />

      <label htmlFor={`${id}-email`}>Email:</label>
      <input type="email" id={`${id}-email`} />
    </div>
  );
};

export default MyComponent;

use api in React

Unlike React Hooks,use can be called within loops and conditional statements like if. Like React Hooks, the function that calls use must be a Component or Hook.It is used in

  • To get content from context
    Now you can use use to get content from context.
import React, { use } from "react";

const MyContext = React.createContext();
const MyComponent = () => {
  const value = use(MyContext); // Is Equivalent to useContext(MyContext)

  return <div>{value}</div>;
};
export default MyComponent;

Also we can use it inside loops and conditionals:

import React, { use } from "react";
const MyContext = React.createContext();
const MyComponent = () => {
  const values = [1, 2, 3];
  return (
    <div>
      {values.map((value) => {
        const contextValue = use(MyContext); // Using use inside a loop
        return (
          <div key={value}>
            {contextValue} - {value}
          </div>
        );
      })}
    </div>
  );
};
export default MyComponent;

ENV Variables in React

To use ENV variables in VITE first you need to prefix the variable with VITE_. This is a security feature to ensure that only explicitly defined variables are exposed to the client-side code.

example:

VITE_API_URL=https://api.example.com

You can access these variables in your React components using import.meta.env.

For example, if you have an environment variable named VITE_API_URL, you can access it like this:

const apiUrl = import.meta.env.VITE_API_URL;
console.log(apiUrl);

Activity Component in React

In React, when you want to conditionally show or hide a component, the most common approach is to mount or unmount it based on a condition:

{isActive && <Sidebar />}

While this works, unmounting a component destroys its internal state. This behavior is not always desirable—especially for UI elements like sidebars, tabs, or modals where users expect their previous interactions to be preserved.

Problem: State Loss When a Component Unmounts

Consider the following Sidebar component that keeps track of the currently selected menu item:

import React, { useState } from "react";

const Sidebar = () => {
  const SIDEBAR = ["Home", "Profile", "Settings", "Logout"];
  const [activeItem, setActiveItem] = useState(null);

  return (
    <ul>
      {SIDEBAR.map((item, index) => (
        <li
          key={index}
          style={{
            fontWeight: activeItem === index ? "bold" : "normal",
            color: activeItem === index ? "blue" : "black",
            cursor: "pointer",
          }}
          onClick={() => setActiveItem(index)}
        >
          {item}
        </li>
      ))}
    </ul>
  );
};

export default Sidebar;

Now, toggle this sidebar from a parent component:

const App = () => {
  const [isShowingSidebar, setIsShowingSidebar] = useState(true);

  return (
    <div>
      <button onClick={() => setIsShowingSidebar(!isShowingSidebar)}>
        Toggle Sidebar
      </button>

      {isShowingSidebar && <Sidebar />}
    </div>
  );
};

What’s the Issue?

  • When isShowingSidebar becomes false, the Sidebar component unmounts
  • When it mounts again, its internal state (activeItem) is reset
  • The previously selected menu item is lost

Traditional Solution: Lift State Up to the Parent

To preserve state, developers traditionally move the sidebar’s state to a parent component that never unmounts:

const Sidebar = ({ activeItem, setActiveItem }) => {
  const SIDEBAR = ["Home", "Profile", "Settings", "Logout"];

  return (
    <ul>
      {SIDEBAR.map((item, index) => (
        <li
          key={index}
          style={{
            fontWeight: activeItem === index ? "bold" : "normal",
            color: activeItem === index ? "blue" : "black",
            cursor: "pointer",
          }}
          onClick={() => setActiveItem(index)}
        >
          {item}
        </li>
      ))}
    </ul>
  );
};
const App = () => {
  const [isShowingSidebar, setIsShowingSidebar] = useState(true);
  const [activeItem, setActiveItem] = useState(null);

  return (
    <div>
      <button onClick={() => setIsShowingSidebar(!isShowingSidebar)}>
        Toggle Sidebar
      </button>

      {isShowingSidebar && (
        <Sidebar
          activeItem={activeItem}
          setActiveItem={setActiveItem}
        />
      )}
    </div>
  );
};

Downsides of This Approach

  • Extra prop drilling
  • State management logic moves away from the component that owns it
  • Becomes harder to scale and maintain for complex UIs

React 19 Solution: Activity Component

Basic Syntax

<Activity mode={isShowingSidebar ? "visible" : "hidden"}>
  <Sidebar />
</Activity>

Sidebar Example Using Activity

import { Activity } from "react";

const App = () => {
  const [isShowingSidebar, setIsShowingSidebar] = useState(true);

  return (
    <div>
      <button onClick={() => setIsShowingSidebar(!isShowingSidebar)}>
        Toggle Sidebar
      </button>

      <Activity mode={isShowingSidebar ? "visible" : "hidden"}>
        <Sidebar />
      </Activity>
    </div>
  );
};

What Happens Now?

  • The sidebar is visually hidden, not unmounted
  • The selected menu item remains intact
  • When shown again, the sidebar restores exactly where it left off

How Activity Works Internally

When an Activity boundary is hidden:

  • React applies display: none to hide the UI
  • All Effects are cleaned up (subscriptions, timers, listeners)
  • The component still re-renders in response to new props (at a lower priority)

When the boundary becomes visible again:

  • React restores the UI
  • Internal state is preserved
  • Effects are re-created

Why Activity Is Powerful

You can think of Activity as background rendering:

  • Keeps UI state alive
  • Avoids unnecessary remounts
  • Prevents unwanted side effects while hidden
  • Perfect for sidebars, tabs, drawers, and multi-panel layouts

Support for document metadata in React 19

In HTML, document metadata tags like , <link>, and <meta> are reserved for placement in the <head> 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 <head> or React does not render the <head> at all. In the past, these elements would need to be inserted manually in an effect, or by libraries like react-helmet, and required careful handling when server rendering a React application.</p> <p>In React 19, we’re adding support for rendering document metadata tags in components natively:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-jsx" data-lang="jsx"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">MyApp</span>() { </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> ( </span></span><span style="display:flex;"><span> <> </span></span><span style="display:flex;"><span> <<span style="color:#f92672">title</span>><span style="color:#a6e22e">My</span> <span style="color:#a6e22e">App</span></<span style="color:#f92672">title</span>> </span></span><span style="display:flex;"><span> <<span style="color:#f92672">meta</span> <span style="color:#a6e22e">name</span><span style="color:#f92672">=</span><span style="color:#e6db74">"description"</span> <span style="color:#a6e22e">content</span><span style="color:#f92672">=</span><span style="color:#e6db74">"This is my app"</span> /> </span></span><span style="display:flex;"><span> <<span style="color:#f92672">link</span> <span style="color:#a6e22e">rel</span><span style="color:#f92672">=</span><span style="color:#e6db74">"icon"</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">"/favicon.ico"</span> /> </span></span><span style="display:flex;"><span> <<span style="color:#f92672">main</span>> </span></span><span style="display:flex;"><span> <<span style="color:#f92672">h1</span>><span style="color:#a6e22e">Welcome</span> <span style="color:#a6e22e">to</span> <span style="color:#a6e22e">my</span> <span style="color:#a6e22e">app</span><span style="color:#f92672">!</span></<span style="color:#f92672">h1</span>> </span></span><span style="display:flex;"><span> </<span style="color:#f92672">main</span>> </span></span><span style="display:flex;"><span> </> </span></span><span style="display:flex;"><span> ); </span></span><span style="display:flex;"><span>} </span></span></code></pre></div><p>When React renders this component, it will see the <title> <link> and <meta> tags, and automatically hoist them to the <head> 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</p> <h2 id="as-a-provider-in-react-19"><Context> as a provider in React 19<a hidden class="anchor" aria-hidden="true" href="#as-a-provider-in-react-19">#</a></h2> <p>In React 19, you can render <Context> as a provider instead of <Context.Provider>:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-jsx" data-lang="jsx"><span style="display:flex;"><span><span style="color:#66d9ef">import</span> <span style="color:#a6e22e">React</span> <span style="color:#a6e22e">from</span> <span style="color:#e6db74">"react"</span>; </span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">MyContext</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">React</span>.<span style="color:#a6e22e">createContext</span>(); </span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">MyComponent</span> <span style="color:#f92672">=</span> () => { </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> ( </span></span><span style="display:flex;"><span> <<span style="color:#f92672">MyContext</span> <span style="color:#a6e22e">value</span><span style="color:#f92672">=</span>{<span style="color:#e6db74">"Hello, World!"</span>}> </span></span><span style="display:flex;"><span> <<span style="color:#f92672">ChildComponent</span> /> </span></span><span style="display:flex;"><span> </<span style="color:#f92672">MyContext</span>> </span></span><span style="display:flex;"><span> ); </span></span><span style="display:flex;"><span>}; </span></span></code></pre></div><blockquote> <p>Note: In future releases, we may deprecate <Context.Provider> in favor of this new syntax. This change aims to simplify the API and make it more intuitive for developers to use context providers in their applications.</p></blockquote> </div> <footer class="post-footer"> <ul class="post-tags"> <li><a href="http://reference.nirajankhatiwada.com.np/tags/react/">React</a></li> <li><a href="http://reference.nirajankhatiwada.com.np/tags/react-19/">React 19</a></li> <li><a href="http://reference.nirajankhatiwada.com.np/tags/useid/">UseId</a></li> <li><a href="http://reference.nirajankhatiwada.com.np/tags/use/">Use</a></li> <li><a href="http://reference.nirajankhatiwada.com.np/tags/activity/">Activity</a></li> <li><a href="http://reference.nirajankhatiwada.com.np/tags/metadata/">Metadata</a></li> </ul> <nav class="paginav"> <a class="prev" href="http://reference.nirajankhatiwada.com.np/posts/pages/framermotion/shared-layout-animations-layoutid/"> <span class="title">« Prev</span> <br> <span>Shared Layout Animations with layoutId</span> </a> <a class="next" href="http://reference.nirajankhatiwada.com.np/posts/pages/react/react-authentication-jwt-context/"> <span class="title">Next »</span> <br> <span>React Authentication: JWT, Axios, and Context API Guide</span> </a> </nav> <ul class="share-buttons"> <li> <a target="_blank" rel="noopener noreferrer" aria-label="share React Day 19: New Features (React 19) on x" href="https://x.com/intent/tweet/?text=React%20Day%2019%3a%20New%20Features%20%28React%2019%29&url=http%3a%2f%2freference.nirajankhatiwada.com.np%2fposts%2fpages%2freact%2freact-day-19-new-features%2f&hashtags=React%2cReact19%2cuseId%2cuse%2cActivity%2cMetadata"> <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor"> <path d="M512 62.554 L 512 449.446 C 512 483.97 483.97 512 449.446 512 L 62.554 512 C 28.03 512 0 483.97 0 449.446 L 0 62.554 C 0 28.03 28.029 0 62.554 0 L 449.446 0 C 483.971 0 512 28.03 512 62.554 Z M 269.951 190.75 L 182.567 75.216 L 56 75.216 L 207.216 272.95 L 63.9 436.783 L 125.266 436.783 L 235.9 310.383 L 332.567 436.783 L 456 436.783 L 298.367 228.367 L 432.367 75.216 L 371.033 75.216 Z M 127.633 110 L 164.101 110 L 383.481 400.065 L 349.5 400.065 Z" /> </svg> </a> </li> <li> <a target="_blank" rel="noopener noreferrer" aria-label="share React Day 19: New Features (React 19) on linkedin" href="https://www.linkedin.com/shareArticle?mini=true&url=http%3a%2f%2freference.nirajankhatiwada.com.np%2fposts%2fpages%2freact%2freact-day-19-new-features%2f&title=React%20Day%2019%3a%20New%20Features%20%28React%2019%29&summary=React%20Day%2019%3a%20New%20Features%20%28React%2019%29&source=http%3a%2f%2freference.nirajankhatiwada.com.np%2fposts%2fpages%2freact%2freact-day-19-new-features%2f"> <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor"> <path d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-288.985,423.278l0,-225.717l-75.04,0l0,225.717l75.04,0Zm270.539,0l0,-129.439c0,-69.333 -37.018,-101.586 -86.381,-101.586c-39.804,0 -57.634,21.891 -67.617,37.266l0,-31.958l-75.021,0c0.995,21.181 0,225.717 0,225.717l75.02,0l0,-126.056c0,-6.748 0.486,-13.492 2.474,-18.315c5.414,-13.475 17.767,-27.434 38.494,-27.434c27.135,0 38.007,20.707 38.007,51.037l0,120.768l75.024,0Zm-307.552,-334.556c-25.674,0 -42.448,16.879 -42.448,39.002c0,21.658 16.264,39.002 41.455,39.002l0.484,0c26.165,0 42.452,-17.344 42.452,-39.002c-0.485,-22.092 -16.241,-38.954 -41.943,-39.002Z" /> </svg> </a> </li> <li> <a target="_blank" rel="noopener noreferrer" aria-label="share React Day 19: New Features (React 19) on reddit" href="https://reddit.com/submit?url=http%3a%2f%2freference.nirajankhatiwada.com.np%2fposts%2fpages%2freact%2freact-day-19-new-features%2f&title=React%20Day%2019%3a%20New%20Features%20%28React%2019%29"> <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor"> <path d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-3.446,265.638c0,-22.964 -18.616,-41.58 -41.58,-41.58c-11.211,0 -21.361,4.457 -28.841,11.666c-28.424,-20.508 -67.586,-33.757 -111.204,-35.278l18.941,-89.121l61.884,13.157c0.756,15.734 13.642,28.29 29.56,28.29c16.407,0 29.706,-13.299 29.706,-29.701c0,-16.403 -13.299,-29.702 -29.706,-29.702c-11.666,0 -21.657,6.792 -26.515,16.578l-69.105,-14.69c-1.922,-0.418 -3.939,-0.042 -5.585,1.036c-1.658,1.073 -2.811,2.761 -3.224,4.686l-21.152,99.438c-44.258,1.228 -84.046,14.494 -112.837,35.232c-7.468,-7.164 -17.589,-11.591 -28.757,-11.591c-22.965,0 -41.585,18.616 -41.585,41.58c0,16.896 10.095,31.41 24.568,37.918c-0.639,4.135 -0.99,8.328 -0.99,12.576c0,63.977 74.469,115.836 166.33,115.836c91.861,0 166.334,-51.859 166.334,-115.836c0,-4.218 -0.347,-8.387 -0.977,-12.493c14.564,-6.47 24.735,-21.034 24.735,-38.001Zm-119.474,108.193c-20.27,20.241 -59.115,21.816 -70.534,21.816c-11.428,0 -50.277,-1.575 -70.522,-21.82c-3.007,-3.008 -3.007,-7.882 0,-10.889c3.003,-2.999 7.882,-3.003 10.885,0c12.777,12.781 40.11,17.317 59.637,17.317c19.522,0 46.86,-4.536 59.657,-17.321c3.016,-2.999 7.886,-2.995 10.885,0.008c3.008,3.011 3.003,7.882 -0.008,10.889Zm-5.23,-48.781c-16.373,0 -29.701,-13.324 -29.701,-29.698c0,-16.381 13.328,-29.714 29.701,-29.714c16.378,0 29.706,13.333 29.706,29.714c0,16.374 -13.328,29.698 -29.706,29.698Zm-160.386,-29.702c0,-16.381 13.328,-29.71 29.714,-29.71c16.369,0 29.689,13.329 29.689,29.71c0,16.373 -13.32,29.693 -29.689,29.693c-16.386,0 -29.714,-13.32 -29.714,-29.693Z" /> </svg> </a> </li> <li> <a target="_blank" rel="noopener noreferrer" aria-label="share React Day 19: New Features (React 19) on facebook" href="https://facebook.com/sharer/sharer.php?u=http%3a%2f%2freference.nirajankhatiwada.com.np%2fposts%2fpages%2freact%2freact-day-19-new-features%2f"> <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor"> <path d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-106.468,0l0,-192.915l66.6,0l12.672,-82.621l-79.272,0l0,-53.617c0,-22.603 11.073,-44.636 46.58,-44.636l36.042,0l0,-70.34c0,0 -32.71,-5.582 -63.982,-5.582c-65.288,0 -107.96,39.569 -107.96,111.204l0,62.971l-72.573,0l0,82.621l72.573,0l0,192.915l-191.104,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Z" /> </svg> </a> </li> <li> <a target="_blank" rel="noopener noreferrer" aria-label="share React Day 19: New Features (React 19) on whatsapp" href="https://api.whatsapp.com/send?text=React%20Day%2019%3a%20New%20Features%20%28React%2019%29%20-%20http%3a%2f%2freference.nirajankhatiwada.com.np%2fposts%2fpages%2freact%2freact-day-19-new-features%2f"> <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor"> <path d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-58.673,127.703c-33.842,-33.881 -78.847,-52.548 -126.798,-52.568c-98.799,0 -179.21,80.405 -179.249,179.234c-0.013,31.593 8.241,62.428 23.927,89.612l-25.429,92.884l95.021,-24.925c26.181,14.28 55.659,21.807 85.658,21.816l0.074,0c98.789,0 179.206,-80.413 179.247,-179.243c0.018,-47.895 -18.61,-92.93 -52.451,-126.81Zm-126.797,275.782l-0.06,0c-26.734,-0.01 -52.954,-7.193 -75.828,-20.767l-5.441,-3.229l-56.386,14.792l15.05,-54.977l-3.542,-5.637c-14.913,-23.72 -22.791,-51.136 -22.779,-79.287c0.033,-82.142 66.867,-148.971 149.046,-148.971c39.793,0.014 77.199,15.531 105.329,43.692c28.128,28.16 43.609,65.592 43.594,105.4c-0.034,82.149 -66.866,148.983 -148.983,148.984Zm81.721,-111.581c-4.479,-2.242 -26.499,-13.075 -30.604,-14.571c-4.105,-1.495 -7.091,-2.241 -10.077,2.241c-2.986,4.483 -11.569,14.572 -14.182,17.562c-2.612,2.988 -5.225,3.364 -9.703,1.12c-4.479,-2.241 -18.91,-6.97 -36.017,-22.23c-13.314,-11.876 -22.304,-26.542 -24.916,-31.026c-2.612,-4.484 -0.279,-6.908 1.963,-9.14c2.016,-2.007 4.48,-5.232 6.719,-7.847c2.24,-2.615 2.986,-4.484 4.479,-7.472c1.493,-2.99 0.747,-5.604 -0.374,-7.846c-1.119,-2.241 -10.077,-24.288 -13.809,-33.256c-3.635,-8.733 -7.327,-7.55 -10.077,-7.688c-2.609,-0.13 -5.598,-0.158 -8.583,-0.158c-2.986,0 -7.839,1.121 -11.944,5.604c-4.105,4.484 -15.675,15.32 -15.675,37.364c0,22.046 16.048,43.342 18.287,46.332c2.24,2.99 31.582,48.227 76.511,67.627c10.685,4.615 19.028,7.371 25.533,9.434c10.728,3.41 20.492,2.929 28.209,1.775c8.605,-1.285 26.499,-10.833 30.231,-21.295c3.732,-10.464 3.732,-19.431 2.612,-21.298c-1.119,-1.869 -4.105,-2.99 -8.583,-5.232Z" /> </svg> </a> </li> <li> <a target="_blank" rel="noopener noreferrer" aria-label="share React Day 19: New Features (React 19) on telegram" href="https://telegram.me/share/url?text=React%20Day%2019%3a%20New%20Features%20%28React%2019%29&url=http%3a%2f%2freference.nirajankhatiwada.com.np%2fposts%2fpages%2freact%2freact-day-19-new-features%2f"> <svg version="1.1" xml:space="preserve" viewBox="2 2 28 28" height="30px" width="30px" fill="currentColor"> <path d="M26.49,29.86H5.5a3.37,3.37,0,0,1-2.47-1,3.35,3.35,0,0,1-1-2.47V5.48A3.36,3.36,0,0,1,3,3,3.37,3.37,0,0,1,5.5,2h21A3.38,3.38,0,0,1,29,3a3.36,3.36,0,0,1,1,2.46V26.37a3.35,3.35,0,0,1-1,2.47A3.38,3.38,0,0,1,26.49,29.86Zm-5.38-6.71a.79.79,0,0,0,.85-.66L24.73,9.24a.55.55,0,0,0-.18-.46.62.62,0,0,0-.41-.17q-.08,0-16.53,6.11a.59.59,0,0,0-.41.59.57.57,0,0,0,.43.52l4,1.24,1.61,4.83a.62.62,0,0,0,.63.43.56.56,0,0,0,.4-.17L16.54,20l4.09,3A.9.9,0,0,0,21.11,23.15ZM13.8,20.71l-1.21-4q8.72-5.55,8.78-5.55c.15,0,.23,0,.23.16a.18.18,0,0,1,0,.06s-2.51,2.3-7.52,6.8Z" /> </svg> </a> </li> <li> <a target="_blank" rel="noopener noreferrer" aria-label="share React Day 19: New Features (React 19) on ycombinator" href="https://news.ycombinator.com/submitlink?t=React%20Day%2019%3a%20New%20Features%20%28React%2019%29&u=http%3a%2f%2freference.nirajankhatiwada.com.np%2fposts%2fpages%2freact%2freact-day-19-new-features%2f"> <svg version="1.1" xml:space="preserve" width="30px" height="30px" viewBox="0 0 512 512" fill="currentColor" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"> <path d="M449.446 0C483.971 0 512 28.03 512 62.554L512 449.446C512 483.97 483.97 512 449.446 512L62.554 512C28.03 512 0 483.97 0 449.446L0 62.554C0 28.03 28.029 0 62.554 0L449.446 0ZM183.8767 87.9921H121.8427L230.6673 292.4508V424.0079H281.3328V292.4508L390.1575 87.9921H328.1233L256 238.2489z" /> </svg> </a> </li> </ul> </footer> </article> </main> <footer class="footer"> <span>© 2025 <a href="http://reference.nirajankhatiwada.com.np/">Quick Reference</a></span> · <span> Powered by <a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> & <a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a> </span> </footer> <a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor"> <path d="M12 6H0l6-6z" /> </svg> </a><script src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js"></script> <script> const theme = localStorage.getItem("pref-theme") === "dark" ? 'dark' : 'default'; mermaid.initialize({ startOnLoad: true, theme: theme, securityLevel: 'loose' }); </script> <script> let menu = document.getElementById('menu') if (menu) { menu.scrollLeft = localStorage.getItem("menu-scroll-position"); menu.onscroll = function () { localStorage.setItem("menu-scroll-position", menu.scrollLeft); } } document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener("click", function (e) { e.preventDefault(); var id = this.getAttribute("href").substr(1); if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) { document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({ behavior: "smooth" }); } else { document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView(); } if (id === "top") { history.replaceState(null, null, " "); } else { history.pushState(null, null, `#${id}`); } }); }); </script> <script> var mybutton = document.getElementById("top-link"); window.onscroll = function () { if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) { mybutton.style.visibility = "visible"; mybutton.style.opacity = "1"; } else { mybutton.style.visibility = "hidden"; mybutton.style.opacity = "0"; } }; </script> <script> document.getElementById("theme-toggle").addEventListener("click", () => { if (document.body.className.includes("dark")) { document.body.classList.remove('dark'); localStorage.setItem("pref-theme", 'light'); } else { document.body.classList.add('dark'); localStorage.setItem("pref-theme", 'dark'); } }) </script> <script> document.querySelectorAll('pre > code').forEach((codeblock) => { const container = codeblock.parentNode.parentNode; const copybutton = document.createElement('button'); copybutton.classList.add('copy-code'); copybutton.innerHTML = 'copy'; function copyingDone() { copybutton.innerHTML = 'copied!'; setTimeout(() => { copybutton.innerHTML = 'copy'; }, 2000); } copybutton.addEventListener('click', (cb) => { if ('clipboard' in navigator) { navigator.clipboard.writeText(codeblock.textContent); copyingDone(); return; } const range = document.createRange(); range.selectNodeContents(codeblock); const selection = window.getSelection(); selection.removeAllRanges(); selection.addRange(range); try { document.execCommand('copy'); copyingDone(); } catch (e) { }; selection.removeRange(range); }); if (container.classList.contains("highlight")) { container.appendChild(copybutton); } else if (container.parentNode.firstChild == container) { } else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") { codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton); } else { codeblock.parentNode.appendChild(copybutton); } }); </script> </body> </html>