Skip to main content
react-md

HighlightText

The HighlightText component can be used to highlight text matching a provided query ignoring case.

Simple Example

The HighlightText requires a query prop and text children to be provided. The default highlight is provided by the Mark component.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In eget metus ut mi mattis dapibus. Praesent interdum sapien ut posuere convallis. Donec et tristique ex. Aliquam erat volutpat. Donec sit amet dui egestas, tempus quam id, hendrerit risus. Nullam tincidunt quam ut dui aliquet ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed rhoncus, purus vitae tincidunt placerat, quam diam lobortis magna, et aliquam ante diam id nunc. Cras blandit leo eu nisi elementum, nec gravida ligula pharetra. Etiam molestie luctus orci, vel hendrerit lacus eleifend ut. Nullam placerat dolor ac mi congue, non auctor metus consectetur. Ut pretium mollis vulputate.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In eget metus ut mi mattis dapibus. Praesent interdum sapien ut posuere convallis. Donec et tristique ex. Aliquam erat volutpat. Donec sit amet dui egestas, tempus quam id, hendrerit risus. Nullam tincidunt quam ut dui aliquet ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed rhoncus, purus vitae tincidunt placerat, quam diam lobortis magna, et aliquam ante diam id nunc. Cras blandit leo eu nisi elementum, nec gravida ligula pharetra. Etiam molestie luctus orci, vel hendrerit lacus eleifend ut. Nullam placerat dolor ac mi congue, non auctor metus consectetur. Ut pretium mollis vulputate.

import { HighlightText } from "@react-md/core/typography/HighlightText";
import { Typography } from "@react-md/core/typography/Typography";
import { type ReactElement } from "react";

export default function SimpleExample(): ReactElement {
  return (
    <>
      <Typography>
        <HighlightText query="lorem ipsum">
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. In eget metus
          ut mi mattis dapibus. Praesent interdum sapien ut posuere convallis.
          Donec et tristique ex. Aliquam erat volutpat. Donec sit amet dui
          egestas, tempus quam id, hendrerit risus. Nullam tincidunt quam ut dui
          aliquet ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing
          elit. Sed rhoncus, purus vitae tincidunt placerat, quam diam lobortis
          magna, et aliquam ante diam id nunc. Cras blandit leo eu nisi
          elementum, nec gravida ligula pharetra. Etiam molestie luctus orci,
          vel hendrerit lacus eleifend ut. Nullam placerat dolor ac mi congue,
          non auctor metus consectetur. Ut pretium mollis vulputate.
        </HighlightText>
      </Typography>
      <Typography>
        <HighlightText query="it">
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. In eget metus
          ut mi mattis dapibus. Praesent interdum sapien ut posuere convallis.
          Donec et tristique ex. Aliquam erat volutpat. Donec sit amet dui
          egestas, tempus quam id, hendrerit risus. Nullam tincidunt quam ut dui
          aliquet ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing
          elit. Sed rhoncus, purus vitae tincidunt placerat, quam diam lobortis
          magna, et aliquam ante diam id nunc. Cras blandit leo eu nisi
          elementum, nec gravida ligula pharetra. Etiam molestie luctus orci,
          vel hendrerit lacus eleifend ut. Nullam placerat dolor ac mi congue,
          non auctor metus consectetur. Ut pretium mollis vulputate.
        </HighlightText>
      </Typography>
    </>
  );
}

Press Enter to start editing.

First Match Only

If only the first match should be highlighted, enable the firstMatchOnly prop.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In eget metus ut mi mattis dapibus. Praesent interdum sapien ut posuere convallis. Donec et tristique ex. Aliquam erat volutpat. Donec sit amet dui egestas, tempus quam id, hendrerit risus. Nullam tincidunt quam ut dui aliquet ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed rhoncus, purus vitae tincidunt placerat, quam diam lobortis magna, et aliquam ante diam id nunc. Cras blandit leo eu nisi elementum, nec gravida ligula pharetra. Etiam molestie luctus orci, vel hendrerit lacus eleifend ut. Nullam placerat dolor ac mi congue, non auctor metus consectetur. Ut pretium mollis vulputate.

