@jaak.ai/stamps 2.5.7-dev.4 → 2.5.8-dev.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.
- package/dist/cjs/jaak-stamps.cjs.entry.js +78 -30
- package/dist/cjs/jaak-stamps.cjs.entry.js.map +1 -1
- package/dist/cjs/jaak-stamps.entry.cjs.js.map +1 -1
- package/dist/collection/components/jaak-stamps/jaak-stamps.js +78 -30
- package/dist/collection/components/jaak-stamps/jaak-stamps.js.map +1 -1
- package/dist/components/jaak-stamps.js +78 -30
- package/dist/components/jaak-stamps.js.map +1 -1
- package/dist/esm/jaak-stamps.entry.js +78 -30
- package/dist/esm/jaak-stamps.entry.js.map +1 -1
- package/dist/jaak-stamps-webcomponent/jaak-stamps-webcomponent.esm.js +1 -1
- package/dist/jaak-stamps-webcomponent/jaak-stamps.entry.esm.js.map +1 -1
- package/dist/jaak-stamps-webcomponent/{p-9afd846d.entry.js → p-474f6bec.entry.js} +2 -2
- package/dist/jaak-stamps-webcomponent/p-474f6bec.entry.js.map +1 -0
- package/dist/types/components/jaak-stamps/jaak-stamps.d.ts +3 -1
- package/package.json +1 -1
- package/dist/jaak-stamps-webcomponent/p-9afd846d.entry.js.map +0 -1
|
@@ -18747,6 +18747,8 @@ const JaakStamps = class {
|
|
|
18747
18747
|
classificationDisabled = false; // Classification disabled at runtime due to errors
|
|
18748
18748
|
_initialized = false;
|
|
18749
18749
|
_initializing = false;
|
|
18750
|
+
_pendingEnvironmentRetry = false;
|
|
18751
|
+
_pendingInit = null;
|
|
18750
18752
|
// Services
|
|
18751
18753
|
licenseValidationService = null;
|
|
18752
18754
|
serviceContainer;
|
|
@@ -18816,17 +18818,21 @@ const JaakStamps = class {
|
|
|
18816
18818
|
canvasPool = [];
|
|
18817
18819
|
MAX_CANVAS_POOL_SIZE = 3;
|
|
18818
18820
|
async componentWillLoad() {
|
|
18819
|
-
//
|
|
18820
|
-
//
|
|
18821
|
-
//
|
|
18822
|
-
|
|
18821
|
+
// @Watch handlers fire synchronously when Angular sets properties, which happens
|
|
18822
|
+
// BEFORE componentWillLoad (Stencil schedules componentWillLoad as a microtask after
|
|
18823
|
+
// connectedCallback, while Angular sets props synchronously in that same call stack).
|
|
18824
|
+
// @Watch('license') defers init to a macrotask so @Watch('licenseEnvironment') fires
|
|
18825
|
+
// first. By the time we resume here, init may already be in progress.
|
|
18826
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
18823
18827
|
if (this.debug) {
|
|
18824
|
-
console.log('[JAAK-DEBUG] componentWillLoad() - Props after
|
|
18828
|
+
console.log('[JAAK-DEBUG] componentWillLoad() - Props after yield:');
|
|
18829
|
+
console.log('[JAAK-DEBUG] license:', this.license ? this.license.substring(0, 8) + '...' : 'EMPTY');
|
|
18830
|
+
console.log('[JAAK-DEBUG] licenseEnvironment:', this.licenseEnvironment);
|
|
18831
|
+
console.log('[JAAK-DEBUG] _initializing:', this._initializing);
|
|
18832
|
+
console.log('[JAAK-DEBUG] _initialized:', this._initialized);
|
|
18825
18833
|
console.log('[JAAK-DEBUG] useDocumentDetector:', this.useDocumentDetector, '(type:', typeof this.useDocumentDetector, ')');
|
|
18826
18834
|
console.log('[JAAK-DEBUG] useDocumentClassification:', this.useDocumentClassification);
|
|
18827
18835
|
console.log('[JAAK-DEBUG] debug:', this.debug);
|
|
18828
|
-
console.log('[JAAK-DEBUG] license:', this.license ? this.license.substring(0, 8) + '...' : 'EMPTY');
|
|
18829
|
-
console.log('[JAAK-DEBUG] licenseEnvironment:', this.licenseEnvironment);
|
|
18830
18836
|
console.log('[JAAK-DEBUG] alignmentTolerance:', this.alignmentTolerance);
|
|
18831
18837
|
console.log('[JAAK-DEBUG] maskSize:', this.maskSize);
|
|
18832
18838
|
console.log('[JAAK-DEBUG] captureDelay:', this.captureDelay);
|
|
@@ -18834,41 +18840,67 @@ const JaakStamps = class {
|
|
|
18834
18840
|
console.log('[JAAK-DEBUG] appId:', this.appId);
|
|
18835
18841
|
}
|
|
18836
18842
|
if (!this.license) {
|
|
18837
|
-
|
|
18838
|
-
|
|
18839
|
-
|
|
18840
|
-
|
|
18843
|
+
if (!this._initialized && !this._initializing) {
|
|
18844
|
+
// No license and init not started — show blocking error UI
|
|
18845
|
+
this.licenseValid = false;
|
|
18846
|
+
this.licenseError = 'Se requiere una licencia para continuar. Por favor, proporcione una licencia usando el atributo "license".';
|
|
18847
|
+
this.updateStatus('Licencia requerida', 'Proporcione una licencia para continuar', 'error');
|
|
18848
|
+
}
|
|
18841
18849
|
}
|
|
18842
|
-
else {
|
|
18843
|
-
// License present
|
|
18844
|
-
// already shows it
|
|
18845
|
-
// would flag as an extra re-render.
|
|
18850
|
+
else if (!this._initialized && !this._initializing) {
|
|
18851
|
+
// License present but init hasn't started yet (no @Watch fired) — set initial status
|
|
18852
|
+
// so the first render already shows it without a redundant state change in componentDidLoad
|
|
18846
18853
|
this.updateStatus('Validando licencia...', 'Verificando autorización de uso', 'initializing');
|
|
18847
18854
|
}
|
|
18848
18855
|
// Heavy initialization is deferred to componentDidLoad so the first render is not blocked
|
|
18849
18856
|
}
|
|
18850
18857
|
async componentDidLoad() {
|
|
18851
|
-
//
|
|
18852
|
-
if (!this.license || this._initialized || this._initializing) {
|
|
18858
|
+
// If @Watch('license') already scheduled or started init, let it proceed
|
|
18859
|
+
if (!this.license || this._initialized || this._initializing || this._pendingInit !== null) {
|
|
18853
18860
|
return;
|
|
18854
18861
|
}
|
|
18855
18862
|
await this.validateAndInitialize();
|
|
18856
18863
|
}
|
|
18857
|
-
|
|
18864
|
+
onLicenseChanged(newLicense) {
|
|
18858
18865
|
if (!newLicense || this._initialized || this._initializing) {
|
|
18859
18866
|
return;
|
|
18860
18867
|
}
|
|
18861
|
-
//
|
|
18862
|
-
|
|
18863
|
-
|
|
18868
|
+
// Defer init by one macrotask (setTimeout 0) so @Watch('licenseEnvironment') fires
|
|
18869
|
+
// first. Angular applies [license] before [licenseEnvironment] in template order,
|
|
18870
|
+
// meaning a synchronous start here would use the Stencil default "prod" for the env.
|
|
18871
|
+
if (this._pendingInit !== null)
|
|
18872
|
+
clearTimeout(this._pendingInit);
|
|
18873
|
+
this._pendingInit = setTimeout(async () => {
|
|
18874
|
+
this._pendingInit = null;
|
|
18875
|
+
if (!this._initialized && !this._initializing && this.license) {
|
|
18876
|
+
this.updateStatus('Validando licencia...', 'Verificando autorización de uso', 'initializing');
|
|
18877
|
+
await this.validateAndInitialize();
|
|
18878
|
+
}
|
|
18879
|
+
}, 0);
|
|
18864
18880
|
}
|
|
18865
18881
|
async onLicenseEnvironmentChanged() {
|
|
18866
|
-
// Always recreate the service so the correct environment URL is
|
|
18882
|
+
// Always recreate the service so the correct environment URL is ready.
|
|
18867
18883
|
this.licenseValidationService = new LicenseValidationService(this.licenseEnvironment);
|
|
18868
|
-
|
|
18869
|
-
|
|
18870
|
-
|
|
18871
|
-
|
|
18884
|
+
if (this._initializing) {
|
|
18885
|
+
// Validation is already in-flight with the wrong environment.
|
|
18886
|
+
// Flag a retry so validateAndInitialize restarts once the current attempt ends.
|
|
18887
|
+
this._pendingEnvironmentRetry = true;
|
|
18888
|
+
return;
|
|
18889
|
+
}
|
|
18890
|
+
// If @Watch('license') already scheduled a deferred init, that init will read
|
|
18891
|
+
// this.licenseEnvironment at fire time (after this handler returns), so the
|
|
18892
|
+
// correct URL will be used — no need to trigger a second init here.
|
|
18893
|
+
if (this._pendingInit !== null) {
|
|
18894
|
+
return;
|
|
18895
|
+
}
|
|
18896
|
+
if (this._initialized) {
|
|
18897
|
+
// Component was fully initialized with the wrong env URL (e.g. Ionic animation
|
|
18898
|
+
// delayed Angular's CD past the initial validateAndInitialize() cycle).
|
|
18899
|
+
// Re-validate the license only — services and camera are already running.
|
|
18900
|
+
await this.validateLicense();
|
|
18901
|
+
return;
|
|
18902
|
+
}
|
|
18903
|
+
if (this.license) {
|
|
18872
18904
|
this.updateStatus('Validando licencia...', 'Verificando autorización de uso', 'initializing');
|
|
18873
18905
|
await this.validateAndInitialize();
|
|
18874
18906
|
}
|
|
@@ -18908,6 +18940,22 @@ const JaakStamps = class {
|
|
|
18908
18940
|
}
|
|
18909
18941
|
finally {
|
|
18910
18942
|
this._initializing = false;
|
|
18943
|
+
if (this._pendingEnvironmentRetry && this.license) {
|
|
18944
|
+
this._pendingEnvironmentRetry = false;
|
|
18945
|
+
if (this._initialized) {
|
|
18946
|
+
// Already fully initialized with wrong env URL — re-validate only the license.
|
|
18947
|
+
// Services and camera are already running and don't depend on the env URL.
|
|
18948
|
+
await this.validateLicense();
|
|
18949
|
+
}
|
|
18950
|
+
else {
|
|
18951
|
+
// Not yet initialized — full retry with the correct environment.
|
|
18952
|
+
this.updateStatus('Validando licencia...', 'Verificando autorización de uso', 'initializing');
|
|
18953
|
+
await this.validateAndInitialize();
|
|
18954
|
+
}
|
|
18955
|
+
}
|
|
18956
|
+
else {
|
|
18957
|
+
this._pendingEnvironmentRetry = false;
|
|
18958
|
+
}
|
|
18911
18959
|
}
|
|
18912
18960
|
}
|
|
18913
18961
|
async initializeServices() {
|
|
@@ -20281,7 +20329,7 @@ const JaakStamps = class {
|
|
|
20281
20329
|
isCapturing: false
|
|
20282
20330
|
};
|
|
20283
20331
|
const cameraInfo = this.cameraInfoWithAutofocus;
|
|
20284
|
-
return (h("div", { key: '
|
|
20332
|
+
return (h("div", { key: 'c0a28d9fd8a66fc8589c0111508ea959f07c143f', class: "detector-container" }, !this.licenseValid && this.licenseError && (h("div", { key: '1d0162e9d56c65f646884d12a3c73f4ed7e4c1fc', class: "license-error-container" }, h("div", { key: 'a50de01af3d60f4dbe2d17c9d059f79ad0fc8191', class: "license-error-card" }, h("svg", { key: '1dd6b599a3ca9bf818aec832638bab23b4ae4074', class: "license-error-icon", width: "64", height: "64", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, h("path", { key: 'c7175baf6b409428d820326e24522c7dd0b28811', d: "M12 22C12 22 20 18 20 12V5L12 2L4 5V12C4 18 12 22 12 22Z", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { key: '1ff3c700981b50ed670a499054ceb7b4afc12bc2', d: "M12 8V12", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round" }), h("circle", { key: 'f0adaa57bc3a218eedf92478f577a381fdb29268', cx: "12", cy: "16", r: "0.5", fill: "currentColor", stroke: "currentColor", "stroke-width": "1" })), h("h2", { key: '076e4aaf687e47d2553ba264af3de5ff67b03c60', class: "license-error-title" }, "Licencia Requerida"), h("p", { key: '607d2793649698c5686ee98af1e4c48921cba094', class: "license-error-message" }, this.licenseError), h("p", { key: '2d5eef84366fabdfea2106e7e5a198ab085c3a01', class: "license-error-help" }, "Contacte a soporte: ", h("a", { key: '91d7d22d72f78ae52bc8ddc0955b3ac559474579', href: "mailto:support@jaak.ai" }, "support@jaak.ai")), h("div", { key: '0ccf2e04602f740b6dd8551068c044d17691ba38', class: "license-error-footer" }, "JAAK Stamps")))), this.licenseValid && (h("div", { key: '339a6066a03d820c74cfd77ce7d582d2282dbf05', class: "video-container" }, h("video", { key: '680e86ddef25468ea253febbbc2a5b895b9be955', ref: el => this.videoRef = el, autoplay: true, muted: true, playsinline: true, class: this.shouldMirrorVideo ? 'mirror' : '', style: {
|
|
20285
20333
|
// Keep the element rendered (display: block) so the browser
|
|
20286
20334
|
// loads stream metadata and fires 'loadedmetadata'. Hiding it
|
|
20287
20335
|
// with display:none prevents metadata loading in Chrome and
|
|
@@ -20290,7 +20338,7 @@ const JaakStamps = class {
|
|
|
20290
20338
|
// render context alive.
|
|
20291
20339
|
opacity: captureState.isVideoActive ? '1' : '0',
|
|
20292
20340
|
visibility: captureState.isVideoActive ? 'visible' : 'hidden',
|
|
20293
|
-
} }), h("div", { key: '
|
|
20341
|
+
} }), h("div", { key: '521004bb615866dcf160086009810a543fe26a24', ref: el => this.detectionContainer = el, class: `detection-overlay ${this.shouldMirrorVideo ? 'mirror' : ''}` }, this.debug && this.detectionBoxes.map((box, index) => (h("div", { key: index, class: "detection-box", style: {
|
|
20294
20342
|
position: 'absolute',
|
|
20295
20343
|
left: `${box.x}px`,
|
|
20296
20344
|
top: `${box.y}px`,
|
|
@@ -20299,9 +20347,9 @@ const JaakStamps = class {
|
|
|
20299
20347
|
border: '2px solid #32406C',
|
|
20300
20348
|
pointerEvents: 'none',
|
|
20301
20349
|
boxSizing: 'border-box'
|
|
20302
|
-
} })))), this.isMaskReady && (h("div", { key: '
|
|
20350
|
+
} })))), this.isMaskReady && (h("div", { key: '7b4657df6b922001c726e004c326fe2bc5b20e65', class: "overlay-mask" }, h("div", { key: 'c5075a15c4cb994f5628df2be55c0b01077f20f3', class: "card-outline" }, h("div", { key: '5028c29cb564a77d7e29ea8fa5877da2d93659e3', class: "side side-top" }), h("div", { key: 'e8ce9c8bf2e771ad7862e5127a7d137755f85038', class: "side side-right" }), h("div", { key: '351b74462df5ae239fa0519a4cbd994b5e5c5bac', class: "side side-bottom" }), h("div", { key: 'e0e8bbe59c665db264ed6174d18cb258dfaddc30', class: "side side-left" })), !captureState.showFlipAnimation && !captureState.showSuccessAnimation && (h("div", { key: '6e995dbe5753cdbb54773c519389aa0822c3913a', class: `guide-text ${this.showPerformanceMessage ? 'performance-warning-text' : ''}` }, this.getGuideText(captureState.step))), captureState.step === 'back' && !captureState.showFlipAnimation && !captureState.showSuccessAnimation && (h("div", { key: 'e1a10fcb0e57765247aea911eb24d2c079cde8ee', class: "back-capture-section" }, h("div", { key: '3da2aacdce5badcab9017ea5316a124690773b55', class: "back-capture-buttons" }, (!this.useDocumentDetector || this.performanceDegradedMode || this.showManualCaptureButton) && (h("button", { key: 'e04c02cfa13728d7a771243167e9c94c92e3c934', class: "capture-button primary-button", onClick: () => this.takeManualScreenshot(), type: "button", disabled: this.processingButton !== null }, this.processingButton === 'capture-back' && (h("span", { key: '47759f79990eb34c69e39b2b9f6d71e6c2d8bb33', class: "button-spinner" })), "Capturar Reverso")), h("button", { key: 'e41860634d1df34bfa30c2559fc85322088888ee', class: "skip-button", onClick: () => this.skipBackCapture(), type: "button", disabled: this.processingButton !== null }, this.processingButton === 'skip-back' && (h("span", { key: '44358375377638cd7a7c0699fba5739f38230727', class: "button-spinner" })), this.enableBackDocumentTimer && this.backDocumentTimerRemaining > 0
|
|
20303
20351
|
? `Saltar reverso (${this.backDocumentTimerRemaining}s)`
|
|
20304
|
-
: 'Saltar reverso')))), captureState.isVideoActive && (h("div", { key: '
|
|
20352
|
+
: 'Saltar reverso')))), captureState.isVideoActive && (h("div", { key: '2f3d35c91e490da2cb458f317fb2a7ece836ca01', class: "camera-controls" }, h("button", { key: '21718e9ab6932bb8bd88ca16cc820081b1ed6469', class: `camera-selector-button ${this.isSwitchingCamera ? 'loading' : ''}`, onClick: () => this.toggleCameraSelector(), type: "button", title: "Seleccionar c\u00E1mara", disabled: this.isSwitchingCamera }, this.isSwitchingCamera ? (h("div", { class: "button-spinner" })) : ('Cámaras')))), this.showCameraSelector && cameraInfo.availableCameras.length > 0 && (h("div", { key: '1873af9e9d2ff2761e750713606a3b06295fb2f7', class: "camera-selector-dropdown" }, h("div", { key: 'df3f445f7ff51efe298f070c56dbfdd217397ea0', class: "camera-selector-header" }, h("span", { key: 'f9f33b0c4ed4bf62e18020f54b90f6ce09e923aa' }, "Seleccionar C\u00E1mara"), h("button", { key: '28c29c4c82557c80e42b3f524041ab8e160cfce1', class: "close-selector", onClick: () => this.toggleCameraSelector(), type: "button" }, "\u00D7")), h("div", { key: '95d06551595ca0b7d23ed16c8c4ead633f98ed2f', class: "camera-list" }, cameraInfo.availableCameras.map((camera) => (h("button", { key: camera.id, class: `camera-option ${cameraInfo.selectedCameraId === camera.id ? 'selected' : ''}`, onClick: () => this.handleCameraSwitch(camera.id), type: "button" }, h("span", { class: "camera-label" }, camera.label || `Cámara ${cameraInfo.availableCameras.indexOf(camera) + 1}`, camera.hasAutofocus && (h("span", { class: "autofocus-icon", title: "Autofoco disponible" }, "\u29BF"))), cameraInfo.selectedCameraId === camera.id && (h("span", { class: "selected-indicator" }, "\u2713")))))), h("div", { key: '6844114f4fa6e6a49d1194c4eaac71db4e2c2030', class: "device-info" }, h("small", { key: 'db82272ae5d253dd59fb42326e11ca1d50c70e3e' }, "Dispositivo: ", cameraInfo.deviceType)))), this.showManualCaptureButton && captureState.step === 'front' && !captureState.showFlipAnimation && !captureState.showSuccessAnimation && (h("div", { key: '04bc5e0a469478dab6a5e1e957fa830be15555bc', class: "manual-capture-section" }, h("button", { key: '4fae0d4ca89e718a69143d6167dc3f295bc2fafa', class: "manual-capture-button", onClick: () => this.takeManualScreenshot(), type: "button", disabled: this.processingButton !== null }, this.processingButton === 'capture-front' && (h("span", { key: '5cb26e80c3216ce4940cf24ff1c18e0664a45eb7', class: "button-spinner" })), "Capturar Frente"))))), captureState.isCapturing && (h("div", { key: 'c4e99932aca8940f339aa80d1c9659223d026395', class: "capture-animation" })), captureState.showFlipAnimation && (h("div", { key: '4102bccccbae2163e7bb520761d871e07a30e34d', class: "flip-animation" }, h("div", { key: '1f9cd0f6d54f643251d24553fe6022f9045a50d6', class: "id-card-icon" }), h("div", { key: '1fba0dd3d1b25a1b39f3bda66c8706fd43bf996d', class: "flip-text" }, "\u00A1Voltea tu identificaci\u00F3n!"))), captureState.showSuccessAnimation && (h("div", { key: '08a0df4e7f7dbf5134cc89d2e300c04825b00495', class: "success-animation" }, h("div", { key: 'f94b29abea00c8293da5420981215f929fda19c3', class: "check-icon" }), h("div", { key: '01380c7e83e147bf841540178ba56d705c7f3258', class: "success-text" }, "\u00A1Proceso completado!"))), h("div", { key: '37d9824236643701b13de9d54adf83662625e6d5', class: `component-status status-${this.currentStatus.type}` }, (this.currentStatus.type === 'loading' || this.currentStatus.type === 'initializing') && (h("div", { key: '37d6da93b822edf62161a1657887ae1050d16e29', class: "status-spinner" })), h("div", { key: '6275ed024cbbeb436b7f04e0dd3bb7cfed1a6a9d', class: "status-content" }, h("div", { key: '9c983c432febd71eff737e395e3104711bf8b994', class: "status-message" }, this.currentStatus.message), this.currentStatus.description && (h("div", { key: '721704c457c378f9563cd28e1e52fa35c68636d8', class: "status-description" }, this.currentStatus.description)))), this.debug && (h("div", { key: '0e0ed8e26c2ce73601a88ea74f97da447ad957a3', class: "performance-monitor" }, h("div", { key: 'ce46a8da032a38c4c7e6afaf706af5a7ba258f74', class: "performance-expanded" }, h("div", { key: '50566325fd8e54d9b5146c95a7965b262b5cbe7e', class: "metrics-row" }, h("div", { key: '2c255f1ab96cc0fb3e454b58a37dfe22f6df8ef2', class: "metric-compact" }, h("span", { key: '151e4bbf19f362bf32bb4ec838c5ff858ae5c8e6', class: "metric-label" }, "FPS"), h("span", { key: '4dcf58fd6d13106ca1fdb28331aebf6ff71c7886', class: `metric-value ${this.performanceData.fps < 15 ? 'warning' : this.performanceData.fps < 10 ? 'danger' : 'good'}` }, this.performanceData.fps)), h("div", { key: '58d0745fb27b0b216fd3865e8fac4731811536c8', class: "metric-compact" }, h("span", { key: '0c16975cb5f84351fbad0b6daa6a8d1214f3226e', class: "metric-label" }, "MEM"), h("span", { key: 'cf8edc14a7ad690c80dfaeae4f2eaa0b07f88ca3', class: `metric-value ${this.performanceData.memoryUsage > 100 ? 'warning' : this.performanceData.memoryUsage > 200 ? 'danger' : 'good'}` }, this.performanceData.memoryUsage, "MB"))), h("div", { key: 'c50c14ac229f3a71fc37b256fd5caab77f0c43b2', class: "metrics-row" }, h("div", { key: 'b67d2719f42ae342c791d64a52e702af4d54bdbb', class: "metric-compact" }, h("span", { key: 'c2ecf87d853dc935b1dad5dd77adee52d1c56404', class: "metric-label" }, "INF"), h("span", { key: '86cad05a1846ed3e4e73175acd9a6acabbecb801', class: `metric-value ${this.performanceData.inferenceTime > 100 ? 'warning' : this.performanceData.inferenceTime > 200 ? 'danger' : 'good'}` }, this.performanceData.inferenceTime, "ms")), h("div", { key: '82268593f3edea53553b35d4a7ef4c4677ab56c6', class: "metric-compact" }, h("span", { key: '937ff57182396d280cb753818b62829d73f7ca4d', class: "metric-label" }, "FRAME"), h("span", { key: '6f605b44484ed9e916f16fd50c91e7eb55d45172', class: `metric-value ${this.performanceData.frameProcessingTime > 50 ? 'warning' : this.performanceData.frameProcessingTime > 100 ? 'danger' : 'good'}` }, this.performanceData.frameProcessingTime, "ms"))), h("div", { key: '5c3c1bd6bde1d43338be02d3f711314fc7c9603c', class: "metrics-row" }, h("div", { key: 'bfa796075c5be71dbd8f78471ad2243392561edd', class: "metric-compact" }, h("span", { key: '9c2a2999f7026c96f24ef049c2779b1b63b7759a', class: "metric-label" }, "DET"), h("span", { key: '5ea705bcde4f534d23d23cf1bfbdbf228d394b22', class: "metric-value good" }, this.performanceData.successfulDetections, "/", this.performanceData.totalDetections)), h("div", { key: 'cd73965baaed7267be05bf6a8990707b94ad3761', class: "metric-compact" }, h("span", { key: 'f7ddd8f95353e21c776c31298c4508e0ee9fffc3', class: "metric-label" }, "RATE"), h("span", { key: '2388af4b2ec742889a01b922a44f0d169e747b56', class: `metric-value ${this.performanceData.detectionRate < 30 ? 'danger' : this.performanceData.detectionRate < 60 ? 'warning' : 'good'}` }, this.performanceData.detectionRate, "%")))))), h("div", { key: '822ae802489dc1621a2edebfb513c0966ea1d4b8', class: "watermark" }, h("img", { key: 'bc98d9afb9cb8336bfac25d3f1af3a09f49aafb3', src: "https://static.jaak.ai/commons/powered-by-jaak.png", alt: "Powered by Jaak", onError: (e) => {
|
|
20305
20353
|
const img = e.target;
|
|
20306
20354
|
img.onerror = null;
|
|
20307
20355
|
img.src = POWERED_BY_JAAK_FALLBACK;
|