> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jelou.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Personalización de WebView

> Configura la experiencia personalizando colores, idioma e integrando validaciones legales y de seguridad.

Esta guía detalla qué puedes personalizar en la experiencia **WebView** de biometría, cómo usar la tool **`[Webview] Biometric UI Configuration`**, qué salidas esperar al probar y cómo completar cada parámetro de entrada.

## Elementos personalizables

Puedes adaptar la experiencia a tu marca y reglas de negocio mediante:

* **Colores y modo** (claro u oscuro, con pares de variables para cada tema).
* **Idioma** de los textos y, si aplica, permiso para que el usuario cambie de idioma.
* **Validaciones legales** (enlace a términos y condiciones).
* **Validaciones de seguridad** (umbral de facematch y validación ghost del documento).

<Info>
  Los widgets de captura facial y de documento **no** son modificables.
</Info>

## Configuración en Brain

Define la apariencia y reglas de UI con la tool **`[Webview] Biometric UI Configuration`**.

<Steps>
  <Step title="Crea un workflow dedicado">
    Crea un **nuevo workflow** en Brain para esta tool. **Debes aplicar** los cambios de personalización de la UI del WebView **solo una vez**; puedes mantener este flujo como el lugar único donde ejecutas la actualización de configuración.

    <Frame caption="Crear el workflow">
      <img src="https://mintcdn.com/jelouai/TUSVzC78dOK3FEY7/assets/images/integraciones/identidad/personalizacion-webview/paso-1.png?fit=max&auto=format&n=TUSVzC78dOK3FEY7&q=85&s=dc0074d3467e7da490845ab089268fce" alt="Modal Crear workflow en Jelou Producto para nombrar el workflow dedicado" width="1024" height="462" data-path="assets/images/integraciones/identidad/personalizacion-webview/paso-1.png" />
    </Frame>
  </Step>

  <Step title="Ubica la tool">
    En la **barra lateral** puedes buscar por el nombre de la tool **`[Webview] Biometric UI Configuration`**.

    <Frame caption="Localizar la tool en Marketplace y arrastrarla al canvas">
      <img src="https://mintcdn.com/jelouai/TUSVzC78dOK3FEY7/assets/images/integraciones/identidad/personalizacion-webview/paso-2.png?fit=max&auto=format&n=TUSVzC78dOK3FEY7&q=85&s=056df7226c82c4be56349a5b8933646f" alt="Marketplace con la tool [Webview] Biometric UI Configuration seleccionada y conectada al nodo Inicio" width="1024" height="458" data-path="assets/images/integraciones/identidad/personalizacion-webview/paso-2.png" />
    </Frame>
  </Step>

  <Step title="Conecta, arrastra y configura">
    Conecta la tool, **arrástrala al canvas** del workflow y completa los campos en la **barra lateral derecha** al seleccionar el nodo. Revisa la pestaña **Inputs** (entradas) en la sección **Configuración** más abajo.

    <Frame caption="Configurar versión del tool y configuración de entradas">
      <img src="https://mintcdn.com/jelouai/TUSVzC78dOK3FEY7/assets/images/integraciones/identidad/personalizacion-webview/paso-3.png?fit=max&auto=format&n=TUSVzC78dOK3FEY7&q=85&s=3d56a80cc0e507173b53b5ee57cc50d0" alt="Panel lateral del nodo con selector de versión del tool e instrucción para configurar inputs" width="1024" height="463" data-path="assets/images/integraciones/identidad/personalizacion-webview/paso-3.png" />
    </Frame>
  </Step>

  <Step title="Incluye los mensajes de las salidas (Outputs)">
    En la pestaña **Outputs** (salidas) del nodo, enlaza cada salida de la tool al resto del flujo y define el **mensaje** (o la acción siguiente) que debe ejecutarse en cada caso. La tool expone tres variables de salida:

    * **`success`** — corresponde a **UI actualizada**: la configuración se aplicó correctamente a la UI del WebView.
    * **`noData`** — corresponde a **No se encontraron cambios para actualizar** (por ejemplo, valores iguales a los ya vigentes o una validación que impide guardar).
    * **`error`** — corresponde a **Error en el servicio** (fallo al comunicarse con el servicio que persiste la configuración).

    <Frame caption="Conectar tres salidas a nodos de texto con mensaje">
      <img src="https://mintcdn.com/jelouai/TUSVzC78dOK3FEY7/assets/images/integraciones/identidad/personalizacion-webview/paso-4.png?fit=max&auto=format&n=TUSVzC78dOK3FEY7&q=85&s=7b1d996a86f4ce730ce8e05d0b301166" alt="Canvas con salidas UI actualizada, sin cambios y error en el servicio enlazadas a nodos Texto con mensajes" width="1024" height="461" data-path="assets/images/integraciones/identidad/personalizacion-webview/paso-4.png" />
    </Frame>
  </Step>

  <Step title="Prueba el flujo">
    Usa **Probar** sobre el workflow. Debe devolver **éxito** (salida **UI actualizada**, variable `success`) cuando los cambios se aplicaron correctamente a la experiencia WebView.

    <Frame caption="Probar proyecto y revisar el resultado en el panel">
      <img src="https://mintcdn.com/jelouai/TUSVzC78dOK3FEY7/assets/images/integraciones/identidad/personalizacion-webview/paso-5.png?fit=max&auto=format&n=TUSVzC78dOK3FEY7&q=85&s=aa21adf3fb40716e8bb432420c5ea79a" alt="Panel Probar proyecto con ejecución exitosa y mensaje del nodo de texto en la rama UI actualizada" width="1024" height="464" data-path="assets/images/integraciones/identidad/personalizacion-webview/paso-5.png" />
    </Frame>
  </Step>
