@jaak.ai/stamps 1.0.0-dev.9 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +470 -390
  3. package/dist/cjs/index-DGM9-FNg.js +1402 -0
  4. package/dist/cjs/index-DGM9-FNg.js.map +1 -0
  5. package/dist/cjs/index.cjs.js +3 -0
  6. package/dist/cjs/index.cjs.js.map +1 -0
  7. package/dist/cjs/jaak-stamps-webcomponent.cjs.js +27 -0
  8. package/dist/cjs/jaak-stamps-webcomponent.cjs.js.map +1 -0
  9. package/dist/cjs/jaak-stamps.cjs.entry.js +925 -0
  10. package/dist/cjs/jaak-stamps.cjs.entry.js.map +1 -0
  11. package/dist/cjs/jaak-stamps.entry.cjs.js.map +1 -0
  12. package/dist/cjs/loader.cjs.js +8 -15
  13. package/dist/cjs/loader.cjs.js.map +1 -0
  14. package/dist/collection/collection-manifest.json +3 -22
  15. package/dist/collection/components/my-component/my-component.css +530 -0
  16. package/dist/collection/components/my-component/my-component.js +1162 -0
  17. package/dist/collection/components/my-component/my-component.js.map +1 -0
  18. package/dist/collection/index.js +2 -1
  19. package/dist/collection/index.js.map +1 -0
  20. package/dist/collection/utils/utils.js +4 -0
  21. package/dist/collection/utils/utils.js.map +1 -0
  22. package/dist/components/index.d.ts +33 -0
  23. package/dist/components/index.js +1195 -0
  24. package/dist/components/index.js.map +1 -0
  25. package/dist/components/jaak-stamps.d.ts +11 -0
  26. package/dist/components/jaak-stamps.js +971 -0
  27. package/dist/components/jaak-stamps.js.map +1 -0
  28. package/dist/esm/index-DqoVMnc7.js +1393 -0
  29. package/dist/esm/index-DqoVMnc7.js.map +1 -0
  30. package/dist/esm/index.js +3 -0
  31. package/dist/esm/index.js.map +1 -0
  32. package/dist/esm/jaak-stamps-webcomponent.js +23 -0
  33. package/dist/esm/jaak-stamps-webcomponent.js.map +1 -0
  34. package/dist/esm/jaak-stamps.entry.js +923 -0
  35. package/dist/esm/jaak-stamps.entry.js.map +1 -0
  36. package/dist/esm/loader.js +9 -14
  37. package/dist/esm/loader.js.map +1 -0
  38. package/dist/jaak-stamps-webcomponent/index.esm.js +2 -0
  39. package/dist/jaak-stamps-webcomponent/index.esm.js.map +1 -0
  40. package/dist/jaak-stamps-webcomponent/jaak-stamps-webcomponent.esm.js +2 -0
  41. package/dist/jaak-stamps-webcomponent/jaak-stamps-webcomponent.esm.js.map +1 -0
  42. package/dist/jaak-stamps-webcomponent/jaak-stamps.entry.esm.js.map +1 -0
  43. package/dist/jaak-stamps-webcomponent/loader.esm.js.map +1 -0
  44. package/dist/jaak-stamps-webcomponent/p-DqoVMnc7.js +3 -0
  45. package/dist/jaak-stamps-webcomponent/p-DqoVMnc7.js.map +1 -0
  46. package/dist/jaak-stamps-webcomponent/p-dd6cc14e.entry.js +2 -0
  47. package/dist/jaak-stamps-webcomponent/p-dd6cc14e.entry.js.map +1 -0
  48. package/dist/types/components/my-component/my-component.d.ts +119 -0
  49. package/dist/types/components.d.ts +50 -1353
  50. package/dist/types/index.d.ts +10 -1
  51. package/dist/types/stencil-public-runtime.d.ts +93 -28
  52. package/dist/types/utils/utils.d.ts +1 -0
  53. package/loader/cdn.js +1 -3
  54. package/loader/index.cjs.js +1 -3
  55. package/loader/index.d.ts +5 -2
  56. package/loader/index.es2017.js +1 -3
  57. package/loader/index.js +1 -3
  58. package/package.json +22 -26
  59. package/dist/cjs/document-detector_19.cjs.entry.js +0 -8540
  60. package/dist/cjs/index-5e4e5e7d.js +0 -1685
  61. package/dist/cjs/mb-tooltip.cjs.entry.js +0 -26
  62. package/dist/cjs/stamps.cjs.js +0 -23
  63. package/dist/collection/components/document-detector/document-detector.css +0 -156
  64. package/dist/collection/components/document-detector/document-detector.js +0 -416
  65. package/dist/collection/components/shared/mb-api-process-status/mb-api-process-status.css +0 -360
  66. package/dist/collection/components/shared/mb-api-process-status/mb-api-process-status.js +0 -124
  67. package/dist/collection/components/shared/mb-button/mb-button.css +0 -95
  68. package/dist/collection/components/shared/mb-button/mb-button.js +0 -201
  69. package/dist/collection/components/shared/mb-button-classic/mb-button-classic.css +0 -100
  70. package/dist/collection/components/shared/mb-button-classic/mb-button-classic.js +0 -130
  71. package/dist/collection/components/shared/mb-camera-experience/mb-camera-experience.css +0 -740
  72. package/dist/collection/components/shared/mb-camera-experience/mb-camera-experience.js +0 -827
  73. package/dist/collection/components/shared/mb-camera-experience/mb-camera-experience.utils.js +0 -55
  74. package/dist/collection/components/shared/mb-camera-selection/mb-camera-selection.css +0 -124
  75. package/dist/collection/components/shared/mb-camera-selection/mb-camera-selection.js +0 -194
  76. package/dist/collection/components/shared/mb-camera-toolbar/mb-camera-toolbar.css +0 -80
  77. package/dist/collection/components/shared/mb-camera-toolbar/mb-camera-toolbar.js +0 -275
  78. package/dist/collection/components/shared/mb-completed/mb-completed.css +0 -17
  79. package/dist/collection/components/shared/mb-completed/mb-completed.js +0 -48
  80. package/dist/collection/components/shared/mb-component/mb-component.css +0 -321
  81. package/dist/collection/components/shared/mb-component/mb-component.js +0 -2269
  82. package/dist/collection/components/shared/mb-component/mb-component.utils.js +0 -14
  83. package/dist/collection/components/shared/mb-container/mb-container.css +0 -7
  84. package/dist/collection/components/shared/mb-container/mb-container.js +0 -23
  85. package/dist/collection/components/shared/mb-feedback/mb-feedback.css +0 -36
  86. package/dist/collection/components/shared/mb-feedback/mb-feedback.js +0 -91
  87. package/dist/collection/components/shared/mb-feedback/mb-feedback.utils.js +0 -11
  88. package/dist/collection/components/shared/mb-help/mb-help.css +0 -191
  89. package/dist/collection/components/shared/mb-help/mb-help.js +0 -409
  90. package/dist/collection/components/shared/mb-help/mb-help.model.js +0 -5
  91. package/dist/collection/components/shared/mb-image-box/mb-image-box.css +0 -78
  92. package/dist/collection/components/shared/mb-image-box/mb-image-box.js +0 -150
  93. package/dist/collection/components/shared/mb-modal/mb-modal.css +0 -106
  94. package/dist/collection/components/shared/mb-modal/mb-modal.js +0 -239
  95. package/dist/collection/components/shared/mb-overlay/mb-overlay.css +0 -46
  96. package/dist/collection/components/shared/mb-overlay/mb-overlay.js +0 -76
  97. package/dist/collection/components/shared/mb-progress-tracker/mb-progress-tracker.css +0 -24
  98. package/dist/collection/components/shared/mb-progress-tracker/mb-progress-tracker.js +0 -80
  99. package/dist/collection/components/shared/mb-screen/mb-screen.css +0 -19
  100. package/dist/collection/components/shared/mb-screen/mb-screen.js +0 -48
  101. package/dist/collection/components/shared/mb-spinner/mb-spinner.css +0 -30
  102. package/dist/collection/components/shared/mb-spinner/mb-spinner.js +0 -67
  103. package/dist/collection/components/shared/mb-tooltip/mb-tooltip.css +0 -62
  104. package/dist/collection/components/shared/mb-tooltip/mb-tooltip.js +0 -150
  105. package/dist/collection/components/shared/mb-tooltip-advanced/mb-tooltip-advanced.css +0 -91
  106. package/dist/collection/components/shared/mb-tooltip-advanced/mb-tooltip-advanced.js +0 -96
  107. package/dist/collection/utils/data-structures.js +0 -189
  108. package/dist/collection/utils/device.helpers.js +0 -37
  109. package/dist/collection/utils/error-structures.js +0 -47
  110. package/dist/collection/utils/generic.helpers.js +0 -82
  111. package/dist/collection/utils/sdk.service.js +0 -943
  112. package/dist/collection/utils/state-lifter.js +0 -3
  113. package/dist/collection/utils/status.document-detector.js +0 -15
  114. package/dist/collection/utils/translation.service.js +0 -97
  115. package/dist/esm/document-detector_19.entry.js +0 -8518
  116. package/dist/esm/index-dc740acb.js +0 -1656
  117. package/dist/esm/mb-tooltip.entry.js +0 -22
  118. package/dist/esm/polyfills/core-js.js +0 -11
  119. package/dist/esm/polyfills/css-shim.js +0 -1
  120. package/dist/esm/polyfills/dom.js +0 -79
  121. package/dist/esm/polyfills/es5-html-element.js +0 -1
  122. package/dist/esm/polyfills/index.js +0 -34
  123. package/dist/esm/polyfills/system.js +0 -6
  124. package/dist/esm/stamps.js +0 -18
  125. package/dist/stamps/index.esm.js +0 -0
  126. package/dist/stamps/p-7f07a434.js +0 -2
  127. package/dist/stamps/p-ec3f5972.entry.js +0 -1
  128. package/dist/stamps/p-f4015454.entry.js +0 -9
  129. package/dist/stamps/stamps.esm.js +0 -1
  130. package/dist/types/components/document-detector/document-detector.d.ts +0 -86
  131. package/dist/types/components/shared/mb-api-process-status/mb-api-process-status.d.ts +0 -30
  132. package/dist/types/components/shared/mb-button/mb-button.d.ts +0 -41
  133. package/dist/types/components/shared/mb-button-classic/mb-button-classic.d.ts +0 -27
  134. package/dist/types/components/shared/mb-camera-experience/mb-camera-experience.d.ts +0 -141
  135. package/dist/types/components/shared/mb-camera-experience/mb-camera-experience.utils.d.ts +0 -3
  136. package/dist/types/components/shared/mb-camera-selection/mb-camera-selection.d.ts +0 -33
  137. package/dist/types/components/shared/mb-camera-toolbar/mb-camera-toolbar.d.ts +0 -54
  138. package/dist/types/components/shared/mb-completed/mb-completed.d.ts +0 -12
  139. package/dist/types/components/shared/mb-component/mb-component.d.ts +0 -308
  140. package/dist/types/components/shared/mb-component/mb-component.utils.d.ts +0 -3
  141. package/dist/types/components/shared/mb-container/mb-container.d.ts +0 -8
  142. package/dist/types/components/shared/mb-feedback/mb-feedback.d.ts +0 -19
  143. package/dist/types/components/shared/mb-feedback/mb-feedback.utils.d.ts +0 -2
  144. package/dist/types/components/shared/mb-help/mb-help.d.ts +0 -66
  145. package/dist/types/components/shared/mb-help/mb-help.model.d.ts +0 -9
  146. package/dist/types/components/shared/mb-image-box/mb-image-box.d.ts +0 -35
  147. package/dist/types/components/shared/mb-modal/mb-modal.d.ts +0 -53
  148. package/dist/types/components/shared/mb-overlay/mb-overlay.d.ts +0 -17
  149. package/dist/types/components/shared/mb-progress-tracker/mb-progress-tracker.d.ts +0 -19
  150. package/dist/types/components/shared/mb-screen/mb-screen.d.ts +0 -12
  151. package/dist/types/components/shared/mb-spinner/mb-spinner.d.ts +0 -16
  152. package/dist/types/components/shared/mb-tooltip/mb-tooltip.d.ts +0 -10
  153. package/dist/types/components/shared/mb-tooltip-advanced/mb-tooltip-advanced.d.ts +0 -7
  154. package/dist/types/utils/data-structures.d.ts +0 -264
  155. package/dist/types/utils/device.helpers.d.ts +0 -7
  156. package/dist/types/utils/error-structures.d.ts +0 -44
  157. package/dist/types/utils/generic.helpers.d.ts +0 -21
  158. package/dist/types/utils/sdk.service.d.ts +0 -52
  159. package/dist/types/utils/state-lifter.d.ts +0 -3
  160. package/dist/types/utils/status.document-detector.d.ts +0 -14
  161. package/dist/types/utils/translation.service.d.ts +0 -77
  162. package/loader/package.json +0 -11
