<h1 align="center">
  <br>
  <a href="http://www.biopassid.com"><img src="https://uploads-ssl.webflow.com/5ec3d6d0293839cf102a656a/63a0d4cec83bbddea006d27a_biopassamarelo.svg" alt="BioPass ID" width="200"></a>
  <br>

  <br>
</h1>

<h4 align="center">BioPass ID Face SDK JavaScript.</h4>

<p align="center">
  <a href="#">
      <img src="https://img.shields.io/badge/JavaScript-F7DF1E?logo=javascript&logoColor=black">
  </a>
  <a href="https://www.npmjs.com/package/@biopassid/face-sdk"><img src="https://badge.fury.io/js/@biopassid%2Fface-sdk.svg" alt="npm version" height="18"></a>
  </a>
  <a href="https://www.instagram.com/biopassid/"><img src="https://img.shields.io/badge/Instagram-E4405F?logo=instagram&logoColor=white"></a>
  <a href="https://www.biopassid.com/">
    <img src="https://img.shields.io/badge/BioPass%20ID-C59F64.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAASCAYAAABrXO8xAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFASURBVHgBfVKBVcJQDEx5DFAnoBvYDVo3qBMgG7CBMAEygTKBOgHdgDqBOIHdoN7RC4Yvz7x37zfXXq7JTzYMw8HMcmChcw5s7TduyWdZtg6cTfSxRw+UCXcDNDAootBIAA8hr4mQP+tcXrxLheJWoUgs+jmMMZva/zFHb4uQv7NncF/ssQEqVIl9dcgf9WGMDrjnAx17kXEAFVADd4mwgFvvwpYPIF7sskcW8WF0wcBceC342zsUW6kQi+zdhDFJFZriW+LAQnEp/goRFZxaF8qtBPeEc+3XM7nitlNaSLT0/nEexedpj0UYEnd0Y+MOn52BGfvNRNT6uGVVcLzbVxun6Xd5VM537TRxcxGLcUBb9WvB1U6cdnWvvdz4EotvgijnDM5LosX9lqgIKPWuDM8HLxRX7iP06tFpIDE/xQ/gt+sCdAaM0AAAAABJRU5ErkJggg==">
  </a>
  </a>
  <a href="https://www.biopassid.com/contacts">
    <img src="https://img.shields.io/badge/Contact-us-1abc9c.svg">
  </a>
</p>

<p align="center">
  <a href="#key-features">Key Features</a> •
  <a href="#customizations">Customizations</a> •
  <a href="#demo">Demo</a> •
  <a href="#firststeps">First Steps</a> •
  <a href="#nstalling">Installing</a> •
  <a href="#how-to-use">How To Use</a> •
  <a href="#example">Example</a> •
  <a href="https://www.biopassid.com/contacts">Support</a>
</p>

## Key Features

- Face Detection
  - We ensure that there will be only one face in the capture
- Face Positioning
  - Ensure face position in your capture for better enroll and match.
- Auto Capture
  - When a face is detected the capture will be performed in how many seconds you configure.
- Resolution Control
  - Configure the image size thinking about the tradeoff between image quality and API's response time.
- Aspect Ratio Control
- Fully customizable interface

## Customizations

<p align="center">
  <a href="https://www.biopassid.com/sdk/facesdk">
      <img src="https://uploads-ssl.webflow.com/5ec3d6d0293839cf102a656a/63a0bca342c10af38e3e5bd1_62b9ac85b996b1dcb029dbce_tela-6.png">
  </a>
    <a href="https://www.biopassid.com/sdk/facesdk">
      <img src="https://uploads-ssl.webflow.com/5ec3d6d0293839cf102a656a/63a0bca30c9cb42c9b39652d_62b9ac8549699712ef691028_tela-4.png">
  </a>
      <a href="https://www.biopassid.com/sdk/facesdk">
      <img src="https://uploads-ssl.webflow.com/5ec3d6d0293839cf102a656a/63a0bca353ee8649d6524ba0_62b9ac858e98680c7f5c178f_tela-5.png">
  </a>
