Help
RSS
API
Feed
Maltego
Contact
Domain > app.onetekcr.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2026-02-23
172.67.135.5
(
ClassC
)
Port 80
HTTP/1.1 200 OKDate: Mon, 23 Feb 2026 03:11:39 GMTContent-Type: text/html; charsetutf-8Transfer-Encoding: chunkedConnection: keep-aliveaccess-control-allow-origin: *Report-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?shUp5ssdjnTqru%2FHEYsiV2Xuf%2Btd4D%2BkJPSIpWTTD4cIt4pKrWEr4tXgXmlg%2FqSx8Vicl4Ya71Orakxpt%2FsTGuG%2FF33%2FXmurWHGDgM3zAAoE%3D}}x-powered-by: Expresscf-cache-status: DYNAMICNel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Server: cloudflareCF-RAY: 9d23897b1ba1c62a-PDXalt-svc: h3:443; ma86400 !DOCTYPE html>html langes>head> meta charsetUTF-8> meta nameviewport contentwidthdevice-width, initial-scale1.0> title>Detalle - ONETEK/title> !-- Fonts --> link relpreconnect hrefhttps://fonts.googleapis.com> link relpreconnect hrefhttps://fonts.gstatic.com crossorigin> link hrefhttps://fonts.googleapis.com/css2?familyInter:wght@300;400;500;600;700;800&displayswap relstylesheet> link relicon typeimage/x-icon href/img/favicon.ico> link relapple-touch-icon href/img/apple-touch-icon.png> link relmanifest href/manifest.json> !-- Ionic --> link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/@ionic/core/css/ionic.bundle.css /> script typemodule srchttps://cdn.jsdelivr.net/npm/@ionic/core/dist/ionic/ionic.esm.js>/script> script nomodule srchttps://cdn.jsdelivr.net/npm/@ionic/core/dist/ionic/ionic.js>/script> script typemodule srchttps://cdn.jsdelivr.net/npm/ionicons@7.1.0/dist/ionicons/ionicons.esm.js>/script> script nomodule srchttps://cdn.jsdelivr.net/npm/ionicons@7.1.0/dist/ionicons/ionicons.js>/script> style> :root { --primary: #3b82f6; --primary-dark: #2563eb; --secondary: #8b5cf6; --success: #10b981; --warning: #f59e0b; --danger: #ef4444; --bg-gradient-start: #f0f9ff; --bg-gradient-end: #e0f2fe; --card-bg: rgba(255, 255, 255, 0.9); --card-border: rgba(191, 219, 254, 0.3); --text-main: #0f172a; --text-secondary: #334155; --text-muted: #64748b; --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } body { font-family: Inter, sans-serif; background: linear-gradient(135deg, var(--bg-gradient-start) 0%, var(--bg-gradient-end) 100%); min-height: 100vh; margin: 0; padding: 0; } ion-content { --background: transparent; } /* Header */ ion-toolbar { --background: rgba(255, 255, 255, 0.8); --border-width: 0; --backdrop-filter: blur(10px); backdrop-filter: blur(10px); border-bottom: 1px solid var(--card-border); } ion-title { color: var(--text-main); font-weight: 700; font-size: 24px; letter-spacing: -0.025em; } ion-buttons ion-back-button { color: var(--text-main); --icon-font-size: 24px; } /* Grid */ .tank-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; padding: 24px 16px; max-width: 1200px; margin: 0 auto; } @media (min-width: 640px) { .tank-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 24px; padding: 32px 24px; } } @media (min-width: 1024px) { .tank-grid { grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); } } /* Card */ .tank-card { background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 24px; padding-top: 25px; display: flex; flex-direction: column; align-items: center; text-align: center; box-shadow: var(--shadow-md); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); position: relative; overflow: hidden; } .tank-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-xl); border-color: rgba(59, 130, 246, 0.3); } .tank-card:active { transform: translateY(-2px); box-shadow: var(--shadow-lg); } /* Enhanced Tank Graphic */ .tank-graphic { width: 120px; height: 160px; border: 3px solid #e2e8f0; border-radius: 20px; position: relative; background: linear-gradient(145deg, #f8fafc, #e2e8f0); overflow: hidden; margin-bottom: 24px; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; } /* Tank Top Cap */ .tank-cap { position: absolute; top: -3px; left: 50%; transform: translateX(-50%); width: 60px; height: 8px; background: linear-gradient(90deg, #64748b, #475569); border-radius: 4px; z-index: 15; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } /* Enhanced Status Indicator */ .status-indicator { position: absolute; top: -8px; right: -8px; width: 16px; height: 16px; background: var(--success); border-radius: 50%; border: 3px solid var(--card-bg); z-index: 20; box-shadow: 0 2px 8px rgba(16, 185, 129, 0.4); animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.7; transform: scale(1.1); } } /* Enhanced Water with Gradient */ .tank-water { position: absolute; bottom: 0; left: 0; width: 100%; height: var(--water-level, 0%); max-height: calc(100% - 15px); --water-top-color: #60a5fa; background: linear-gradient(180deg, var(--water-top-color) 0%, #3b82f6 50%, #2563eb 100%); transition: height 1s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: inset 0 0 20px rgba(37, 99, 235, 0.3), 0 0 20px rgba(59, 130, 246, 0.2); min-height: 8px; border-radius: 0 0 17px 17px; overflow: visible; } /* Wave Animation Layer 1 */ .tank-water::before { content: ; position: absolute; bottom: 100%; left: 0; width: 200%; height: 12px; background-color: var(--water-top-color); opacity: 0.8; -webkit-mask-image: url(data:image/svg+xml,%3Csvg xmlnshttp://www.w3.org/2000/svg viewBox0 0 1000 100 preserveAspectRationone%3E%3Cpath dM0,100 v-50 q250,-30 500,0 t500,0 v50 z /%3E%3C/svg%3E); mask-image: url(data:image/svg+xml,%3Csvg xmlnshttp://www.w3.org/2000/svg viewBox0 0 1000 100 preserveAspectRationone%3E%3Cpath dM0,100 v-50 q250,-30 500,0 t500,0 v50 z /%3E%3C/svg%3E); -webkit-mask-size: 50% 100%; mask-size: 50% 100%; -webkit-mask-repeat: repeat-x; mask-repeat: repeat-x; animation: wave-move 4s linear infinite; margin-bottom: -1px; /* Fix potential gap */ } /* Wave Animation Layer 2 */ .tank-water::after { content: ; position: absolute; bottom: 100%; left: -20%; width: 200%; height: 12px; background-color: var(--water-top-color); opacity: 0.4; -webkit-mask-image: url(data:image/svg+xml,%3Csvg xmlnshttp://www.w3.org/2000/svg viewBox0 0 1000 100 preserveAspectRationone%3E%3Cpath dM0,100 v-50 q250,-30 500,0 t500,0 v50 z /%3E%3C/svg%3E); mask-image: url(data:image/svg+xml,%3Csvg xmlnshttp://www.w3.org/2000/svg viewBox0 0 1000 100 preserveAspectRationone%3E%3Cpath dM0,100 v-50 q250,-30 500,0 t500,0 v50 z /%3E%3C/svg%3E); -webkit-mask-size: 50% 100%; mask-size: 50% 100%; -webkit-mask-repeat: repeat-x; mask-repeat: repeat-x; animation: wave-move 6s linear infinite reverse; margin-bottom: -1px; } @keyframes wave-move { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } } /* Tank Info */ .tank-name { font-size: 18px; font-weight: 700; color: var(--text-main); margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.025em; line-height: 1.3; } .tank-id { font-size: 13px; color: var(--text-muted); margin-bottom: 16px; font-family: Monaco, Consolas, monospace; font-weight: 500; background: rgba(241, 245, 249, 0.6); padding: 4px 8px; border-radius: 6px; border: 1px solid rgba(226, 232, 240, 0.5); } .tank-percent { position: absolute; bottom: 15px; left: 50%; transform: translateX(-50%); font-size: 20px; font-weight: 700; color: #ffffff; z-index: 30; text-shadow: 0 1px 3px rgba(0,0,0,0.3); margin: 0; pointer-events: none; } /* Status Bar */ .status-bar { width: 100%; height: 8px; background: #e2e8f0; border-radius: 4px; overflow: hidden; margin-top: 16px; box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .status-fill { height: 100%; width: var(--water-level, 0%); background: linear-gradient(90deg, var(--primary), var(--primary-dark)); border-radius: 4px; transition: width 1s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: 0 1px 2px rgba(59, 130, 246, 0.3); } /* Enhanced Status States */ .tank-card.warning-level { border-color: rgba(245, 158, 11, 0.3); } .tank-card.warning-level .tank-percent { background: linear-gradient(135deg, var(--warning), #d97706); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .tank-card.warning-level .status-indicator { background: var(--warning); box-shadow: 0 2px 8px rgba(245, 158, 11, 0.4); animation: pulse-warning 2s infinite; } .tank-card.warning-level .tank-water { --water-top-color: #fbbf24; background: linear-gradient(180deg, var(--water-top-color) 0%, #f59e0b 50%, #d97706 100%); } .tank-card.warning-level .status-fill { background: linear-gradient(90deg, var(--warning), #d97706); } @keyframes pulse-warning { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.7; transform: scale(1.1); } } .tank-card.low-level { border-color: rgba(239, 68, 68, 0.3); } .tank-card.low-level .status-indicator { background: var(--danger); box-shadow: 0 2px 8px rgba(239, 68, 68, 0.4); animation: pulse-danger 1.5s infinite; } .tank-card.low-level .tank-water { --water-top-color: #f87171; background: linear-gradient(180deg, var(--water-top-color) 0%, #ef4444 50%, #dc2626 100%); } .tank-card.low-level .status-fill { background: linear-gradient(90deg, var(--danger), #dc2626); } @keyframes pulse-danger { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.8; transform: scale(1.15); } } /* Empty State */ .empty-state { grid-column: 1 / -1; text-align: center; padding: 60px 40px; color: var(--text-muted); background: var(--card-bg); border-radius: 24px; border: 2px dashed var(--card-border); box-shadow: var(--shadow-sm); } .empty-state ion-icon { font-size: 64px; margin-bottom: 24px; opacity: 0.3; color: var(--primary); } .empty-state h3 { font-size: 20px; font-weight: 600; color: var(--text-secondary); margin-bottom: 8px; } .empty-state p { font-size: 16px; color: var(--text-muted); margin: 0; } /* Responsive Design */ @media (max-width: 639px) { .tank-grid { gap: 16px; padding: 20px 16px; } .tank-graphic { width: 100px; height: 140px; } .tank-percent { font-size: 28px; } } /* Loading Animation */ .tank-card.loading .tank-water { animation: loading 2s infinite; } @keyframes loading { 0%, 100% { height: 20%; } 50% { height: 80%; } } /* Loading Overlay */ #loading-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.9); backdrop-filter: blur(5px); z-index: 9999; display: flex; flex-direction: column; justify-content: center; align-items: center; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; } #loading-overlay.visible { opacity: 1; pointer-events: all; } #loading-overlay p { margin-top: 20px; color: var(--primary); font-weight: 500; font-size: 18px; } /* Maintenance Card Styles */ .tank-card.maintenance { background-color: #f1f5f9; border-color: #cbd5e1; opacity: 0.9; } .tank-card.maintenance .tank-name { color: #64748b; } .tank-card.maintenance .tank-id { background: #e2e8f0; color: #64748b; } .maintenance-ribbon-wrapper { position: absolute; top: 0; left: 0; width: 100px; height: 100px; overflow: hidden; z-index: 10; } .maintenance-ribbon { position: absolute; top: 30px; left: -28px; width: 140px; background-color: #64748b; color: white; text-align: center; font-size: 10px; font-weight: 800; padding: 5px 0; transform: rotate(-45deg); box-shadow: 0 2px 4px rgba(0,0,0,0.2); letter-spacing: 1px; text-transform: uppercase; } /style> script> document.addEventListener(DOMContentLoaded, function () { const tankCards document.querySelectorAll(.tank-card); tankCards.forEach(card > { card.addEventListener(mouseenter, function () { const water this.querySelector(.tank-water); const percent parseFloat(water.dataset.percent); // Add subtle animation on hover if (percent > 0) { water.style.transform scale(1.02); setTimeout(() > { water.style.transform scale(1); }, 200); } }); }); // Register Service Worker if (serviceWorker in navigator) { window.addEventListener(load, function () { navigator.serviceWorker.register(/sw.js).then(function (registration) { console.log(ServiceWorker registration successful with scope: , registration.scope); }, function (err) { console.log(ServiceWorker registration failed: , err); }); }); } });/script>/head>body> ion-app> ion-header> ion-toolbar> ion-title classion-text-center> img src/logo.svg altOnetek styleheight: 50px; vertical-align: middle;> /ion-title> /ion-toolbar> /ion-header> ion-content> div classtank-grid> div classtank-card > p stylemargin-top: -20px; margin-bottom: 20px; font-size: 12px;> 48CA433DB928 /p> div classtank-graphic> div classstatus-indicator>/div> div classtank-cap>/div> div classtank-water styleheight: 92%; data-percent92>/div> div classtank-percent> 92% /div> /div> div classtank-name>T. OFICINA/div> /div> div classtank-card > p stylemargin-top: -20px; margin-bottom: 20px; font-size: 12px;> F09E9E765E58 /p> div classtank-graphic> div classstatus-indicator>/div> div classtank-cap>/div> div classtank-water styleheight: 99%; data-percent99>/div> div classtank-percent> 99% /div> /div> div classtank-name>T. BETO/div> /div> /div> /ion-content> ion-footer classion-no-border> ion-toolbar styletext-align: center;> img srchttps://base.onetekcr.com/api/files/asadas/ofb9kb6tvwc6jkl/logo_yhwi4n6iwe.png altLogo Cliente styleheight: 30px; object-fit: contain;> /ion-toolbar> /ion-footer> /ion-app> div idloading-overlay> ion-spinner namecrescent colorprimary styletransform: scale(1.5);>/ion-spinner> p>Regresando.../p> /div> script> function updateDevices() { const asadaId ofb9kb6tvwc6jkl; fetch(/api/detail/ + asadaId + /update, { method: POST, headers: { Content-Type: application/json } }) .then(response > response.json()) .then(data > { if (data.devices) { const grid document.querySelector(.tank-grid); let html ; if (data.devices.length > 0) { data.devices.forEach(device > { let showMaintenance false; if (device.status mantenimento) { showMaintenance true; } else { if (device.ultimaHORA) { const nowString new Date().toLocaleString(en-US, { timeZone: America/Costa_Rica }); const nowCR new Date(nowString); const lastReadingString device.ultimaHORA.replace(Z, ); const lastReadingCR new Date(lastReadingString); const diffMinutes (nowCR - lastReadingCR) / 1000 / 60; if (isNaN(diffMinutes) || diffMinutes > 15) { showMaintenance true; } } else { showMaintenance true; } } if (showMaintenance) { html + ` div classtank-card maintenance> div classmaintenance-ribbon-wrapper> div classmaintenance-ribbon>MANTENIMIENTO/div> /div> div styleflex-grow: 1; display: flex; align-items: center; justify-content: center; height: 160px; margin-bottom: 24px;> ion-icon nameconstruct-outline stylefont-size: 64px; color: #cbd5e1;>/ion-icon> /div> p stylemargin-top: -20px; font-size: 12px; margin-bottom: 5px;>${device.id}/p> div classtank-name>${device.name ? device.name.replace(TANQUE , TANQUE br>) : TANQUE}/div> /div> `; } else { let percent 0; let statusClass ; if (device.altura && device.altura > 0) { const alturaUtil parseFloat(device.altura); const promedio parseFloat(device.lectura); const revalse parseFloat(device.revalse || 0); const distanciaAjustada promedio - revalse; const distanciaFinal distanciaAjustada 0 ? 0 : distanciaAjustada; const nivelAgua alturaUtil - distanciaFinal; percent Math.min(Math.max((nivelAgua / alturaUtil) * 100, 0), 100); if (percent 20) { statusClass low-level; } else if (percent 40) { statusClass warning-level; } } html + ` div classtank-card ${statusClass}> p stylemargin-top: -20px; margin-bottom: 20px; font-size: 12px;>${device.id}/p> div classtank-graphic> div classstatus-indicator>/div> div classtank-cap>/div> div classtank-water styleheight: ${Math.round(percent)}%; data-percent${Math.round(percent)}>/div> div classtank-percent>${Math.round(percent)}%/div> /div> div classtank-name>${device.name ? device.name.replace(TANQUE , TANQUE br>) : TANQUE}/div> /div> `; } }); } else { html ` div classempty-state> ion-icon namewater-outline>/ion-icon> h3>Sin Dispositivos/h3> p>No hay tanques registrados en el sistema/p> /div> `; } grid.innerHTML html; } }) .catch(error > console.error(Error updating devices:, error)); } setInterval(updateDevices, 10000); function navigateBack() { const overlay document.getElementById(loading-overlay); overlay.style.display flex; // Forzamos un reflow overlay.offsetHeight; overlay.classList.add(visible); setTimeout(() > { window.location.href /; }, 3000); } // Ocultar loader si se usa el botón de atrás del navegador window.addEventListener(pageshow, (event) > { const overlay document.getElementById(loading-overlay); if (overlay.style.display flex) { overlay.classList.remove(visible); setTimeout(() > { overlay.style.display none; }, 300); } }); /script>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Mon, 23 Feb 2026 03:11:40 GMTContent-Type: text/html; charsetutf-8Transfer-Encoding: chunkedConnection: keep-aliveaccess-control-allow-origin: *Report-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?sJFppD6Wo0uy0D%2FcIAG8SG1BxCJc%2Ffa1P1SSWsQcU2WNjOd70wvU16ohVaDIOVL9u3KoUufDh%2Bt%2FZaU4WikIplAYp%2B31tZUZfo1dUEw9fjmQ%3D}}x-powered-by: Expresscf-cache-status: DYNAMICNel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Server: cloudflareCF-RAY: 9d238982fa7fb84b-PDXalt-svc: h3:443; ma86400 !DOCTYPE html>html langes>head> meta charsetUTF-8> meta nameviewport contentwidthdevice-width, initial-scale1.0> title>Detalle - ONETEK/title> !-- Fonts --> link relpreconnect hrefhttps://fonts.googleapis.com> link relpreconnect hrefhttps://fonts.gstatic.com crossorigin> link hrefhttps://fonts.googleapis.com/css2?familyInter:wght@300;400;500;600;700;800&displayswap relstylesheet> link relicon typeimage/x-icon href/img/favicon.ico> link relapple-touch-icon href/img/apple-touch-icon.png> link relmanifest href/manifest.json> !-- Ionic --> link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/@ionic/core/css/ionic.bundle.css /> script typemodule srchttps://cdn.jsdelivr.net/npm/@ionic/core/dist/ionic/ionic.esm.js>/script> script nomodule srchttps://cdn.jsdelivr.net/npm/@ionic/core/dist/ionic/ionic.js>/script> script typemodule srchttps://cdn.jsdelivr.net/npm/ionicons@7.1.0/dist/ionicons/ionicons.esm.js>/script> script nomodule srchttps://cdn.jsdelivr.net/npm/ionicons@7.1.0/dist/ionicons/ionicons.js>/script> style> :root { --primary: #3b82f6; --primary-dark: #2563eb; --secondary: #8b5cf6; --success: #10b981; --warning: #f59e0b; --danger: #ef4444; --bg-gradient-start: #f0f9ff; --bg-gradient-end: #e0f2fe; --card-bg: rgba(255, 255, 255, 0.9); --card-border: rgba(191, 219, 254, 0.3); --text-main: #0f172a; --text-secondary: #334155; --text-muted: #64748b; --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } body { font-family: Inter, sans-serif; background: linear-gradient(135deg, var(--bg-gradient-start) 0%, var(--bg-gradient-end) 100%); min-height: 100vh; margin: 0; padding: 0; } ion-content { --background: transparent; } /* Header */ ion-toolbar { --background: rgba(255, 255, 255, 0.8); --border-width: 0; --backdrop-filter: blur(10px); backdrop-filter: blur(10px); border-bottom: 1px solid var(--card-border); } ion-title { color: var(--text-main); font-weight: 700; font-size: 24px; letter-spacing: -0.025em; } ion-buttons ion-back-button { color: var(--text-main); --icon-font-size: 24px; } /* Grid */ .tank-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; padding: 24px 16px; max-width: 1200px; margin: 0 auto; } @media (min-width: 640px) { .tank-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 24px; padding: 32px 24px; } } @media (min-width: 1024px) { .tank-grid { grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); } } /* Card */ .tank-card { background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 24px; padding-top: 25px; display: flex; flex-direction: column; align-items: center; text-align: center; box-shadow: var(--shadow-md); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); position: relative; overflow: hidden; } .tank-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-xl); border-color: rgba(59, 130, 246, 0.3); } .tank-card:active { transform: translateY(-2px); box-shadow: var(--shadow-lg); } /* Enhanced Tank Graphic */ .tank-graphic { width: 120px; height: 160px; border: 3px solid #e2e8f0; border-radius: 20px; position: relative; background: linear-gradient(145deg, #f8fafc, #e2e8f0); overflow: hidden; margin-bottom: 24px; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; } /* Tank Top Cap */ .tank-cap { position: absolute; top: -3px; left: 50%; transform: translateX(-50%); width: 60px; height: 8px; background: linear-gradient(90deg, #64748b, #475569); border-radius: 4px; z-index: 15; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } /* Enhanced Status Indicator */ .status-indicator { position: absolute; top: -8px; right: -8px; width: 16px; height: 16px; background: var(--success); border-radius: 50%; border: 3px solid var(--card-bg); z-index: 20; box-shadow: 0 2px 8px rgba(16, 185, 129, 0.4); animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.7; transform: scale(1.1); } } /* Enhanced Water with Gradient */ .tank-water { position: absolute; bottom: 0; left: 0; width: 100%; height: var(--water-level, 0%); max-height: calc(100% - 15px); --water-top-color: #60a5fa; background: linear-gradient(180deg, var(--water-top-color) 0%, #3b82f6 50%, #2563eb 100%); transition: height 1s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: inset 0 0 20px rgba(37, 99, 235, 0.3), 0 0 20px rgba(59, 130, 246, 0.2); min-height: 8px; border-radius: 0 0 17px 17px; overflow: visible; } /* Wave Animation Layer 1 */ .tank-water::before { content: ; position: absolute; bottom: 100%; left: 0; width: 200%; height: 12px; background-color: var(--water-top-color); opacity: 0.8; -webkit-mask-image: url(data:image/svg+xml,%3Csvg xmlnshttp://www.w3.org/2000/svg viewBox0 0 1000 100 preserveAspectRationone%3E%3Cpath dM0,100 v-50 q250,-30 500,0 t500,0 v50 z /%3E%3C/svg%3E); mask-image: url(data:image/svg+xml,%3Csvg xmlnshttp://www.w3.org/2000/svg viewBox0 0 1000 100 preserveAspectRationone%3E%3Cpath dM0,100 v-50 q250,-30 500,0 t500,0 v50 z /%3E%3C/svg%3E); -webkit-mask-size: 50% 100%; mask-size: 50% 100%; -webkit-mask-repeat: repeat-x; mask-repeat: repeat-x; animation: wave-move 4s linear infinite; margin-bottom: -1px; /* Fix potential gap */ } /* Wave Animation Layer 2 */ .tank-water::after { content: ; position: absolute; bottom: 100%; left: -20%; width: 200%; height: 12px; background-color: var(--water-top-color); opacity: 0.4; -webkit-mask-image: url(data:image/svg+xml,%3Csvg xmlnshttp://www.w3.org/2000/svg viewBox0 0 1000 100 preserveAspectRationone%3E%3Cpath dM0,100 v-50 q250,-30 500,0 t500,0 v50 z /%3E%3C/svg%3E); mask-image: url(data:image/svg+xml,%3Csvg xmlnshttp://www.w3.org/2000/svg viewBox0 0 1000 100 preserveAspectRationone%3E%3Cpath dM0,100 v-50 q250,-30 500,0 t500,0 v50 z /%3E%3C/svg%3E); -webkit-mask-size: 50% 100%; mask-size: 50% 100%; -webkit-mask-repeat: repeat-x; mask-repeat: repeat-x; animation: wave-move 6s linear infinite reverse; margin-bottom: -1px; } @keyframes wave-move { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } } /* Tank Info */ .tank-name { font-size: 18px; font-weight: 700; color: var(--text-main); margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.025em; line-height: 1.3; } .tank-id { font-size: 13px; color: var(--text-muted); margin-bottom: 16px; font-family: Monaco, Consolas, monospace; font-weight: 500; background: rgba(241, 245, 249, 0.6); padding: 4px 8px; border-radius: 6px; border: 1px solid rgba(226, 232, 240, 0.5); } .tank-percent { position: absolute; bottom: 15px; left: 50%; transform: translateX(-50%); font-size: 20px; font-weight: 700; color: #ffffff; z-index: 30; text-shadow: 0 1px 3px rgba(0,0,0,0.3); margin: 0; pointer-events: none; } /* Status Bar */ .status-bar { width: 100%; height: 8px; background: #e2e8f0; border-radius: 4px; overflow: hidden; margin-top: 16px; box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .status-fill { height: 100%; width: var(--water-level, 0%); background: linear-gradient(90deg, var(--primary), var(--primary-dark)); border-radius: 4px; transition: width 1s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: 0 1px 2px rgba(59, 130, 246, 0.3); } /* Enhanced Status States */ .tank-card.warning-level { border-color: rgba(245, 158, 11, 0.3); } .tank-card.warning-level .tank-percent { background: linear-gradient(135deg, var(--warning), #d97706); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .tank-card.warning-level .status-indicator { background: var(--warning); box-shadow: 0 2px 8px rgba(245, 158, 11, 0.4); animation: pulse-warning 2s infinite; } .tank-card.warning-level .tank-water { --water-top-color: #fbbf24; background: linear-gradient(180deg, var(--water-top-color) 0%, #f59e0b 50%, #d97706 100%); } .tank-card.warning-level .status-fill { background: linear-gradient(90deg, var(--warning), #d97706); } @keyframes pulse-warning { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.7; transform: scale(1.1); } } .tank-card.low-level { border-color: rgba(239, 68, 68, 0.3); } .tank-card.low-level .status-indicator { background: var(--danger); box-shadow: 0 2px 8px rgba(239, 68, 68, 0.4); animation: pulse-danger 1.5s infinite; } .tank-card.low-level .tank-water { --water-top-color: #f87171; background: linear-gradient(180deg, var(--water-top-color) 0%, #ef4444 50%, #dc2626 100%); } .tank-card.low-level .status-fill { background: linear-gradient(90deg, var(--danger), #dc2626); } @keyframes pulse-danger { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.8; transform: scale(1.15); } } /* Empty State */ .empty-state { grid-column: 1 / -1; text-align: center; padding: 60px 40px; color: var(--text-muted); background: var(--card-bg); border-radius: 24px; border: 2px dashed var(--card-border); box-shadow: var(--shadow-sm); } .empty-state ion-icon { font-size: 64px; margin-bottom: 24px; opacity: 0.3; color: var(--primary); } .empty-state h3 { font-size: 20px; font-weight: 600; color: var(--text-secondary); margin-bottom: 8px; } .empty-state p { font-size: 16px; color: var(--text-muted); margin: 0; } /* Responsive Design */ @media (max-width: 639px) { .tank-grid { gap: 16px; padding: 20px 16px; } .tank-graphic { width: 100px; height: 140px; } .tank-percent { font-size: 28px; } } /* Loading Animation */ .tank-card.loading .tank-water { animation: loading 2s infinite; } @keyframes loading { 0%, 100% { height: 20%; } 50% { height: 80%; } } /* Loading Overlay */ #loading-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.9); backdrop-filter: blur(5px); z-index: 9999; display: flex; flex-direction: column; justify-content: center; align-items: center; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; } #loading-overlay.visible { opacity: 1; pointer-events: all; } #loading-overlay p { margin-top: 20px; color: var(--primary); font-weight: 500; font-size: 18px; } /* Maintenance Card Styles */ .tank-card.maintenance { background-color: #f1f5f9; border-color: #cbd5e1; opacity: 0.9; } .tank-card.maintenance .tank-name { color: #64748b; } .tank-card.maintenance .tank-id { background: #e2e8f0; color: #64748b; } .maintenance-ribbon-wrapper { position: absolute; top: 0; left: 0; width: 100px; height: 100px; overflow: hidden; z-index: 10; } .maintenance-ribbon { position: absolute; top: 30px; left: -28px; width: 140px; background-color: #64748b; color: white; text-align: center; font-size: 10px; font-weight: 800; padding: 5px 0; transform: rotate(-45deg); box-shadow: 0 2px 4px rgba(0,0,0,0.2); letter-spacing: 1px; text-transform: uppercase; } /style> script> document.addEventListener(DOMContentLoaded, function () { const tankCards document.querySelectorAll(.tank-card); tankCards.forEach(card > { card.addEventListener(mouseenter, function () { const water this.querySelector(.tank-water); const percent parseFloat(water.dataset.percent); // Add subtle animation on hover if (percent > 0) { water.style.transform scale(1.02); setTimeout(() > { water.style.transform scale(1); }, 200); } }); }); // Register Service Worker if (serviceWorker in navigator) { window.addEventListener(load, function () { navigator.serviceWorker.register(/sw.js).then(function (registration) { console.log(ServiceWorker registration successful with scope: , registration.scope); }, function (err) { console.log(ServiceWorker registration failed: , err); }); }); } });/script>/head>body> ion-app> ion-header> ion-toolbar> ion-title classion-text-center> img src/logo.svg altOnetek styleheight: 50px; vertical-align: middle;> /ion-title> /ion-toolbar> /ion-header> ion-content> div classtank-grid> div classtank-card > p stylemargin-top: -20px; margin-bottom: 20px; font-size: 12px;> 48CA433DB928 /p> div classtank-graphic> div classstatus-indicator>/div> div classtank-cap>/div> div classtank-water styleheight: 92%; data-percent92>/div> div classtank-percent> 92% /div> /div> div classtank-name>T. OFICINA/div> /div> div classtank-card > p stylemargin-top: -20px; margin-bottom: 20px; font-size: 12px;> F09E9E765E58 /p> div classtank-graphic> div classstatus-indicator>/div> div classtank-cap>/div> div classtank-water styleheight: 99%; data-percent99>/div> div classtank-percent> 99% /div> /div> div classtank-name>T. BETO/div> /div> /div> /ion-content> ion-footer classion-no-border> ion-toolbar styletext-align: center;> img srchttps://base.onetekcr.com/api/files/asadas/ofb9kb6tvwc6jkl/logo_yhwi4n6iwe.png altLogo Cliente styleheight: 30px; object-fit: contain;> /ion-toolbar> /ion-footer> /ion-app> div idloading-overlay> ion-spinner namecrescent colorprimary styletransform: scale(1.5);>/ion-spinner> p>Regresando.../p> /div> script> function updateDevices() { const asadaId ofb9kb6tvwc6jkl; fetch(/api/detail/ + asadaId + /update, { method: POST, headers: { Content-Type: application/json } }) .then(response > response.json()) .then(data > { if (data.devices) { const grid document.querySelector(.tank-grid); let html ; if (data.devices.length > 0) { data.devices.forEach(device > { let showMaintenance false; if (device.status mantenimento) { showMaintenance true; } else { if (device.ultimaHORA) { const nowString new Date().toLocaleString(en-US, { timeZone: America/Costa_Rica }); const nowCR new Date(nowString); const lastReadingString device.ultimaHORA.replace(Z, ); const lastReadingCR new Date(lastReadingString); const diffMinutes (nowCR - lastReadingCR) / 1000 / 60; if (isNaN(diffMinutes) || diffMinutes > 15) { showMaintenance true; } } else { showMaintenance true; } } if (showMaintenance) { html + ` div classtank-card maintenance> div classmaintenance-ribbon-wrapper> div classmaintenance-ribbon>MANTENIMIENTO/div> /div> div styleflex-grow: 1; display: flex; align-items: center; justify-content: center; height: 160px; margin-bottom: 24px;> ion-icon nameconstruct-outline stylefont-size: 64px; color: #cbd5e1;>/ion-icon> /div> p stylemargin-top: -20px; font-size: 12px; margin-bottom: 5px;>${device.id}/p> div classtank-name>${device.name ? device.name.replace(TANQUE , TANQUE br>) : TANQUE}/div> /div> `; } else { let percent 0; let statusClass ; if (device.altura && device.altura > 0) { const alturaUtil parseFloat(device.altura); const promedio parseFloat(device.lectura); const revalse parseFloat(device.revalse || 0); const distanciaAjustada promedio - revalse; const distanciaFinal distanciaAjustada 0 ? 0 : distanciaAjustada; const nivelAgua alturaUtil - distanciaFinal; percent Math.min(Math.max((nivelAgua / alturaUtil) * 100, 0), 100); if (percent 20) { statusClass low-level; } else if (percent 40) { statusClass warning-level; } } html + ` div classtank-card ${statusClass}> p stylemargin-top: -20px; margin-bottom: 20px; font-size: 12px;>${device.id}/p> div classtank-graphic> div classstatus-indicator>/div> div classtank-cap>/div> div classtank-water styleheight: ${Math.round(percent)}%; data-percent${Math.round(percent)}>/div> div classtank-percent>${Math.round(percent)}%/div> /div> div classtank-name>${device.name ? device.name.replace(TANQUE , TANQUE br>) : TANQUE}/div> /div> `; } }); } else { html ` div classempty-state> ion-icon namewater-outline>/ion-icon> h3>Sin Dispositivos/h3> p>No hay tanques registrados en el sistema/p> /div> `; } grid.innerHTML html; } }) .catch(error > console.error(Error updating devices:, error)); } setInterval(updateDevices, 10000); function navigateBack() { const overlay document.getElementById(loading-overlay); overlay.style.display flex; // Forzamos un reflow overlay.offsetHeight; overlay.classList.add(visible); setTimeout(() > { window.location.href /; }, 3000); } // Ocultar loader si se usa el botón de atrás del navegador window.addEventListener(pageshow, (event) > { const overlay document.getElementById(loading-overlay); if (overlay.style.display flex) { overlay.classList.remove(visible); setTimeout(() > { overlay.style.display none; }, 300); } }); /script>/body>/html>
Subdomains
Date
Domain
IP
api.onetekcr.com
2026-02-16
172.67.135.5
app.onetekcr.com
2026-02-23
172.67.135.5
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]