import { HighlightText } from "@react-md/core/typography/HighlightText";
import { Typography } from "@react-md/core/typography/Typography";
import { type ReactElement } from "react";

export default function FirstMatchOnlyExample(): ReactElement {
  return (
    <Typography>
      <HighlightText query="it" firstMatchOnly>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. In eget metus
        ut mi mattis dapibus. Praesent interdum sapien ut posuere convallis.
        Donec et tristique ex. Aliquam erat volutpat. Donec sit amet dui
        egestas, tempus quam id, hendrerit risus. Nullam tincidunt quam ut dui
        aliquet ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing
        elit. Sed rhoncus, purus vitae tincidunt placerat, quam diam lobortis
        magna, et aliquam ante diam id nunc. Cras blandit leo eu nisi elementum,
        nec gravida ligula pharetra. Etiam molestie luctus orci, vel hendrerit
        lacus eleifend ut. Nullam placerat dolor ac mi congue, non auctor metus
        consectetur. Ut pretium mollis vulputate.
      </HighlightText>
    </Typography>
  );
}

Press Enter to start editing.

Customizing Styles

The highlight styles can be configured by providing a custom highlight component. It is provided the following props:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In eget metus ut mi mattis dapibus. Praesent interdum sapien ut posuere convallis. Donec et tristique ex. Aliquam erat volutpat. Donec sit amet dui egestas, tempus quam id, hendrerit risus. Nullam tincidunt quam ut dui aliquet ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed rhoncus, purus vitae tincidunt placerat, quam diam lobortis magna, et aliquam ante diam id nunc. Cras blandit leo eu nisi elementum, nec gravida ligula pharetra. Etiam molestie luctus orci, vel hendrerit lacus eleifend ut. Nullam placerat dolor ac mi congue, non auctor metus consectetur. Ut pretium mollis vulputate.

/* eslint-disable @typescript-eslint/no-unused-vars */
import {
  HighlightText,
  type HighlightTextComponentProps,
} from "@react-md/core/typography/HighlightText";
import { HighlightTextMark } from "@react-md/core/typography/HighlightTextMark";
import { Typography } from "@react-md/core/typography/Typography";
import { type ReactElement } from "react";

export default function CustomizingStylesExample(): ReactElement {
  return (
    <Typography>
      <HighlightText query="lit" highlight={Highlight}>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. In eget metus
        ut mi mattis dapibus. Praesent interdum sapien ut posuere convallis.
        Donec et tristique ex. Aliquam erat volutpat. Donec sit amet dui
        egestas, tempus quam id, hendrerit risus. Nullam tincidunt quam ut dui
        aliquet ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing
        elit. Sed rhoncus, purus vitae tincidunt placerat, quam diam lobortis
        magna, et aliquam ante diam id nunc. Cras blandit leo eu nisi elementum,
        nec gravida ligula pharetra. Etiam molestie luctus orci, vel hendrerit
        lacus eleifend ut. Nullam placerat dolor ac mi congue, non auctor metus
        consectetur. Ut pretium mollis vulputate.
      </HighlightText>
    </Typography>
  );
}

const USE_DEFAULT = false;

function Highlight(props: HighlightTextComponentProps): ReactElement {
  const { match, children } = props;
  if (USE_DEFAULT) {
    // this is the default implementation if you want to use it which is about
    // the same as:
    // ```tsx
    // import { Mark } from "@react-md/core/typography/Mark";
    //
    // return <Mark>{children}</Mark>
    // ```
    return <HighlightTextMark {...props} />;
  }

  // if you need to do some extra styling based on where the match occurs
  const { index, lastIndex, query, rawQuery, rawText } = match;

  // just use the default browser mark styles to see some highlights
  return <mark>{children}</mark>;
}

Press Enter to start editing.