</Steps>

## Configuración

<Tabs>
  <Tab title="Inputs">
    <AccordionGroup>
      <Accordion title="Colores UI" icon="palette">
        <ParamField body="Colores UI" type="enum">
          **Nombre de la variable:** Colores UI

          **Variable:** `colors`

          **Descripción:** Activa la **paleta personalizada** (`true` / `false`). Con `true` debes configurar **`Modo`** y los colores HEX del tema correspondiente.

          **Valores disponibles:** `true`, `false`
        </ParamField>
      </Accordion>

      <Accordion title="Modo" icon="moon">
        <ParamField body="Modo" type="enum">
          **Nombre de la variable:** Modo

          **Variable:** `Modo`

          **Descripción:** Tema base **Claro** u **Oscuro**; define qué bloque de colores aplica.

          **Valores disponibles:** `Claro`, `Oscuro`

          **Obligatorio cuando:** `colors` = `true`

          En **modo claro** usa `primaryColor`, `secondaryColor`, `tertiaryColor`, `backgroundColor` y `fontColor`.

          En **modo oscuro** usa `primaryDarkColor`, `secondaryDarkColor`, `tertiaryDarkColor`, `backgroundDarkColor` y `fontDarkColor` (los mismos cinco roles visuales, variante de tema).
        </ParamField>
      </Accordion>

      <Accordion title="Color primario (modo claro)" icon="droplet">
        <ParamField body="Color primario (modo claro)" type="string">
          **Nombre de la variable:** Color primario (modo claro)

          **Variable:** `primaryColor`

          **Descripción:** Color en formato HEX (por ejemplo `#ffffff`). Afecta **progreso** y **estados activos** (pasos completados y actual, borde y estado del checkbox de términos, spinner de validación de documento).

          **Obligatorio cuando:** `Modo` = `Claro`
        </ParamField>
      </Accordion>

      <Accordion title="Color primario (modo oscuro)" icon="droplet">
        <ParamField body="Color primario (modo oscuro)" type="string">
          **Nombre de la variable:** Color primario (modo oscuro)

          **Variable:** `primaryDarkColor`

          **Descripción:** Color en formato HEX (por ejemplo `#ffffff`). Mismo rol visual que `primaryColor` en tema oscuro.

          **Obligatorio cuando:** `Modo` = `Oscuro`
        </ParamField>
      </Accordion>

      <Accordion title="Color secundario (modo claro)" icon="droplet">
        <ParamField body="Color secundario (modo claro)" type="string">
          **Nombre de la variable:** Color secundario (modo claro)

          **Variable:** `secondaryColor`

          **Descripción:** Color en formato HEX (por ejemplo `#ffffff`). Afecta los **botones** principales (Continuar, Reintentar, etc.), los spinners de carga, los estados de éxito, los enlaces de términos y los pasos **pendientes** del progreso.

          **Obligatorio cuando:** `Modo` = `Claro`
        </ParamField>
      </Accordion>

      <Accordion title="Color secundario (modo oscuro)" icon="droplet">
        <ParamField body="Color secundario (modo oscuro)" type="string">
          **Nombre de la variable:** Color secundario (modo oscuro)

          **Variable:** `secondaryDarkColor`

          **Descripción:** Color en formato HEX (por ejemplo `#ffffff`). Mismo rol que `secondaryColor` en tema oscuro.

          **Obligatorio cuando:** `Modo` = `Oscuro`
        </ParamField>
      </Accordion>

      <Accordion title="Color terciario (modo claro)" icon="droplet">
        <ParamField body="Color terciario (modo claro)" type="string">
          **Nombre de la variable:** Color terciario (modo claro)

          **Variable:** `tertiaryColor`

          **Descripción:** Color en formato HEX (por ejemplo `#ffffff`). Procesos **en curso**: spinners durante validaciones e indicadores de paso en ejecución.

          **Obligatorio cuando:** `Modo` = `Claro`
        </ParamField>
      </Accordion>

      <Accordion title="Color terciario (modo oscuro)" icon="droplet">
        <ParamField body="Color terciario (modo oscuro)" type="string">
          **Nombre de la variable:** Color terciario (modo oscuro)

          **Variable:** `tertiaryDarkColor`

          **Descripción:** Color en formato HEX (por ejemplo `#ffffff`). Mismo rol que `tertiaryColor` en tema oscuro.

          **Obligatorio cuando:** `Modo` = `Oscuro`
        </ParamField>
      </Accordion>

      <Accordion title="Color de fondo de pantalla (modo claro)" icon="image">
        <ParamField body="Color de fondo de pantalla (modo claro)" type="string">
          **Nombre de la variable:** Color de fondo de pantalla (modo claro)

          **Variable:** `backgroundColor`

          **Descripción:** Color en formato HEX (por ejemplo `#ffffff`). Fondo general de las pantallas del flujo.

          **Obligatorio cuando:** `Modo` = `Claro`
        </ParamField>
      </Accordion>

      <Accordion title="Color de fondo de pantalla (modo oscuro)" icon="image">
        <ParamField body="Color de fondo de pantalla (modo oscuro)" type="string">
          **Nombre de la variable:** Color de fondo de pantalla (modo oscuro)

          **Variable:** `backgroundDarkColor`

          **Descripción:** Color en formato HEX (por ejemplo `#ffffff`). Fondo en tema oscuro.

          **Obligatorio cuando:** `Modo` = `Oscuro`
        </ParamField>
      </Accordion>

      <Accordion title="Color de fuente (modo claro)" icon="font">
        <ParamField body="Color de fuente (modo claro)" type="string">
          **Nombre de la variable:** Color de fuente (modo claro)

          **Variable:** `fontColor`

          **Descripción:** Color en formato HEX (por ejemplo `#ffffff`). Textos: títulos, instrucciones, mensajes y estados.

          **Obligatorio cuando:** `Modo` = `Claro`
        </ParamField>
      </Accordion>

      <Accordion title="Color de fuente (modo oscuro)" icon="font">
        <ParamField body="Color de fuente (modo oscuro)" type="string">
          **Nombre de la variable:** Color de fuente (modo oscuro)

          **Variable:** `fontDarkColor`

          **Descripción:** Color en formato HEX (por ejemplo `#ffffff`). Textos en tema oscuro.

          **Obligatorio cuando:** `Modo` = `Oscuro`
        </ParamField>
      </Accordion>

      <Accordion title="Enlace términos y condiciones" icon="link">
        <ParamField body="Enlace términos y condiciones" type="string">
          **Nombre de la variable:** Enlace términos y condiciones

          **Variable:** `termsLink`

          **Descripción:** **URL pública** del documento legal. Es **obligatorio** para un proceso biométrico; sin enlace no cumples el mínimo de implementación. El documento debe explicitar **uso**, **almacenamiento** y **tratamiento** de datos personales y biométricos, y mostrarse **antes** de iniciar la verificación.
        </ParamField>
      </Accordion>

      <Accordion title="Facematch: umbral de aprobación" icon="percent">
        <ParamField body="Facematch: umbral de aprobación" type="enum">
          **Nombre de la variable:** Facematch: umbral de aprobación

          **Variable:** `facematchThreshold`

          **Descripción:** Exigencia de la **comparación facial** (porcentaje de coincidencia).

          **Valores disponibles:** `65`, `70`, `75`, `80`, `85`, `90`
        </ParamField>
      </Accordion>

      <Accordion title="Documento: validar imagen ghost" icon="shield">
        <ParamField body="Documento: validar imagen ghost" type="enum">
          **Nombre de la variable:** Documento: validar imagen ghost

          **Variable:** `validateGhostPortrait`

          **Descripción:** Comprueba la **coincidencia entre la foto principal del documento y la miniatura (ghost)**.

          **Valores disponibles:** `true`, `false`

          <Tip>
            Usa `false` si tus usuarios suelen enviar fotos de **baja calidad**; con `true` puede subir la tasa de rechazos.
          </Tip>
        </ParamField>
      </Accordion>

      <Accordion title="Modificar idioma" icon="language">
        <ParamField body="Modificar idioma" type="enum">
          **Nombre de la variable:** Modificar idioma

          **Variable:** `editLanguage`

          **Descripción:** Habilita el bloque de idioma (`defaultLanguage`, `canChangeLanguage`).

          **Valores disponibles:** `true`, `false`
        </ParamField>
      </Accordion>

      <Accordion title="Idioma por defecto" icon="globe">
        <ParamField body="Idioma por defecto" type="enum">
          **Nombre de la variable:** Idioma por defecto

          **Variable:** `defaultLanguage`

          **Descripción:** Idioma inicial de los textos del WebView.

          **Valores disponibles:** `es`, `en`

          **Obligatorio cuando:** `editLanguage` = `true`
        </ParamField>
      </Accordion>

      <Accordion title="Permitir que el usuario elija el idioma" icon="user">
        <ParamField body="Permitir que el usuario elija el idioma" type="enum">
          **Nombre de la variable:** Permitir que el usuario elija el idioma

          **Variable:** `canChangeLanguage`

          **Descripción:** Si es `true`, el usuario puede **cambiar el idioma de la interfaz en cualquier momento** del proceso.

          **Valores disponibles:** `true`, `false`

          **Obligatorio cuando:** `editLanguage` = `true`
        </ParamField>
      </Accordion>
    </AccordionGroup>
  </Tab>

  <Tab title="Outputs">
    ### Éxito

    <AccordionGroup>
      <Accordion title="UI actualizada" icon="circle-check">
        Indica que la configuración enviada se aplicó correctamente a la UI del WebView.

        **Variable:** `success`

        **Descripción:** UI actualizada
      </Accordion>
    </AccordionGroup>

    ### Errores

    <AccordionGroup>
      <Accordion title="Sin cambios" icon="ban">
        La ejecución no produjo una actualización efectiva de la UI (por ejemplo, valores iguales a los ya vigentes o validación que impide guardar).

        **Variable:** `noData`

        **Descripción:** No se encontraron cambios para actualizar
      </Accordion>

      <Accordion title="Error en el servicio" icon="triangle-exclamation">
        Falló la operación al comunicarse con el servicio que persiste la configuración.

        **Variable:** `error`

        **Descripción:** Error en el servicio
      </Accordion>
    </AccordionGroup>
  </Tab>
</Tabs>

## Alcance del WebView de biometría

El WebView de biometría está compuesto por **12 pantallas** que guían al usuario a lo largo del proceso de **validación de identidad**.

## Elementos no modificables

Para garantizar la calidad de la verificación, no son modificables:

* Widgets de captura facial.
* Widgets de captura de documentos.

## Revisión antes de publicar

Checklist recomendado:

* Workflow dedicado a la tool con una ejecución de prueba exitosa (**UI actualizada**, `success`).
* **`colors`**, **`Modo`** y pares de color coherentes (claro y/o oscuro según corresponda).
* **`termsLink`** público y funcional.
* **`facematchThreshold`** alineado a tu política de riesgo.
* **`validateGhostPortrait`** acorde a la calidad típica de las fotos de documento.
* **`editLanguage`**, **`defaultLanguage`** y **`canChangeLanguage`** revisados.
* Widgets de captura visibles y sin alteraciones no soportadas.
* Pruebas end-to-end completadas en WhatsApp.
