react-wrap-text
Version:
A simple utility to wrap matching substrings in React with custom jsx components
88 lines (63 loc) • 2.33 kB
Markdown
A tiny utility for highlighting or replacing specific text matches inside strings with custom React components.
Perfect for inline highlighting, smart mentions, tokenized UI, or simple templating in JSX.
```
npm install react-wrap-text
```
Use `wrapMatchesInText` if you want to highlight specific parts of the text.
```ts
import { wrapMatchesInText } from 'react-wrap-matches';
// Define an optional wrapper component
const Highlight = ({ children }: { children: React.ReactNode }) => (
<mark>{children}</mark>
);
const text = "Hit or miss, I guess they never miss, huh?";
const result = wrapMatchesInText(text, "miss", (match, i) => (
<Highlight key={i}>{match}</Highlight>
));
// Output:
// Hit or <mark>miss</mark>, I guess they never <mark>miss</mark>, huh?
return <p>{result}</p>;
```
Use `wrapMatchesInText` if you want to replace matching parts of the text with a JSX component.
```ts
import { wrapMatchesInText } from 'react-wrap-matches';
const text = "You've scored 100 points!";
const result = wrapMatchesInText(text, "100", (_, i) => (
// This also works with inline jsx
<strong key={i}>💯</strong>
));
// Output
// You've scored <strong>💯</strong> points!
return <p>{result}</p>;
```
Use `wrapMultipleMatchesInText` if you need to highlight/replace multiple substrings.
```ts
import { wrapMultipleMatchesInText } from 'react-wrap-matches';
const Highlight = ({ children }: { children: React.ReactNode }) => (
<mark>{children}</mark>
);
const HighlightOrange = ({ children }: { children: React.ReactNode }) => (
<mark style={{ backgroundColor: "oklch(75% 0.183 55.934)" }}>{children}</mark>
);
const text = "This is a test. This test works.";
const multiPayload: Parameters<typeof wrapMultipleMatchesInText>[1] = [
{
target: "This",
render: (match, i) => <Highlight key={i}>{match}</Highlight>,
},
{
target: "works",
render: (match, i) => <HighlightOrange key={i}>{match}</HighlightOrange>,
}
];
const result = wrapMultipleMatchesInText(text, multiPayload);
// Output
// <mark>This</mark> is a test. <mark>This</mark> test <mark style="background-color: oklch(0.75 0.183 55.934);">works</mark>.
return <p>{result}</p>;
```