# react-native-body-highlighter

> [![npm](https://img.shields.io/npm/v/react-native-body-highlighter.svg)](https://www.npmjs.com/package/react-native-body-highlighter) [![Downloads](https://img.shields.io/npm/dt/react-native-body-highlighter.svg)](https://www.npmjs.com/package/react-nativ

Latest version **3.2.0** (published 2026-04-13) · MIT license · 0 weekly downloads

## Install

```sh
npm install react-native-body-highlighter
pnpm add react-native-body-highlighter
yarn add react-native-body-highlighter
bun add react-native-body-highlighter
```

## Health

**Score 55/100 (C)** — status: stable.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

## Facts

| | |
|---|---|
| Version | 3.2.0 |
| Published | 2026-04-13 |
| First published | 2019-01-27 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 1 |
| Unpacked size | 168.9 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | HichamELBSI |
| Maintainers | hichamelbsi |
| Keywords | react-native, react, muscle, muscles, body, highlighter, highlight, color, svg |

## Links

- npm: https://www.npmjs.com/package/react-native-body-highlighter
- npm.io page: https://npm.io/package/react-native-body-highlighter

## Dependencies (1)

- [react-native-svg](https://npm.io/package/react-native-svg.md) ^15.9.0

## Alternatives

- [mobx-react](https://npm.io/package/mobx-react.md) — 2.8M weekly downloads
- [rc-tree](https://npm.io/package/rc-tree.md) — 2.6M weekly downloads
- [@react-oauth/google](https://npm.io/package/@react-oauth/google.md) — 1.3M weekly downloads
- [@wagmi/connectors](https://npm.io/package/@wagmi/connectors.md) — 877.0K weekly downloads
- [vee-validate](https://npm.io/package/vee-validate.md) — 836.4K weekly downloads

## Recent versions

- 3.2.0 (latest) — 2026-04-13
- 3.1.4 — 2026-02-26
- 3.1.3 — 2024-11-14
- 3.1.2 — 2024-11-14
- 3.1.1 — 2024-11-14
- 3.1.0 — 2024-10-25
- 3.0.1 — 2024-09-28
- 3.0.0 — 2024-09-28
- 3.0.0-beta.7 — 2024-08-22
- 3.0.0-beta.6 — 2023-12-07
- 3.0.0-beta.5 — 2023-12-07
- 3.0.0-beta.4 — 2023-10-30
- 3.0.0-beta.3 — 2023-08-20
- 3.0.0-beta.2 — 2023-08-20
- 3.0.0-beta.1 — 2023-08-20
- … 18 more at https://npm.io/package/react-native-body-highlighter/versions

## README

# react-native-body-highlighter

[![npm](https://img.shields.io/npm/v/react-native-body-highlighter.svg)](https://www.npmjs.com/package/react-native-body-highlighter) [![Downloads](https://img.shields.io/npm/dt/react-native-body-highlighter.svg)](https://www.npmjs.com/package/react-native-body-highlighter)

> SVG human body parts highlighter for react-native (Expo compatible).

<div style="text-align:center;width:100%;">
  <img src="./docs/screenshots/example-female-front.PNG" width="150" alt="body-highlighter" />
  <img src="./docs/screenshots/example-female-back.PNG" width="150" alt="body-highlighter" />
  <img src="./docs/screenshots/example-male-front.PNG" width="150" alt="body-highlighter" />
  <img src="./docs/screenshots/example-male-back.PNG" width="150" alt="body-highlighter" />
</div>

## Installation

npm

```bash
$ npm install react-native-body-highlighter
```

yarn

```bash
$ yarn add react-native-body-highlighter
```

## Usage

### Basic example

```jsx
import { useState } from "react";
import Body from "react-native-body-highlighter";

export default function App() {
  return (
    <View style={styles.container}>
      <Body
        data={[
          { slug: "chest", intensity: 1, side: "left" },
          { slug: "biceps", intensity: 2 },
        ]}
        gender="female"
        side="front"
        scale={1.7}
        border="#dfdfdf"
      />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#fff",
    alignItems: "center",
    justifyContent: "center",
  },
});
```

<details>
<summary style="font-size:18px; font-weight: bold;">Complete example</summary>
<p>

```jsx
import { StyleSheet, Switch, Text, View } from "react-native";
import { useState } from "react";
import Body, { ExtendedBodyPart } from "react-native-body-highlighter";

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 (
    <View style={styles.container}>
      <Body
        data={[
          { slug: "chest", intensity: 1, side: "left" },
          { slug: "biceps", intensity: 1 },
          selectedBodyPart,
        ]}
        onBodyPartPress={(e, side) =>
          setSelectedBodyPart({ slug: e.slug, intensity: 2, side })
        }
        gender={gender}
        side={side}
        scale={1.7}
        border="#dfdfdf"
      />
      <View style={styles.switchContainer}>
        <View style={styles.switch}>
          <Text>Side ({side})</Text>
          <Switch onValueChange={sideSwitch} value={side === "front"} />
        </View>
        <View style={styles.switch}>
          <Text>Gender ({gender})</Text>
          <Switch
            onValueChange={toggleGenderSwitch}
            value={gender === "male"}
          />
        </View>
      </View>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#fff",
    alignItems: "center",
    justifyContent: "center",
  },
  switchContainer: {
    flexDirection: "row",
    gap: 30,
  },
  switch: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center",
  },
});
```

</p>
</details>

## Props

| Prop                | Required | Purpose                                                                                                       |
| ------------------- | -------- | ------------------------------------------------------------------------------------------------------------- |
| data                | Yes      | `BodyPartObject[]` - Array of `BodyPartObject` to highlight                                                   |
| onBodyPartPress     | 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)                                                  |
| disabledParts       | No       | `Slug[]` - Contains array of Slugs to be disabled                                                  |
| hiddenParts         | No       | `Slug[]` - Contains array of Slugs to be hidden (not rendered)                                                  |
| defaultFill         | No       | `string` - Default fill color for body parts. Defaults to `#3f3f3f`                                           |
| defaultStroke       | No       | `string` - Default stroke color for body parts. Defaults to `none`                                            |
| defaultStrokeWidth  | No       | `number` - Default stroke width for body parts. Defaults to `0`                                               |

## BodyPart object model

### Accessibility

Each `<Body />` component and its SVG wrappers (`SvgMaleWrapper`, `SvgFemaleWrapper`) are now accessible to screen readers.

- Default accessibility labels are automatically provided for gender and side (e.g., `"male-body-front"`, `"female-body-back"`).
- This improves overall screen reader compatibility by making the visual body component identifiable.
- Adding accessibility per individual body part would require a deeper refactor of how SVG paths are structured.

- #### BodyPartObject: `{ slug: BodyPartName, color?: colorHexValue, intensity?: IntensityNumber, side?: 'left' | 'right', styles?: BodyPartStyles }`

- #### BodyPartName: Body part name to highlight (See the list of available body parts below)

- #### colorHexValue: The Color of specific body part. Accepts HEX string. E.g `#ff0000ff`

- #### 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)

- #### BodyPartStyles (optional): Custom styling object for individual body parts
  - `fill?: string` - Custom fill color for this specific body part (overrides color and intensity)
  - `stroke?: string` - Custom stroke color for this specific body part
  - `strokeWidth?: number` - Custom stroke width for this specific body part

### Styling Priority
The fill color for each body part is determined in the following priority order (highest to lowest):
1. `styles.fill` - Per-part custom fill style
2. `color` - Per-part color property
3. `intensity` - Color from the `colors` array based on intensity value
4. `defaultFill` - Global default fill color

## 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                        |
| abductors    | Back                         |
| upper-back   | Back                         |
| lower-back   | Back                         |
| hamstring    | Back                         |
| gluteal      | Back                         |

---
_Source: https://npm.io/package/react-native-body-highlighter · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