</p>

Increase the security of your applications without harming your user experience.

All customization available:

- Title Text
- Help Text
- Loading Text
- Font Family
- Face Frame
- Overlay
- Default Camera
- Capture button

Enable or disable components:

- Tittle text
- Help Text
- Capture button
- Button icons
- Flip Camera button
- Flash button

Change all colors:

- Overlay color and opacity
- Capture button color
- Capture button text color
- Flip Camera color
- Flash Button color
- Text colors

## Demo

Explore our features that make your apps do more.

[Web Demo](https://demo.biopassid.com/sdk) - of BioPass ID Face SDK JavaScript and API'S

<p align="center">
  <a href="https://demo.biopassid.com/sdk">
      <img src="https://uploads-ssl.webflow.com/5ec3d6d0293839cf102a656a/63a0b07c2afd7e6307462d8b_demo.biopassid.com_sdk_1.gif">
  </a>
</p>

## First Steps

First create a folder called models in your application's static files directory. Donwload and add this two files

[tiny_face_detector_model-shard1](https://storage.googleapis.com/facecapturesdk/tiny_face_detector_model-shard1.shard)

[tiny_face_detector_model-weights_manifest](https://storage.googleapis.com/facecapturesdk/tiny_face_detector_model-weights_manifest.json)

Your folder structure will look like this:

```bash
/assets
/js
/css
/models
    - tiny_face_detector_model-shard1
    - tiny_face_detector_model-weights_manifest.json
/index.html
```

## Installing

> Through bundler

Install the dependency:

```bash
npm i --save @biopassid/face-sdk
```

Use in your project:

```bash
import { camera } from '@biopassid/face-sdk'
```

> Through CDN

Add the script to the project and the modules will be injected inside an object called faceSdk:

```bash
<script src="https://cdn.jsdelivr.net/npm/@biopassid/face-sdk/face-sdk.min.js"></script>
<script>
        const {takePicture} = faceSdk.camera();
        async function handleTakePicture() {
            const resp = await takePicture({
                element: document.querySelector("#elementId"),
            })
        }
        handleTakePicture();


</script>
```

## How To Use

> Basic usage

```bash
import { camera } from '@biopassid/face-sdk'
<script>
        const {takePicture} = camera();
        async function handleTakePicture() {
            const resp = await takePicture({
                element: document.querySelector("#elementId"),
            })
        }
        handleTakePicture();
</script>
```

> Adding Face Validation

The takePicture function has an argument called "faceDetectionAdapter", which is a function responsible for performing the validation processing, the FaceSDK has a standard adapter for face detection. It is also necessary to run the function responsible for loading the models

```bash
import { camera, faceDetectionAdapter, loadFaceDetectorModels } from '@biopassid/face-sdk'

const { takePicture } = camera();

async function handleTakePicture() {
    await loadFaceDetectorModels(); // Carregamento dos modelos

    const resp = await takePicture({
        element: document.querySelector("#elementId"),
        faceDetectionAdapter: faceDetectionAdapter,
    })
}
```

> Adding Auto Capture

To add automatic capture, simply activate the functionality within the options parameter.

```bash
import { camera, faceDetectionAdapter, loadFaceDetectorModels } from '@biopassid/face-sdk'

const { takePicture } = camera();

async function handleTakePicture() {
    await loadFaceDetectorModels();

    const resp = await takePicture({
        element: document.querySelector("#elementId"),
        faceDetectionAdapter: faceDetectionAdapter,
        options: {
            faceDetection: {
                autoCapture: true
            }
        },
    })
}
```

> Internationalization

It is possible to define the texts displayed during face detection through parameter i18n.

```bash
import { camera, faceDetectionAdapter } from '@biopassid/face-sdk'

const { takePicture } = camera();

async function handleTakePicture() {
    const resp = await takePicture({
        element: document.querySelector("#elementId"),
        faceDetectionAdapter: faceDetectionAdapter,
        i18n: {
            noFacesDetected: "Nenhuma face detectada",
            multipleFacesDetected: "Multiplas faces detectadas",
            moveFaceLeft: "Mova o rosto para a esquerda",
            moveFaceRight: "Mova o rosto para a direita",
            moveFaceUp: "Mova o rosto para cima",
            moveFaceDown: "Mova o rosto para baixo",
            moveFaceBack: "Mova o rosto para trás",
            moveFaceCloser:: "Mova o rosto para frente"
            keepStill: "Mantenha o rosto parado",
        },
        options: {
            faceDetection: {
                autoCapture: true
            }
        },
    })
}
```

## Example

> Example with all properties

All elements are optional

```js
const resp = await takePicture({
  element: document.querySelector("#camera"),
  options: {
    mask: {
      enabled: true,
      type: "face",
      backgroundColor: "black",
      backgroundOpacity: 0.6,
      frameColor: "white",
      frameThickness: 3,
    },
    backButton: {
      enabled: true,
      size: "30px",
      backgroundColor: "transparent",
      label: {
        enabled: false,
        content: "",
        fontSize: "1rem",
        fontWeight: "normal",
        color: "white",
      },
      icon: {
        enabled: true,
        source: null,
        color: "white",
        size: "30px",
      },
      padding: "0",
    },
    captureButton: {
      enabled: true,
      size: "30px",
      backgroundColor: "white",
      label: {
        enabled: false,
        content: "",
        fontSize: "1rem",
        fontWeight: "normal",
        color: "black",
      },
      icon: {
        enabled: true,
        source: null,
        color: "black",
        size: "30px",
      },
      padding: string,
    },
    cancelButton: {
      enabled: true,
      size: "30px",
      backgroundColor: "red",
      label: {
        enabled: false,
        content: "",
        fontSize: "1rem",
        fontWeight: "normal",
        color: "white",
      },
      icon: {
        enabled: true,
        source: null,
        color: "white",
        size: "30px",
      },
      padding: "0",
    },
    confirmButton: {
      enabled: true,
      size: "30px",
      backgroundColor: "white",
      label: {
        enabled: false,
        content: "",
        fontSize: "1rem",
        fontWeight: "normal",
        color: "black",
      },
      icon: {
        enabled: true,
        source: null,
        color: "black",
        size: "30px",
      },
      padding: string,
    },
    legend: {
      title: {
        enabled: true,
        content: "Captura Facial",
        fontSize: "1.5rem",
        fontWeight: "600",
        color: "white",
      },
      subtitle: {
        enabled: true,
        content: "",
        fontSize: "1rem",
        fontWeight: "normal",
        color: "white",
      },
    },
    faceDetection: {
      enabled: true,
      autoCapture: false,
      timeToCapture: 3000,
      timeToCaptureFeedbackColor: "#FF0000",
      multipleFacesEnabled: true,
      scoreThreshold: 0.1,
    },
    width: "100%",
    height: "100%",
    modelsDirectory: "/models",
    cameraPresets: {
      aspectRatio: 16 / 9,
      preferredResolution: 480,
      deviceId: null,
      facingMode: "environment",
    },
    fontFamily: "inherit",
    formatImage: "image/jpeg",
  },
});
```

### Options

To know more about all SDK options and methods you can visit our complete documentation

[Documentation](https://docs.biopassid.com/#2ea0bce8-d144-4c8b-a44b-de3107ab9db1)

## Changelog

## 1.3.46

### Breaking Changes

- When using the plugin via CDN, the functions are stored in an object named faceSdk.

```html
<!-- After -->
<script src="https://cdn.jsdelivr.net/npm/@biopassid/face-sdk/face-sdk.min.js"></script>
<script>
  const { takePicture } = faceSdk.camera();
</script>

<!-- Before -->
<script src="https://cdn.jsdelivr.net/npm/@biopassid/face-sdk/face-sdk.min.js"></script>
<script>
  const { takePicture } = camera();
</script>
```
