Search
Example
My Books
A Song of Ice and Fire

The Name of the Wind

The Way of Kings

The Lies of Locke Lamora

Dune

Neuromancer

Foundation

Ender's Game

The Girl with the Dragon Tattoo

Gone Girl

Harry Potter

Options
Animation Enabled
Sample Code
import { useState } from "react";
import { MagicMotion } from "react-magic-motion";
const books = [
{
id: 1,
title: "A Song of Ice and Fire",
imgSrc:
"https://react-magic-motion.nyc3.cdn.digitaloceanspaces.com/examples/search/song-of-ice-and-fire.jpeg",
},
{
id: 2,
title: "The Name of the Wind",
imgSrc:
"https://react-magic-motion.nyc3.cdn.digitaloceanspaces.com/examples/search/the-name-of-the-wind.jpeg",
},
{
id: 3,
title: "The Way of Kings",
imgSrc:
"https://react-magic-motion.nyc3.cdn.digitaloceanspaces.com/examples/search/the-way-of-kings.png",
},
{
id: 4,
title: "The Lies of Locke Lamora",
imgSrc:
"https://react-magic-motion.nyc3.cdn.digitaloceanspaces.com/examples/search/the-lies-of-locke-lamora.webp",
},
{
id: 5,
title: "Dune",
imgSrc:
"https://react-magic-motion.nyc3.cdn.digitaloceanspaces.com/examples/search/dune.jpeg",
},
{
id: 6,
title: "Neuromancer",
imgSrc:
"https://react-magic-motion.nyc3.cdn.digitaloceanspaces.com/examples/search/neuromancer.jpeg",
},
{
id: 7,
title: "Foundation",
imgSrc:
"https://react-magic-motion.nyc3.cdn.digitaloceanspaces.com/examples/search/foundation.jpeg",
},
{
id: 8,
title: "Ender's Game",
imgSrc:
"https://react-magic-motion.nyc3.cdn.digitaloceanspaces.com/examples/search/enders-game.jpg",
},
{
id: 9,
title: "The Girl with the Dragon Tattoo",
imgSrc:
"https://react-magic-motion.nyc3.cdn.digitaloceanspaces.com/examples/search/the-girl-with-the-dragon-tattoo.jpeg",
},
{
id: 10,
title: "Gone Girl",
imgSrc:
"https://react-magic-motion.nyc3.cdn.digitaloceanspaces.com/examples/search/gone-girl.jpeg",
},
{
id: 11,
title: "Harry Potter",
imgSrc:
"https://react-magic-motion.nyc3.cdn.digitaloceanspaces.com/examples/search/harry-potter.jpeg",
},
];
function Book({ title, imgSrc }: { title: string; imgSrc: string }) {
return (
<div
style={{
width: "10rem",
padding: "0.5rem",
display: "flex",
flexDirection: "column",
gap: "1rem",
backgroundColor: "rgba(238, 238, 238)",
}}
>
<h5
style={{
textAlign: "center",
fontWeight: "bold",
fontSize: "1.1em",
}}
>
{title}
</h5>
<img
alt={`image of ${title}`}
src={imgSrc}
style={{ width: "auto", height: "8rem", margin: "auto" }}
/>
</div>
);
}
export default function Search() {
const [searchText, setSearchText] = useState("");
return (
<div
style={{
margin: "1rem 0",
display: "flex",
flexDirection: "column",
gap: "0.5rem",
}}
>
<label
htmlFor="searchInput"
style={{ fontWeight: "bold", fontSize: "1.1em" }}
>
Search Books
</label>
<input
id="searchInput"
placeholder="Harry Potter"
type="text"
maxLength={70}
value={searchText}
onChange={(e) => setSearchText(e.target.value)}
style={{
backgroundColor: "rgba(238, 238, 238)",
lineHeight: 1.25,
width: "15rem",
padding: "0.5rem 0.75rem",
borderRadius: "0.5rem",
display: "block",
fontSize: "0.875rem",
}}
/>
<h4 style={{ fontWeight: "bold", fontSize: "1.1em", marginTop: "1rem" }}>
My Books
</h4>
<MagicMotion>
<div
style={{
display: "flex",
flexWrap: "wrap",
gap: "0.65em",
}}
>
{books
.filter(({ title }) =>
title
.toLowerCase()
.trim()
.includes(searchText.toLowerCase().trim())
)
.map(({ id, title, imgSrc }) => (
<Book key={id} title={title} imgSrc={imgSrc} />
))}
</div>
</MagicMotion>
</div>
);
}