@mjcdev/react-body-highlighter
Version:
[](https://www.npmjs.com/package/react-native-body-highlighter) [](https://www.npmjs.com/package/react-nativ
191 lines (159 loc) • 6.68 kB
Markdown
# @mjcdev/react-body-highlighter
[](https://www.npmjs.com/package/react-native-body-highlighter) [](https://www.npmjs.com/package/react-native-body-highlighter)
> Based on the work of [HichamELBSI](https://github.com/HichamELBSI) and their [react-native-body-highlighter library](https://github.com/HichamELBSI/react-native-body-highlighter), this project ports the SVG human body part highlighting functionality to standard React.
<div style="text-align:center;width:100%;">
<img src="https://github.com/MichaelMjc/react-body-highlighter/blob/main/docs/screenshots/example-female-front.PNG" width="150" alt="body-highlighter" />
<img src="https://github.com/MichaelMjc/react-body-highlighter/blob/main/docs/screenshots/example-female-back.PNG" width="150" alt="body-highlighter" />
<img src="https://github.com/MichaelMjc/react-body-highlighter/blob/main/docs/screenshots/example-male-front.PNG" width="150" alt="body-highlighter" />
<img src="https://github.com/MichaelMjc/react-body-highlighter/blob/main/docs/screenshots/example-male-back.PNG" width="150" alt="body-highlighter" />
</div>
## Installation
npm
```bash
$ npm install @mjcdev/react-body-highlighter
```
yarn
```bash
$ yarn add @mjcdev/react-body-highlighter
```
pnpm
```bash
$ pnpm add @mjcdev/react-body-highlighter
```
## Usage
### Basic example
```jsx
import { useState } from "react";
import Body from "react-body-highlighter";
export default function App() {
return (
<Body
data={[
{ slug: "chest", intensity: 1, side: "left" },
{ slug: "biceps", intensity: 2 },
]}
gender="female"
side="front"
scale={1.7}
border="#dfdfdf"
/>
);
}
```
<details>
<summary style="font-size:18px; font-weight: bold;">Complete example</summary>
<p>
```jsx
import React, { useState } from "react";
import Body, { ExtendedBodyPart } from "react-body-highlighter";
const Switch = (props: React.InputHTMLAttributes<HTMLInputElement>) => {
return (
<label className="switch">
<input type="checkbox" {...props} />
<span className="slider round"></span>
</label>
);
};
export default function App() {
const [selectedBodyPart, setSelectedBodyPart] =
useState <
ExtendedBodyPart >
{
slug: "biceps",
intensity: 2,
side: "right",
};
const [side, setSide] = (useState < "back") | ("front" > "front");
const [gender, setGender] = (useState < "male") | ("female" > "male");
const sideSwitch = () =>
setSide((previousState) => (previousState === "front" ? "back" : "front"));
const toggleGenderSwitch = () => {
setGender((previousState) =>
previousState === "male" ? "female" : "male"
);
};
return (
<Body
data={[
{ slug: "chest", intensity: 1, side: "left" },
{ slug: "biceps", intensity: 1 },
selectedBodyPart,
]}
onBodyPartClick={(e, side) =>
setSelectedBodyPart({ slug: e.slug, intensity: 2, side })
}
gender={gender}
side={side}
scale={1.7}
border="#dfdfdf"
/>
<div>
<div>
<p>Side ({side})</p>
<Switch onChange={(e) => {
if (e.target.checked) {
setSide("back");
} else {
setSide("front");
}
}} />
</div>
<div>
<p>Gender ({gender})</p>
<Switch
onChange={(e) => {
if (e.target.checked) {
setGender("female");
} else {
setGender("male");
}
}}
/>
</div>
</div>
);
}
```
</p>
</details>
## Props
| Prop | Required | Purpose |
| --------------- | -------- | ------------------------------------------------------------------------------------------------------------- |
| data | Yes | `BodyPartObject[]` - Array of `BodyPartObject` to highlight |
| onBodyPartClick | No | `Func` - `(bodyPart: BodyPartObject, side?: left \| right) => {}` Callback called when a user tap a body part |
| colors | No | `string[]` - Defaults to `['#0984e3', '#74b9ff']` |
| side | No | `front \| back` - Defaults to `front` |
| gender | No | `string` - Can be "male" or "female", Defaults to `male` |
| scale | No | `number` - Defaults to `1` |
| border | No | `string` - Defaults to `#dfdfdf` (`none` to hide the border) |
## BodyPart object model
- #### BodyPartObject: `{ slug: BodyPartName, intensity: IntensityNumber, side?: 'left' | 'right', leftSideIntensity?:IntensityNumber, rightSideIntensity?:IntensityNumber }`
- #### BodyPartName: Body part name to highlight (See the list of available body parts below)
- #### IntensityNumber: Color intensity (if the `colors` property is set: from 1 to `colors.length` + 1. If not, intensity can be 1 or 2)
- #### Side (optional): Can be `left`, `right`. Useful for selecting a single part or a pair (Do not set the side if you need to select the pair)
## List of body parts
| BodyParts | Side |
| ------------ | ---------------------------- |
| trapezius | Both |
| triceps | Both |
| forearm | Both |
| adductors | Both |
| calves | Both |
| hair | Both |
| neck | Both |
| deltoids | Both |
| hands | Both |
| feet | Both |
| head | Both (Front only for female) |
| ankles | Both (Front only for female) |
| tibialis | Front |
| obliques | Front |
| chest | Front |
| biceps | Front |
| abs | Front |
| quadriceps | Front |
| knees | Front |
| upper-back | Back |
| lower-back | Back |
| hamstring | Back |
| gluteal | Back |