package/README.md CHANGED
@@ -1,472 +1,552 @@
1
- # @jaak.ai/stamps
1
+ # Jaak Stamps - Document Detector Web Component
2
2
 
3
- ![Versión NPM](https://img.shields.io/npm/v/@jaak.ai/stamps)
4
- ![Licencia](https://img.shields.io/npm/l/@jaak.ai/stamps)
3
+ [![Built With Stencil](https://img.shields.io/badge/-Built%20With%20Stencil-16161d.svg?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI%2BCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI%2BCgkuc3Qwe2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU%2BCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00MjQuNywzNzMuOWMwLDM3LjYtNTUuMSw2OC42LTkyLjcsNjguNkgxODAuNGMtMzcuOSwwLTkyLjctMzAuNy05Mi43LTY4LjZ2LTMuNmgzMzYuOVYzNzMuOXoiLz4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTQyNC43LDI5Mi4xSDE4MC40Yy0zNy42LDAtOTIuNy0zMS05Mi43LTY4LjZ2LTMuNkgzMzJjMzcuNiwwLDkyLjcsMzEsOTIuNyw2OC42VjI5Mi4xeiIvPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDI0LjcsMTQxLjdIODcuN3YtMy42YzAtMzcuNiw1NC44LTY4LjYsOTIuNy02OC42SDMzMmMzNy45LDAsOTIuNywzMC43LDkyLjcsNjguNlYxNDEuN3oiLz4KPC9zdmc%2BCg%3D%3D&colorA=16161d&style=flat-square)](https://stenciljs.com)
4
+
5
+ Un componente web para la detección y captura automática de documentos de identificación usando visión artificial y redes neuronales.
6
+
7
+ ## Características
8
+
9
+ - 📷 **Detección automática** de documentos de identificación en tiempo real
10
+ - 🎯 **Guía visual** para posicionamiento óptimo del documento
11
+ - 📋 **Captura doble cara** (frente y reverso) con opción de omitir reverso
12
+ - 🖼 **Doble salida** para cada lado: imagen completa y recorte del documento
13
+ - 🔧 **API programática** para control total del proceso
14
+ - 📱 **Responsive** y compatible con dispositivos móviles
15
+ - ⚡ **Optimización automática** usando ONNX Runtime Web
5
16
 
6
17
  ## Instalación
7
18
 
19
+ ### NPM
8
20
  ```bash
9
21
  npm install @jaak.ai/stamps
10
22
  ```
11
23
 
24
+ ### Yarn
25
+ ```bash
26
+ yarn add @jaak.ai/stamps
27
+ ```
28
+
29
+ ### CDN
30
+ ```html
31
+ <script type="module" src="https://unpkg.com/@jaak.ai/stamps/dist/jaak-stamps-webcomponent/jaak-stamps-webcomponent.esm.js"></script>
32
+ ```
33
+
12
34
  ## Uso Básico
13
35
 
14
- ### HTML
36
+ ### HTML Vanilla
15
37
 
16
38
  ```html
17
39
  <!DOCTYPE html>
18
40
  <html>
19
41
  <head>
20
- <meta charset="utf-8">
21
- <title>Ejemplo de Detector de Documentos</title>
22
- <script type="module" src="https://cdn.jsdelivr.net/npm/@jaak.ai/stamps/dist/stamps/stamps.esm.js"></script>
23
- <script nomodule src="https://cdn.jsdelivr.net/npm/@jaak.ai/stamps/dist/stamps/stamps.js"></script>
42
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
43
+ <script type="module" src="https://unpkg.com/@jaak.ai/stamps/dist/jaak-stamps-webcomponent/jaak-stamps-webcomponent.esm.js"></script>
24
44
  </head>
25
45
  <body>
26
- <document-detector
27
- license-key="TU_CLAVE_DE_LICENCIA">
28
- </document-detector>
29
-
30
- <script>
31
- const detector = document.querySelector('document-detector');
32
-
33
- // Escuchar los eventos emitidos directamente por el componente
34
- detector.addEventListener('status', (ev) => {
35
- console.log('Estado del detector:', ev.detail);
36
- });
37
-
38
- detector.addEventListener('results', (ev) => {
39
- console.log('Resultados del escaneo:', ev.detail);
40
- });
41
-
42
- // Iniciar el escaneo por cámara cuando el componente esté listo
43
- setTimeout(() => {
44
- detector.startCameraScan();
45
- }, 1000);
46
- </script>
46
+ <jaak-stamps id="detector" debug="false"></jaak-stamps>
47
+
48
+ <button onclick="startCapture()">Iniciar Captura</button>
49
+ <button onclick="stopCapture()">Detener</button>
50
+ <button onclick="resetCapture()">Reiniciar</button>
51
+
52
+ <script>
53
+ const detector = document.getElementById('detector');
54
+
55
+ // Escuchar evento de captura completada
56
+ detector.addEventListener('captureCompleted', (event) => {
57
+ console.log('Captura completada:', event.detail);
58
+ // event.detail contiene las imágenes capturadas
59
+ });
60
+
61
+ // Escuchar evento de componente listo
62
+ detector.addEventListener('isReady', (event) => {
63
+ console.log('Componente listo:', event.detail);
64
+ // event.detail indica si el componente está listo (true/false)
65
+ });
66
+
67
+ function startCapture() {
68
+ detector.startCapture();
69
+ }
70
+
71
+ function stopCapture() {
72
+ detector.stopCapture();
73
+ }
74
+
75
+ function resetCapture() {
76
+ detector.resetCapture();
77
+ }
78
+
79
+ // Precargar el modelo (opcional - mejora el rendimiento)
80
+ async function preloadModel() {
81
+ try {
82
+ const result = await detector.preloadModel();
83
+ console.log('Modelo precargado:', result);
84
+ } catch (error) {
85
+ console.error('Error al precargar:', error);
86
+ }
87
+ }
88
+
89
+ // Obtener imágenes después de la captura
90
+ async function getImages() {
91
+ try {
92
+ const images = await detector.getCapturedImages();
93
+ console.log('Imágenes capturadas:', images);
94
+ } catch (error) {
95
+ console.error('Error:', error.message);
96
+ }
97
+ }
98
+ </script>
47
99
  </body>
48
100
  </html>
49
101
  ```
50
102
 
51
- ### React
52
-
53
- ```jsx
54
- import React, { useEffect, useRef } from 'react';
55
- import '@jaak.ai/stamps';
56
-
57
- function DocumentDetectorComponent() {
58
- const detectorRef = useRef(null);
59
-
60
- useEffect(() => {
61
- const detector = detectorRef.current;
62
-
63
- // Escuchar los eventos emitidos directamente por el componente
64
- const handleStatus = (ev) => {
65
- console.log('Estado del detector:', ev.detail);
66
- };
67
-
68
- const handleResults = (ev) => {
69
- console.log('Resultados del escaneo:', ev.detail);
70
- };
71
-
72
- detector.addEventListener('status', handleStatus);
73
- detector.addEventListener('results', handleResults);
74
-
75
- // Iniciar el escaneo por cámara cuando el componente esté listo
76
- setTimeout(() => {
77
- detector.startCameraScan();
78
- }, 1000);
79
-
80
- return () => {
81
- detector.removeEventListener('status', handleStatus);
82
- detector.removeEventListener('results', handleResults);
83
- };
84
- }, []);
85
-
86
- return (
87
- <document-detector
88
- ref={detectorRef}
89
- license-key="TU_CLAVE_DE_LICENCIA"
90
- />
91
- );
92
- }
103
+ ### Angular
93
104
 
94
- export default DocumentDetectorComponent;
105
+ #### 1. Instalar el componente
106
+ ```bash
107
+ npm install @jaak.ai/stamps
95
108
  ```
96
109
 
97
- ### Vue.js
98
-
99
- ```vue
100
- <template>
101
- <document-detector
102
- ref="detector"
103
- :license-key="licenseKey"
104
- />
105
- </template>
106
-
107
- <script>
108
- import '@jaak.ai/stamps';
109
-
110
- export default {
111
- name: 'DocumentDetectorComponent',
112
- data() {
113
- return {
114
- licenseKey: 'TU_CLAVE_DE_LICENCIA'
115
- };
116
- },
117
- methods: {
118
- // Métodos para manejar los eventos emitidos directamente por el componente
119
- handleStatus(ev) {
120
- console.log('Estado del detector:', ev.detail);
121
- },
122
- handleResults(ev) {
123
- console.log('Resultados del escaneo:', ev.detail);
124
- }
125
- },
126
- mounted() {
127
- const detector = this.$refs.detector;
128
-
129
- // Escuchar los eventos emitidos directamente por el componente
130
- detector.addEventListener('status', this.handleStatus);
131
- detector.addEventListener('results', this.handleResults);
132
-
133
- // Iniciar el escaneo por cámara cuando el componente esté listo
134
- setTimeout(() => {
135
- detector.startCameraScan();
136
- }, 1000);
137
- },
138
- beforeUnmount() {
139
- const detector = this.$refs.detector;
140
-
141
- // Eliminar los event listeners
142
- detector.removeEventListener('status', this.handleStatus);
143
- detector.removeEventListener('results', this.handleResults);
144
- }
145
- };
146
- </script>
110
+ #### 2. Configurar el módulo (app.module.ts)
111
+ ```typescript
112
+ import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
113
+ import { BrowserModule } from '@angular/platform-browser';
114
+ import { AppComponent } from './app.component';
115
+
116
+ // Importar el componente web
117
+ import '@jaak.ai/stamps/dist/jaak-stamps-webcomponent/jaak-stamps-webcomponent.esm.js';
118
+
119
+ @NgModule({
120
+ declarations: [AppComponent],
121
+ imports: [BrowserModule],
122
+ providers: [],
123
+ bootstrap: [AppComponent],
124
+ schemas: [CUSTOM_ELEMENTS_SCHEMA] // Permitir elementos personalizados
125
+ })
126
+ export class AppModule { }
147
127
  ```
148
128
 
149
- ### Angular
150
-
129
+ #### 3. Usar en el componente
151
130
  ```typescript
152
- // Asegúrate de configurar el esquema CUSTOM_ELEMENTS_SCHEMA en tu módulo
153
- import { Component, ViewChild, ElementRef, AfterViewInit, OnDestroy } from '@angular/core';
154
- import '@jaak.ai/stamps';
131
+ // app.component.ts
132
+ import { Component, ElementRef, ViewChild, OnInit } from '@angular/core';
155
133
 
156
134
  @Component({
157
- selector: 'app-document-detector',
135
+ selector: 'app-root',
158
136
  template: `
159
- <document-detector
160
- #detector
161
- [attr.license-key]="licenseKey"
162
- ></document-detector>
163
- `
137
+ <div class="container">
138
+ <h1>Detector de Documentos</h1>
139
+
140
+ <jaak-stamps
141
+ #detector
142
+ [debug]="false"
143
+ (captureCompleted)="onCaptureCompleted($event)"
144
+ (isReady)="onComponentReady($event)">
145
+ </jaak-stamps>
146
+
147
+ <div class="controls">
148
+ <button (click)="preloadModel()">Precargar Modelo</button>
149
+ <button (click)="startCapture()">Iniciar Captura</button>
150
+ <button (click)="stopCapture()">Detener</button>
151
+ <button (click)="resetCapture()">Reiniciar</button>
152
+ <button (click)="getImages()" [disabled]="!isCompleted">Obtener Imágenes</button>
153
+ </div>
154
+
155
+ <div *ngIf="capturedData" class="results">
156
+ <h3>Imágenes Capturadas:</h3>
157
+ <p>Total de imágenes: {{ capturedData.metadata.totalImages }}</p>
158
+ <img *ngIf="capturedData.front.cropped" [src]="capturedData.front.cropped" alt="Frente">
159
+ <img *ngIf="capturedData.back.cropped" [src]="capturedData.back.cropped" alt="Reverso">
160
+ </div>
161
+ </div>
162
+ `,
163
+ styles: [`
164
+ .container { max-width: 800px; margin: 0 auto; padding: 20px; }
165
+ .controls { margin: 20px 0; }
166
+ .controls button { margin: 0 10px; padding: 10px 20px; }
167
+ .results img { max-width: 300px; margin: 10px; border: 1px solid #ccc; }
168
+ `]
164
169
  })
165
- export class DocumentDetectorComponent implements AfterViewInit, OnDestroy {
166
- @ViewChild('detector') detectorRef: ElementRef;
167
- licenseKey = 'TU_CLAVE_DE_LICENCIA';
168
-
169
- // Métodos para manejar los eventos emitidos directamente por el componente
170
- handleStatus(ev) {
171
- console.log('Estado del detector:', ev.detail);
170
+ export class AppComponent implements OnInit {
171
+ @ViewChild('detector', { static: true }) detectorRef!: ElementRef;
172
+
173
+ capturedData: any = null;
174
+ isCompleted = false;
175
+
176
+ ngOnInit() {
177
+ // El elemento ya está disponible después de la vista
172
178
  }
173
-
174
- handleResults(ev) {
175
- console.log('Resultados del escaneo:', ev.detail);
179
+
180
+ async preloadModel() {
181
+ try {
182
+ const result = await this.detectorRef.nativeElement.preloadModel();
183
+ console.log('Modelo precargado:', result);
184
+ } catch (error) {
185
+ console.error('Error al precargar modelo:', error);
186
+ }
176
187
  }
177
188
 
178
- ngAfterViewInit() {
179
- const detector = this.detectorRef.nativeElement;
180
-
181
- // Escuchar los eventos emitidos directamente por el componente
182
- detector.addEventListener('status', this.handleStatus.bind(this));
183
- detector.addEventListener('results', this.handleResults.bind(this));
184
-
185
- // Iniciar el escaneo por cámara cuando el componente esté listo
186
- setTimeout(() => {
187
- detector.startCameraScan();
188
- }, 1000);
189
+ async startCapture() {
190
+ try {
191
+ await this.detectorRef.nativeElement.startCapture();
192
+ } catch (error) {
193
+ console.error('Error al iniciar captura:', error);
194
+ }
189
195
  }
190
-
191
- ngOnDestroy() {
192
- const detector = this.detectorRef.nativeElement;
193
-
194
- // Eliminar los event listeners
195
- detector.removeEventListener('status', this.handleStatus.bind(this));
196
- detector.removeEventListener('results', this.handleResults.bind(this));
196
+
197
+ async stopCapture() {
198
+ await this.detectorRef.nativeElement.stopCapture();
197
199
  }
198
- }
199
- ```
200
-
201
- ### Stencil.js
202
-
203
- ```tsx
204
- import { Component, h, State, Listen, Element } from '@stencil/core';
205
- import '@jaak.ai/stamps';
206
-
207
- @Component({
208
- tag: 'app-document-detector',
209
- styleUrl: 'app-document-detector.css',
210
- shadow: true
211
- })
212
- export class AppDocumentDetector {
213
- @Element() el: HTMLElement;
214
- @State() results: any = null;
215
- @State() status: string = '';
216
-
217
- // Escuchar los eventos emitidos directamente por el componente
218
- @Listen('status')
219
- handleStatus(ev: CustomEvent) {
220
- this.status = ev.detail;
221
- console.log('Estado del detector:', this.status);
200
+
201
+ async resetCapture() {
202
+ await this.detectorRef.nativeElement.resetCapture();
203
+ this.capturedData = null;
204
+ this.isCompleted = false;
222
205
  }
223
-
224
- @Listen('results')
225
- handleResults(ev: CustomEvent) {
226
- this.results = ev.detail;
227
- console.log('Resultados del escaneo:', this.results);
206
+
207
+ async getImages() {
208
+ try {
209
+ const images = await this.detectorRef.nativeElement.getCapturedImages();
210
+ console.log('Imágenes obtenidas:', images);
211
+ } catch (error) {
212
+ console.error('Error al obtener imágenes:', error);
213
+ }
228
214
  }
229
-
230
- componentDidLoad() {
231
- // Iniciar el escaneo por cámara cuando el componente esté listo
232
- const detector = this.el.shadowRoot.querySelector('document-detector');
233
- setTimeout(() => {
234
- detector.startCameraScan();
235
- }, 1000);
215
+
216
+ onCaptureCompleted(event: any) {
217
+ console.log('Captura completada en Angular:', event.detail);
218
+ this.capturedData = event.detail;
219
+ this.isCompleted = true;
236
220
  }
237
-
238
- render() {
239
- return (
240
- <div>
241
- <document-detector
242
- license-key="TU_CLAVE_DE_LICENCIA"
243
- />
244
- </div>
245
- );
221
+
222
+ onComponentReady(event: any) {
223
+ console.log('Componente listo en Angular:', event.detail);
224
+ // El componente está listo para iniciar detección
246
225
  }
247
226
  }
248
227
  ```
249
228
 
250
- ## Componente Document-Detector
251
-
252
- El componente `document-detector` es el elemento principal de esta librería, diseñado para proporcionar una experiencia completa de escaneo e identificación de documentos en aplicaciones web.
253
-
254
- ### Descripción General
255
-
256
- El `document-detector` es un componente web que utiliza tecnología de reconocimiento óptico avanzada para escanear y extraer información de documentos de identidad. Está construido sobre el SDK BlinkID y ofrece una interfaz fácil de usar para integrar capacidades de escaneo de documentos en cualquier aplicación web.
257
-
258
- ### Características Principales
259
-
260
- - **Escaneo en tiempo real**: Captura documentos de identidad a través de la cámara del dispositivo.
261
- - **Procesamiento de imágenes**: Permite cargar imágenes de documentos para su análisis.
262
- - **Soporte para documentos de doble cara**: Puede procesar ambos lados de documentos como identificaciones o licencias de conducir.
263
- - **Extracción de datos**: Obtiene automáticamente información como nombre, fecha de nacimiento, número de documento, etc.
264
- - **Captura de imágenes**: Guarda imágenes del documento, rostro y firma cuando están disponibles.
265
- - **Interfaz personalizable**: Permite adaptar la apariencia y comportamiento a las necesidades de tu aplicación.
266
- - **Eventos detallados**: Proporciona eventos para cada etapa del proceso de escaneo.
229
+ ### React
267
230
 
268
- ### Ciclo de Vida del Componente
231
+ #### 1. Instalar el componente
232
+ ```bash
233
+ npm install @jaak.ai/stamps
234
+ ```
269
235
 
270
- 1. **Inicialización**: El componente carga el SDK y prepara los reconocedores.
271
- 2. **Detección**: Busca un documento en el campo visual de la cámara o en la imagen proporcionada.
272
- 3. **Análisis**: Procesa el documento detectado para extraer la información.
273
- 4. **Resultados**: Emite los datos extraídos y las imágenes capturadas.
236
+ #### 2. Crear componente wrapper (opcional pero recomendado)
237
+ ```jsx
238
+ // JaakStampsWrapper.jsx
239
+ import React, { useRef, useEffect, useImperativeHandle, forwardRef } from 'react';
240
+
241
+ // Importar el web component
242
+ import '@jaak.ai/stamps/dist/jaak-stamps-webcomponent/jaak-stamps-webcomponent.esm.js';
243
+
244
+ const JaakStampsWrapper = forwardRef(({ debug = false, onCaptureCompleted, onIsReady }, ref) => {
245
+ const elementRef = useRef(null);
246
+
247
+ useImperativeHandle(ref, () => ({
248
+ preloadModel: () => elementRef.current?.preloadModel(),
249
+ startCapture: () => elementRef.current?.startCapture(),
250
+ stopCapture: () => elementRef.current?.stopCapture(),
251
+ resetCapture: () => elementRef.current?.resetCapture(),
252
+ getCapturedImages: () => elementRef.current?.getCapturedImages(),
253
+ getStatus: () => elementRef.current?.getStatus(),
254
+ skipBackCapture: () => elementRef.current?.skipBackCapture(),
255
+ isProcessCompleted: () => elementRef.current?.isProcessCompleted()
256
+ }));
257
+
258
+ useEffect(() => {
259
+ const element = elementRef.current;
260
+
261
+ const handleCaptureCompleted = (event) => {
262
+ if (onCaptureCompleted) {
263
+ onCaptureCompleted(event.detail);
264
+ }
265
+ };
266
+
267
+ const handleIsReady = (event) => {
268
+ if (onIsReady) {
269
+ onIsReady(event.detail);
270
+ }
271
+ };
272
+
273
+ if (element) {
274
+ element.addEventListener('captureCompleted', handleCaptureCompleted);
275
+ element.addEventListener('isReady', handleIsReady);
276
+
277
+ return () => {
278
+ element.removeEventListener('captureCompleted', handleCaptureCompleted);
279
+ element.removeEventListener('isReady', handleIsReady);
280
+ };
281
+ }
282
+ }, [onCaptureCompleted, onIsReady]);
283
+
284
+ return (
285
+ <jaak-stamps
286
+ ref={elementRef}
287
+ debug={debug}
288
+ />
289
+ );
290
+ });
274
291
 
275
- ### Casos de Uso Comunes
292
+ export default JaakStampsWrapper;
293
+ ```
276
294
 
277
- - **Verificación de identidad**: Para procesos de onboarding digital o KYC (Know Your Customer).
278
- - **Registro de usuarios**: Automatización de la captura de datos personales.
279
- - **Check-in digital**: En hoteles, eventos o instalaciones que requieren identificación.
280
- - **Servicios financieros**: Para apertura de cuentas o solicitudes de crédito.
281
- - **Servicios de salud**: Registro de pacientes y verificación de seguros.
295
+ #### 3. Usar en tu aplicación React
296
+ ```jsx
297
+ // App.jsx
298
+ import React, { useRef, useState } from 'react';
299
+ import JaakStampsWrapper from './components/JaakStampsWrapper';
282
300
 
283
- ### Ejemplo de Implementación Básica
301
+ function App() {
302
+ const detectorRef = useRef(null);
303
+ const [capturedData, setCapturedData] = useState(null);
304
+ const [isCompleted, setIsCompleted] = useState(false);
305
+ const [status, setStatus] = useState(null);
306
+
307
+ const handleCaptureCompleted = (data) => {
308
+ console.log('Captura completada:', data);
309
+ setCapturedData(data);
310
+ setIsCompleted(true);
311
+ };
312
+
313
+ const handleIsReady = (isReady) => {
314
+ console.log('Componente listo:', isReady);
315
+ // El componente está listo para iniciar detección
316
+ };
317
+
318
+ const preloadModel = async () => {
319
+ try {
320
+ const result = await detectorRef.current?.preloadModel();
321
+ console.log('Modelo precargado:', result);
322
+ } catch (error) {
323
+ console.error('Error al precargar modelo:', error);
324
+ }
325
+ };
326
+
327
+ const startCapture = async () => {
328
+ try {
329
+ await detectorRef.current?.startCapture();
330
+ } catch (error) {
331
+ console.error('Error al iniciar captura:', error);
332
+ }
333
+ };
334
+
335
+ const stopCapture = async () => {
336
+ await detectorRef.current?.stopCapture();
337
+ };
338
+
339
+ const resetCapture = async () => {
340
+ await detectorRef.current?.resetCapture();
341
+ setCapturedData(null);
342
+ setIsCompleted(false);
343
+ };
344
+
345
+ const getImages = async () => {
346
+ try {
347
+ const images = await detectorRef.current?.getCapturedImages();
348
+ console.log('Imágenes obtenidas:', images);
349
+ } catch (error) {
350
+ console.error('Error al obtener imágenes:', error);
351
+ }
352
+ };
353
+
354
+ const checkStatus = async () => {
355
+ const currentStatus = await detectorRef.current?.getStatus();
356
+ setStatus(currentStatus);
357
+ };
358
+
359
+ return (
360
+ <div className="App">
361
+ <header className="App-header">
362
+ <h1>Detector de Documentos - React</h1>
363
+
364
+ <JaakStampsWrapper
365
+ ref={detectorRef}
366
+ debug={false}
367
+ onCaptureCompleted={handleCaptureCompleted}
368
+ onIsReady={handleIsReady}
369
+ />
370
+
371
+ <div className="controls">
372
+ <button onClick={preloadModel}>Precargar Modelo</button>
373
+ <button onClick={startCapture}>Iniciar Captura</button>
374
+ <button onClick={stopCapture}>Detener</button>
375
+ <button onClick={resetCapture}>Reiniciar</button>
376
+ <button onClick={getImages} disabled={!isCompleted}>
377
+ Obtener Imágenes
378
+ </button>
379
+ <button onClick={checkStatus}>Verificar Estado</button>
380
+ </div>
381
+
382
+ {status && (
383
+ <div className="status">
384
+ <h3>Estado Actual:</h3>
385
+ <p>Video activo: {status.isVideoActive ? 'Sí' : 'No'}</p>
386
+ <p>Paso: {status.captureStep}</p>
387
+ <p>Mensaje: {status.statusMessage}</p>
388
+ <p>Proceso completado: {status.isProcessCompleted ? 'Sí' : 'No'}</p>
389
+ <p>Modelo precargado: {status.isModelPreloaded ? 'Sí' : 'No'}</p>
390
+ </div>
391
+ )}
392
+
393
+ {capturedData && (
394
+ <div className="results">
395
+ <h3>Resultados de la Captura:</h3>
396
+ <p>Total de imágenes: {capturedData.metadata.totalImages}</p>
397
+ <p>Timestamp: {capturedData.timestamp}</p>
398
+
399
+ {capturedData.front.cropped && (
400
+ <div>
401
+ <h4>Frente del Documento:</h4>
402
+ <img
403
+ src={capturedData.front.cropped}
404
+ alt="Frente del documento"
405
+ style={{ maxWidth: '300px', border: '1px solid #ccc', margin: '10px' }}
406
+ />
407
+ </div>
408
+ )}
409
+
410
+ {capturedData.back.cropped && (
411
+ <div>
412
+ <h4>Reverso del Documento:</h4>
413
+ <img
414
+ src={capturedData.back.cropped}
415
+ alt="Reverso del documento"
416
+ style={{ maxWidth: '300px', border: '1px solid #ccc', margin: '10px' }}
417
+ />
418
+ </div>
419
+ )}
420
+ </div>
421
+ )}
422
+ </header>
423
+ </div>
424
+ );
425
+ }
284
426
 
285
- ```html
286
- <document-detector
287
- license-key="TU_CLAVE_DE_LICENCIA">
288
- </document-detector>
289
-
290
- <!-- O usando la propiedad config -->
291
- <document-detector
292
- config='{"key": "TU_CLAVE_DE_LICENCIA"}'>
293
- </document-detector>
427
+ export default App;
294
428
  ```
295
429
 
296
- ### Manejo de Eventos
297
-
298
- ```javascript
299
- const detector = document.querySelector('document-detector');
300
-
301
- // Escuchar el evento de cambio de estado
302
- detector.addEventListener('status', (event) => {
303
- console.log('Estado del detector:', event.detail);
304
-
305
- // Puedes reaccionar a diferentes estados
306
- switch(event.detail) {
307
- case 'INITIALIZING':
308
- console.log('El detector se está inicializando');
309
- break;
310
- case 'READY':
311
- console.log('El detector está listo para escanear');
312
- break;
313
- case 'RECORDING':
314
- console.log('La cámara está activa y grabando');
315
- break;
316
- case 'RESULTS_SUCCESS':
317
- console.log('Se han obtenido resultados exitosamente');
318
- break;
319
- case 'ERROR':
320
- console.log('Ha ocurrido un error en el detector');
321
- break;
322
- }
323
- });
430
+ ## API Reference
324
431
 
325
- // Escuchar el evento de resultados
326
- detector.addEventListener('results', (event) => {
327
- const resultados = event.detail;
328
- console.log('Datos del documento:', resultados);
432
+ ### Props/Atributos
329
433
 
330
- // Acceder a imágenes del documento (si están disponibles)
331
- if (resultados.generalData && resultados.generalData.documentImage) {
332
- const imagenFrente = resultados.generalData.documentImage.front;
333
- const imagenReverso = resultados.generalData.documentImage.back;
334
- const imagenRostro = resultados.generalData.documentImage.face;
434
+ | Propiedad | Tipo | Predeterminado | Descripción |
435
+ |-----------|------|---------------|-------------|
436
+ | `debug` | `boolean` | `false` | Activa el modo debug para mostrar información de depuración |
437
+ | `alignmentTolerance` | `number` | `10` | Tolerancia en píxeles para considerar un lado alineado |
335
438
 
336
- // Hacer algo con las imágenes...
337
- }
338
- });
339
- ```
439
+ ### Métodos Públicos
340
440
 
341
- ### Control Programático
441
+ | Método | Retorna | Descripción |
442
+ |--------|---------|-------------|
443
+ | `startCapture()` | `Promise<void>` | Inicia el proceso de detección y captura |
444
+ | `stopCapture()` | `Promise<void>` | Detiene el proceso y libera la cámara |
445
+ | `resetCapture()` | `Promise<void>` | Reinicia el proceso de captura |
446
+ | `preloadModel()` | `Promise<{success: boolean, message?: string, error?: string}>` | Precarga el modelo de detección |
447
+ | `getCapturedImages()` | `Promise<CapturedImages>` | Obtiene las imágenes capturadas (solo después de completar) |
448
+ | `isProcessCompleted()` | `Promise<boolean>` | Verifica si el proceso ha sido completado |
449
+ | `getStatus()` | `Promise<Status>` | Obtiene el estado actual del detector |
450
+ | `skipBackCapture()` | `Promise<void>` | Omite la captura del reverso (solo disponible en paso 'back') |
342
451
 
343
- ```javascript
344
- const detector = document.querySelector('document-detector');
452
+ ### Eventos
345
453
 
346
- // Iniciar escaneo por cámara
347
- function iniciarEscaneoCamara() {
348
- detector.startCameraScan();
349
- }
454
+ | Evento | Payload | Descripción |
455
+ |--------|---------|-------------|
456
+ | `captureCompleted` | `CapturedImages` | Se emite cuando se completa el proceso de captura |
457
+ | `isReady` | `boolean` | Se emite cuando el componente está listo para comenzar la detección (modelo ONNX cargado) |
350
458
 
351
- // Iniciar escaneo desde archivo de imagen
352
- function escanearDesdeImagen(archivo) {
353
- detector.startImageScan(archivo);
354
- }
459
+ ### Tipos de Datos
355
460
 
356
- // Reiniciar el componente (útil cuando se necesita resetear el estado)
357
- function reiniciarEscaneo() {
358
- detector.restartComponent();
461
+ ```typescript
462
+ interface CapturedImages {
463
+ front: {
464
+ fullFrame: string | null; // Base64 de la imagen completa del frente
465
+ cropped: string | null; // Base64 del documento recortado del frente
466
+ };
467
+ back: {
468
+ fullFrame: string | null; // Base64 de la imagen completa del reverso
469
+ cropped: string | null; // Base64 del documento recortado del reverso
470
+ };
471
+ timestamp: string; // ISO timestamp de la captura
472
+ metadata: {
473
+ totalImages: number; // Número total de imágenes capturadas
474
+ processCompleted: boolean; // Si el proceso fue completado
475
+ backCaptureSkipped?: boolean; // Si se omitió la captura del reverso
476
+ };
359
477
  }
360
478
 
361
- // Ejemplo de uso con un input de archivo
362
- document.getElementById('inputImagen').addEventListener('change', (event) => {
363
- if (event.target.files && event.target.files[0]) {
364
- escanearDesdeImagen(event.target.files[0]);
365
- }
366
- });
367
- ```
368
-
369
- ### Personalización de la Apariencia
370
-
371
- El componente puede personalizarse mediante CSS utilizando las partes expuestas a través de Shadow DOM:
372
-
373
- ```css
374
- document-detector::part(mb-camera-video) {
375
- border-radius: 16px;
376
- border: 2px solid #3498db;
479
+ interface Status {
480
+ isVideoActive: boolean; // Si la cámara está activa
481
+ captureStep: 'front' | 'back' | 'completed'; // Paso actual del proceso
482
+ statusMessage: string; // Mensaje de estado actual
483
+ hasImages: boolean; // Si hay imágenes capturadas
484
+ isProcessCompleted: boolean; // Si el proceso está completado
485
+ isModelPreloaded: boolean; // Si el modelo está precargado
377
486
  }
378
487
  ```
379
488
 
380
- ### Consideraciones Importantes
489
+ ## Flujo de Trabajo
381
490
 
382
- - **Permisos de cámara**: El navegador solicitará permiso para acceder a la cámara del dispositivo.
383
- - **HTTPS**: Para usar la funcionalidad de cámara, tu aplicación debe servirse a través de HTTPS.
384
- - **Compatibilidad**: Verifica la compatibilidad con navegadores móviles si tu aplicación está orientada a dispositivos móviles.
385
- - **Licencia**: Se requiere una clave de licencia válida para el funcionamiento del componente.
491
+ ### Flujo Estándar
492
+ 1. **Inicialización**: El componente se prepara para la detección
493
+ 2. **Inicio de captura**: Se carga el modelo ONNX automáticamente al iniciar la detección
494
+ 3. **Captura del frente**: El usuario posiciona el documento y se captura automáticamente
495
+ 4. **Captura del reverso**: Se solicita voltear el documento para capturar el reverso
496
+ 5. **Completado**: Se emite el evento `captureCompleted` con todas las imágenes
386
497
 
387
- ## Referencia de API
498
+ ### Flujo con Precarga (Recomendado)
499
+ 1. **Precarga del modelo**: Se llama a `preloadModel()` para cargar el modelo en memoria
500
+ 2. **Inicio optimizado**: Al iniciar la captura, se usa el modelo ya cargado
501
+ 3. **Captura del frente**: Detección más rápida con el modelo precargado
502
+ 4. **Captura del reverso**: Se solicita voltear el documento
503
+ 5. **Completado**: Se emite el evento `captureCompleted` con todas las imágenes
388
504
 
389
- ### Propiedades
390
-
391
- > **Nota**: Solo las siguientes propiedades pueden ser configuradas directamente en el componente.
392
-
393
- | Propiedad | Tipo | Descripción |
394
- |--------------------------|-------------------------------------------|--------------------------------------------|
395
- | `license-key` | string | Clave de licencia para el SDK |
396
- | `config` | { key: string } | Configuración del componente (incluye la clave de licencia) |
397
-
398
- ### Eventos
505
+ ## Requisitos del Sistema
399
506
 
400
- > **Nota**: Solo los siguientes eventos son emitidos directamente por el componente.
507
+ - **Navegadores**: Chrome/Edge 88+, Firefox 85+, Safari 14+
508
+ - **Cámara**: Acceso a cámara trasera (móvil) o webcam (escritorio)
509
+ - **Conexión**: Conexión a internet para cargar el modelo ONNX Runtime
401
510
 
402
- | Evento | Detalle | Descripción |
403
- |----------------------|-------------------------------------------|--------------------------------------------|
404
- | `status` | StatusDocumentDetector | Cambio de estado del detector |
405
- | `results` | any | Resultados del escaneo |
511
+ ## Consideraciones de Privacidad
406
512
 
407
- ### Métodos
513
+ - Las imágenes se procesan localmente en el navegador
514
+ - No se envían datos a servidores externos
515
+ - El modelo de IA se ejecuta completamente en el cliente
516
+ - Las imágenes capturadas solo están disponibles en el contexto de tu aplicación
408
517
 
409
- > **Nota**: Solo los siguientes métodos pueden ser llamados directamente en el componente.
518
+ ## Desarrollo
410
519
 
411
- | Método | Parámetros | Retorno | Descripción |
412
- |-------------------------|--------------------------------------------|--------------------- |-------------------------------------------|
413
- | `setUiState` | state: "ERROR" \| "LOADING" \| "NONE" \| "SUCCESS" | Promise<void> | Establecer el estado UI del componente |
414
- | `startCameraScan` | Ninguno | Promise<void> | Inicia el escaneo utilizando la cámara |
415
- | `startImageScan` | file: File | Promise<void> | Inicia el escaneo utilizando una imagen |
416
- | `startMultiSideImageScan` | firstFile: File, secondFile: File | Promise<void> | Inicia el escaneo utilizando dos imágenes para documentos de doble cara |
417
- | `setUiMessage` | state: "FEEDBACK_ERROR" \| "FEEDBACK_INFO" \| "FEEDBACK_OK", message: string | Promise<void> | Establecer un mensaje UI |
418
- | `getProductIntegrationInfo` | Ninguno | Promise<ProductIntegrationInfo> | Obtener información de integración del producto |
419
- | `restartComponent` | Ninguno | Promise<void> | Reinicia el componente y vuelve a iniciar el escaneo por cámara |
420
-
421
- ## Tipos de Objetos de Eventos
520
+ ### Clonar el repositorio
521
+ ```bash
522
+ git clone [repository-url]
523
+ cd jaak-stamps-webcomponent
524
+ ```
422
525
 
423
- > **Nota**: A continuación se describen los tipos de datos para los eventos emitidos por el componente.
526
+ ### Instalar dependencias
527
+ ```bash
528
+ npm install
529
+ ```
424
530
 
425
- ### StatusDocumentDetector
531
+ ### Desarrollo local
532
+ ```bash
533
+ npm start
534
+ ```
426
535
 
427
- ```typescript
428
- enum StatusDocumentDetector {
429
- INITIALIZING = "INITIALIZING",
430
- READY = "READY",
431
- RECORDING = "RECORDING",
432
- RUNNING = "RUNNING",
433
- RESULTS_SUCCESS = "RESULTS_SUCCESS",
434
- DETECTION_FAILED = "DETECTION_FAILED",
435
- ERROR = "ERROR"
436
- }
536
+ ### Construir para producción
537
+ ```bash
538
+ npm run build
437
539
  ```
438
540
 
439
- ### Resultados (results)
541
+ ### Ejecutar tests
542
+ ```bash
543
+ npm test
544
+ ```
440
545
 
441
- El evento `results` emite un objeto con los datos extraídos del documento escaneado, que incluye:
546
+ ## Soporte
442
547
 
443
- ```typescript
444
- interface DocumentData {
445
- generalData: {
446
- type: string;
447
- nationality: string;
448
- name: string;
449
- surname: string;
450
- address: string;
451
- birthDate: string;
452
- gender: string;
453
- documentImage: {
454
- frontFull: string; // Imagen base64
455
- backFull: string; // Imagen base64
456
- front: string; // Imagen base64
457
- back: string; // Imagen base64
458
- signature: string; // Imagen base64
459
- face: string; // Imagen base64
460
- }
461
- };
462
- mechanicalReadingZone: string;
463
- specificData: Array<{
464
- label: string;
465
- value: string;
466
- }>;
467
- }
468
- ```
548
+ Para reportar bugs o solicitar características, por favor crea un issue en el repositorio del proyecto.
469
549
 
470
550
  ## Licencia
471
551
 
472
- MIT
552
+ MIT License - ver archivo LICENSE para detalles.