{"id":2078,"date":"2026-05-29T09:59:55","date_gmt":"2026-05-29T09:59:55","guid":{"rendered":"https:\/\/aiper.com\/blogs\/?page_id=2078"},"modified":"2026-11-04T09:49:12","modified_gmt":"2026-11-04T09:49:12","slug":"calculadora-superficie-piscina","status":"publish","type":"page","link":"https:\/\/aiper.com\/blogs\/es\/calculadora-superficie-piscina\/","title":{"rendered":"Calculadora de superficie de piscina"},"content":{"rendered":"\n<style>\n    :root {\n        --psac-teal: #1ecad3;\n        --psac-teal-dark: #17a8b0;\n        --psac-teal-light: #e8fafb;\n        --psac-bg: #f7f8fa;\n        --psac-card: #ffffff;\n        --psac-text: #1a1a2e;\n        --psac-text-light: #4a5568;\n        --psac-text-muted: #8896a6;\n        --psac-border: #e2e8f0;\n        --psac-border-active: #1ecad3;\n        --psac-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);\n        --psac-shadow-lg: 0 8px 30px rgba(0, 0, 0, 0.08);\n        --psac-radius: 14px;\n        --psac-radius-sm: 10px;\n        --psac-radius-xs: 7px;\n        --psac-transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n        --psac-font: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n        --psac-danger: #e53e3e;\n        --psac-disabled-bg: #f1f5f9;\n        --psac-disabled-text: #b0bec5;\n    }\n\n    .psac-wrap {\n        font-family: var(--psac-font);\n        max-width: 920px;\n        margin: 30px auto;\n        padding: 30px 28px;\n        background: #fff;\n        border-radius: 18px;\n        box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06);\n        color: var(--psac-text);\n        box-sizing: border-box;\n        line-height: 1.5;\n        -webkit-font-smoothing: antialiased;\n    }\n    .psac-wrap *, .psac-wrap *::before, .psac-wrap *::after { box-sizing: border-box; }\n    .psac-step { margin-bottom: 32px; }\n    .psac-step-header { display: flex; align-items: center; gap: 12px; margin-bottom: 18px; }\n    .psac-step-num { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 50%; background: var(--psac-teal); color: #fff; font-size: 14px; font-weight: 700; flex-shrink: 0; }\n    .psac-step-title { font-size: 17px; font-weight: 700; color: var(--psac-text); letter-spacing: -0.2px; }\n    .psac-step-subtitle { font-size: 12px; color: var(--psac-text-muted); font-weight: 400; margin-top: -1px; }\n    .psac-shape-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }\n    @media (max-width: 700px) { .psac-shape-grid { grid-template-columns: repeat(2, 1fr); } }\n    @media (max-width: 420px) { .psac-shape-grid { grid-template-columns: 1fr 1fr; gap: 8px; } .psac-wrap { padding: 16px 12px; margin: 12px; } }\n    .psac-shape-card { border: 2px solid var(--psac-border); border-radius: var(--psac-radius-sm); padding: 14px 8px; text-align: center; cursor: pointer; transition: all var(--psac-transition); background: #fff; display: flex; flex-direction: column; align-items: center; gap: 7px; min-height: 105px; justify-content: center; -webkit-tap-highlight-color: transparent; outline: none; user-select: none; }\n    .psac-shape-card:hover:not(.psac-disabled) { border-color: var(--psac-teal); background: var(--psac-teal-light); transform: translateY(-2px); box-shadow: 0 4px 16px rgba(30, 202, 211, 0.12); }\n    .psac-shape-card.psac-active { border-color: var(--psac-teal); background: #e0f7f9; box-shadow: 0 0 0 3px rgba(30, 202, 211, 0.14); font-weight: 600; }\n    .psac-shape-card.psac-disabled { opacity: 0.4; cursor: not-allowed; background: var(--psac-disabled-bg); pointer-events: none; }\n    .psac-shape-icon { width: 44px; height: 40px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n    .psac-shape-icon svg { width: 100%; height: 100%; }\n    .psac-shape-label { font-size: 12.5px; font-weight: 500; color: var(--psac-text); line-height: 1.2; letter-spacing: -0.1px; }\n    .psac-type-row { display: flex; gap: 12px; flex-wrap: wrap; max-width: 480px; }\n    .psac-type-card { flex: 1; min-width: 150px; padding: 14px 18px; border: 2px solid var(--psac-border); border-radius: var(--psac-radius-sm); background: #fff; cursor: pointer; text-align: center; transition: all var(--psac-transition); -webkit-tap-highlight-color: transparent; outline: none; user-select: none; display: flex; flex-direction: column; align-items: center; gap: 5px; justify-content: center; }\n    .psac-type-card:hover:not(.psac-disabled) { border-color: var(--psac-teal); background: var(--psac-teal-light); }\n    .psac-type-card.psac-active { border-color: var(--psac-teal); background: #e0f7f9; box-shadow: 0 0 0 3px rgba(30, 202, 211, 0.14); }\n    .psac-type-card.psac-disabled { background: var(--psac-disabled-bg); color: var(--psac-disabled-text); cursor: not-allowed; border-color: var(--psac-border); opacity: 0.5; pointer-events: none; text-decoration: line-through; text-decoration-color: #cbd5e0; text-decoration-thickness: 1px; }\n    .psac-type-label { font-size: 14px; font-weight: 600; color: var(--psac-text); letter-spacing: -0.1px; }\n    .psac-type-note { font-size: 12px; color: var(--psac-text-muted); margin-top: 8px; font-style: italic; }\n    .psac-unit-toggle-row { display: flex; align-items: center; gap: 10px; margin-bottom: 16px; flex-wrap: wrap; }\n    .psac-unit-toggle-label { font-size: 12px; font-weight: 600; color: var(--psac-text-light); text-transform: uppercase; letter-spacing: 0.4px; }\n    .psac-unit-pills { display: inline-flex; background: #f1f5f9; border-radius: 30px; padding: 4px; border: 1px solid var(--psac-border); }\n    .psac-unit-pill { border: none; background: transparent; padding: 7px 17px; border-radius: 30px; cursor: pointer; font-size: 13px; font-weight: 500; color: #64748b; transition: all var(--psac-transition); -webkit-tap-highlight-color: transparent; outline: none; white-space: nowrap; }\n    .psac-unit-pill.psac-active-pill { background: var(--psac-teal); color: #fff; font-weight: 600; }\n    .psac-inputs-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 13px; }\n    @media (max-width: 500px) { .psac-inputs-grid { grid-template-columns: 1fr 1fr; } }\n    .psac-field { display: flex; flex-direction: column; gap: 4px; }\n    .psac-field label { font-size: 12px; font-weight: 600; color: var(--psac-text-light); text-transform: uppercase; letter-spacing: 0.3px; }\n    .psac-field input { width: 100%; padding: 10px 13px; border: 2px solid var(--psac-border); border-radius: var(--psac-radius-xs); font-size: 15px; font-family: var(--psac-font); transition: border var(--psac-transition); background: #fafbfc; color: var(--psac-text); outline: none; }\n    .psac-field input:focus { border-color: var(--psac-teal); box-shadow: 0 0 0 3px rgba(30, 202, 211, 0.08); background: #fff; }\n    .psac-calc-btn { display: block; width: 100%; max-width: 300px; margin: 26px auto 0; padding: 14px 32px; background: var(--psac-teal); color: #fff; border: none; border-radius: 999px; font-size: 16px; font-weight: 700; cursor: pointer; letter-spacing: 0.4px; transition: all var(--psac-transition); text-transform: uppercase; box-shadow: 0 4px 16px rgba(30, 202, 211, 0.28); }\n    .psac-error { color: var(--psac-danger); font-size: 13px; font-weight: 600; text-align: center; margin-top: 10px; padding: 8px 14px; background: #fef2f2; border-radius: var(--psac-radius-xs); border: 1px solid #fecaca; display: none; }\n    .psac-result-wrap { margin-top: 28px; display: none; }\n    .psac-result-card { padding: 24px 22px; background: linear-gradient(135deg, #eafdfd 0%, #f5fefe 100%); border-radius: var(--psac-radius); border: 1px solid #b8e8eb; }\n    .psac-result-header { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px; margin-bottom: 18px; }\n    .psac-result-title { font-size: 16px; font-weight: 700; color: #0e7a82; letter-spacing: -0.2px; }\n    .psac-result-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 12px; margin-bottom: 18px; }\n    .psac-result-item { background: #fff; border-radius: var(--psac-radius-sm); padding: 14px 12px; text-align: center; border: 1px solid #e0eeef; }\n    .psac-result-value { font-size: 24px; font-weight: 700; color: var(--psac-teal-dark); letter-spacing: -0.4px; line-height: 1.1; display: block; }\n    .psac-result-label { font-size: 11px; font-weight: 600; color: var(--psac-text-muted); margin-top: 3px; text-transform: uppercase; letter-spacing: 0.4px; }\n    .psac-finish-note { font-size: 10.5px; color: #64748b; font-weight: 500; margin-top: 2px; }\n    .psac-material-text { background: #fff; border-radius: var(--psac-radius-sm); padding: 14px 16px; border: 1px solid #d1e8ea; font-size: 14px; color: var(--psac-text-light); line-height: 1.6; margin-bottom: 18px; }\n    .psac-material-text strong { color: var(--psac-teal-dark); font-weight: 700; }\n    .psac-reco-section { margin-top: 16px; border-top: 1px solid #c9e6e9; padding-top: 16px; }\n    .psac-reco-title { font-size: 14px; font-weight: 700; color: #0e7a82; margin-bottom: 10px; display: flex; align-items: center; gap: 6px; }\n    .psac-reco-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; margin-bottom: 8px; }\n    .psac-reco-card { background: #fff; border-radius: var(--psac-radius-sm); padding: 12px 14px; border: 1px solid #e0eeef; font-size: 13px; color: var(--psac-text-light); }\n    .psac-reco-card strong { display: block; color: var(--psac-text); font-size: 13.5px; margin-bottom: 3px; }\n    .psac-cost-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; margin-top: 8px; }\n    .psac-cost-item { padding: 9px 11px; background: #fff; border-radius: 7px; border: 1px solid #e0eeef; }\n    .psac-cost-region { font-size: 10.5px; color: #64748b; text-transform: uppercase; font-weight: 600; }\n    .psac-cost-val { font-size: 13px; color: var(--psac-text); font-weight: 600; }\n<\/style>\n\n<div class=\"psac-wrap\" id=\"psac-calc-root\">\n    <div class=\"psac-step\">\n        <div class=\"psac-step-header\">\n            <span class=\"psac-step-num\">1<\/span>\n            <div>\n                <div class=\"psac-step-title\">Selecciona la forma de la piscina<\/div>\n                <div class=\"psac-step-subtitle\">Elige la forma que mejor se ajuste a tu piscina<\/div>\n            <\/div>\n        <\/div>\n        <div class=\"psac-shape-grid\" id=\"psac-shape-grid\">\n            <div class=\"psac-shape-card\" data-shape=\"rectangular\">\n                <div class=\"psac-shape-icon\"><svg viewBox=\"0 0 50 38\" fill=\"none\"><rect x=\"3\" y=\"3\" width=\"44\" height=\"32\" rx=\"3\" stroke=\"#1ecad3\" stroke-width=\"2.8\" fill=\"#e8fafb\"\/><\/svg><\/div>\n                <div class=\"psac-shape-label\">Rectangular<\/div>\n            <\/div>\n            <div class=\"psac-shape-card\" data-shape=\"l-shaped\">\n                <div class=\"psac-shape-icon\"><svg viewBox=\"0 0 50 42\" fill=\"none\"><path d=\"M5,5 L33,5 L33,21 L21,21 L21,37 L5,37 Z\" stroke=\"#1ecad3\" stroke-width=\"2.8\" fill=\"#e8fafb\" stroke-linejoin=\"round\"\/><\/svg><\/div>\n                <div class=\"psac-shape-label\">En L<\/div>\n            <\/div>\n            <div class=\"psac-shape-card\" data-shape=\"circle\">\n                <div class=\"psac-shape-icon\"><svg viewBox=\"0 0 42 42\" fill=\"none\"><circle cx=\"21\" cy=\"21\" r=\"18\" stroke=\"#1ecad3\" stroke-width=\"2.8\" fill=\"#e8fafb\"\/><\/svg><\/div>\n                <div class=\"psac-shape-label\">Circular<\/div>\n            <\/div>\n            <div class=\"psac-shape-card\" data-shape=\"triangular\">\n                <div class=\"psac-shape-icon\"><svg viewBox=\"0 0 46 40\" fill=\"none\"><polygon points=\"23,3 43,37 3,37\" stroke=\"#1ecad3\" stroke-width=\"2.8\" fill=\"#e8fafb\" stroke-linejoin=\"round\"\/><\/svg><\/div>\n                <div class=\"psac-shape-label\">Triangular<\/div>\n            <\/div>\n            <div class=\"psac-shape-card\" data-shape=\"kidney\">\n                <div class=\"psac-shape-icon\"><svg viewBox=\"0 0 48 38\" fill=\"none\"><path d=\"M36,5 C26,5 20,15 16,19 C10,25 3,29 3,21 C3,11 13,5 21,11 C25,14 27,9 36,5 Z\" stroke=\"#1ecad3\" stroke-width=\"2.8\" fill=\"#e8fafb\" stroke-linejoin=\"round\"\/><\/svg><\/div>\n                <div class=\"psac-shape-label\">Ri\u00f1\u00f3n<\/div>\n            <\/div>\n            <div class=\"psac-shape-card\" data-shape=\"oval\">\n                <div class=\"psac-shape-icon\"><svg viewBox=\"0 0 50 34\" fill=\"none\"><ellipse cx=\"25\" cy=\"17\" rx=\"23\" ry=\"15\" stroke=\"#1ecad3\" stroke-width=\"2.8\" fill=\"#e8fafb\"\/><\/svg><\/div>\n                <div class=\"psac-shape-label\">Ovalada<\/div>\n            <\/div>\n            <div class=\"psac-shape-card\" data-shape=\"oblong\">\n                <div class=\"psac-shape-icon\"><svg viewBox=\"0 0 50 32\" fill=\"none\"><rect x=\"9\" y=\"4\" width=\"32\" height=\"24\" rx=\"12\" stroke=\"#1ecad3\" stroke-width=\"2.8\" fill=\"#e8fafb\"\/><\/svg><\/div>\n                <div class=\"psac-shape-label\">Oblonga<\/div>\n            <\/div>\n            <div class=\"psac-shape-card\" data-shape=\"roman\">\n                <div class=\"psac-shape-icon\"><svg viewBox=\"0 0 50 32\" fill=\"none\"><path d=\"M10,4 H36 Q46,4 46,16 Q46,28 36,28 H10 Z\" stroke=\"#1ecad3\" stroke-width=\"2.8\" fill=\"#e8fafb\"\/><\/svg><\/div>\n                <div class=\"psac-shape-label\">Romana<\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"psac-step\">\n        <div class=\"psac-step-header\">\n            <span class=\"psac-step-num\">2<\/span>\n            <div>\n                <div class=\"psac-step-title\">Selecciona el tipo de piscina<\/div>\n                <div class=\"psac-step-subtitle\">Instalaci\u00f3n elevada o enterrada<\/div>\n            <\/div>\n        <\/div>\n        <div class=\"psac-type-row\" id=\"psac-type-row\">\n            <div class=\"psac-type-card\" data-type=\"above-ground\">\n                <span class=\"psac-type-label\">Elevada<\/span>\n            <\/div>\n            <div class=\"psac-type-card psac-active\" data-type=\"in-ground\">\n                <span class=\"psac-type-label\">Enterrada<\/span>\n            <\/div>\n        <\/div>\n        <p class=\"psac-type-note\" id=\"psac-type-note\"><\/p>\n    <\/div>\n\n    <div class=\"psac-step\">\n        <div class=\"psac-step-header\">\n            <span class=\"psac-step-num\">3<\/span>\n            <div>\n                <div class=\"psac-step-title\">Introduce las dimensiones de la piscina<\/div>\n                <div class=\"psac-step-subtitle\">Proporciona medidas precisas para un c\u00e1lculo exacto<\/div>\n            <\/div>\n        <\/div>\n        <div class=\"psac-unit-toggle-row\">\n            <span class=\"psac-unit-toggle-label\">Unidad de entrada:<\/span>\n            <div class=\"psac-unit-pills\" id=\"psac-input-unit-pills\">\n                <button class=\"psac-unit-pill psac-active-pill\" data-unit=\"ft\">Pies (ft)<\/button>\n                <button class=\"psac-unit-pill\" data-unit=\"m\">Metros (m)<\/button>\n            <\/div>\n        <\/div>\n        <div class=\"psac-inputs-grid\" id=\"psac-inputs-grid\"><\/div>\n    <\/div>\n\n    <button class=\"psac-calc-btn\" id=\"psac-calc-btn\">Calcular<\/button>\n    <div class=\"psac-error\" id=\"psac-error\"><\/div>\n\n    <div class=\"psac-result-wrap\" id=\"psac-result-wrap\">\n        <div class=\"psac-result-card\">\n            <div class=\"psac-result-header\">\n                <span class=\"psac-result-title\">Resultados del c\u00e1lculo<\/span>\n                <div class=\"psac-result-toggle\">\n                    <span style=\"font-size:11px;font-weight:600;color:#64748b;\">Mostrar:<\/span>\n                    <div class=\"psac-unit-pills\" id=\"psac-result-unit-pills\">\n                        <button class=\"psac-unit-pill psac-active-pill\" data-result-unit=\"imperial\">Imperial<\/button>\n                        <button class=\"psac-unit-pill\" data-result-unit=\"metric\">M\u00e9trico<\/button>\n                    <\/div>\n                <\/div>\n            <\/div>\n            <div class=\"psac-result-grid\">\n                <div class=\"psac-result-item\">\n                    <span class=\"psac-result-value\" id=\"psac-val-area\">&#8212;<\/span>\n                    <span class=\"psac-result-label\">Superficie interior estimada (fondo y paredes)<\/span>\n                <\/div>\n                <div class=\"psac-result-item\">\n                    <span class=\"psac-result-value\" id=\"psac-val-volume\">&#8212;<\/span>\n                    <span class=\"psac-result-label\">Volumen de agua<\/span>\n                <\/div>\n                <div class=\"psac-result-item\">\n                    <span class=\"psac-result-value\" id=\"psac-val-primer\">&#8212;<\/span>\n                    <span class=\"psac-result-label\">Imprimaci\u00f3n necesaria<\/span>\n                <\/div>\n                <div class=\"psac-result-item\">\n                    <span class=\"psac-result-value\" id=\"psac-val-finish\">&#8212;<\/span>\n                    <span class=\"psac-result-label\">Acabado necesario<\/span>\n                    <div class=\"psac-finish-note\" id=\"psac-finish-note\"><\/div>\n                <\/div>\n            <\/div>\n            <div class=\"psac-material-text\" id=\"psac-material-text\"><\/div>\n            <div class=\"psac-reco-section\">\n                <div class=\"psac-reco-title\">Recomendaciones y estimaciones<\/div>\n                <div class=\"psac-reco-grid\" id=\"psac-reco-grid\"><\/div>\n            <\/div>\n            <div class=\"psac-reco-section\">\n                <div class=\"psac-reco-title\">Coste estimado del agua (llenado inicial)<\/div>\n                <div class=\"psac-cost-grid\" id=\"psac-cost-grid\"><\/div>\n            <\/div>\n            <p class=\"psac-disclaimer\">* Todos los c\u00e1lculos son estimaciones. Las necesidades reales var\u00edan seg\u00fan la construcci\u00f3n de la piscina, las condiciones locales y las especificaciones del producto.<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n    (function() {\n        const root = document.getElementById('psac-calc-root');\n        if (!root) return;\n\n        let state = {\n            shape: null,\n            poolType: 'in-ground',\n            inputUnit: 'ft',\n            resultUnit: 'imperial',\n            computed: null,\n        };\n\n        const shapeFields = {\n            'circle': [{ key: 'diameter', label: 'Di\u00e1metro' }, { key: 'minDepth', label: 'Prof. m\u00edn.' }, { key: 'maxDepth', label: 'Prof. m\u00e1x.' }],\n            'oval': [{ key: 'length', label: 'Longitud' }, { key: 'width', label: 'Anchura' }, { key: 'minDepth', label: 'Prof. m\u00edn.' }, { key: 'maxDepth', label: 'Prof. m\u00e1x.' }],\n            'rectangular': [{ key: 'length', label: 'Longitud' }, { key: 'width', label: 'Anchura' }, { key: 'minDepth', label: 'Prof. m\u00edn.' }, { key: 'maxDepth', label: 'Prof. m\u00e1x.' }],\n            'l-shaped': [{ key: 'length1', label: 'Longitud 1' }, { key: 'length2', label: 'Longitud 2' }, { key: 'length3', label: 'Longitud 3' }, { key: 'length4', label: 'Longitud 4' }, { key: 'width1', label: 'Anchura 1' }, { key: 'width2', label: 'Anchura 2' }, { key: 'minDepth', label: 'Prof. m\u00edn.' }, { key: 'maxDepth', label: 'Prof. m\u00e1x.' }],\n            'triangular': [{ key: 'length', label: 'Longitud (base)' }, { key: 'width', label: 'Anchura (altura)' }, { key: 'minDepth', label: 'Prof. m\u00edn.' }, { key: 'maxDepth', label: 'Prof. m\u00e1x.' }],\n            'kidney': [{ key: 'length', label: 'Longitud' }, { key: 'width1', label: 'Anchura 1' }, { key: 'width2', label: 'Anchura 2' }, { key: 'minDepth', label: 'Prof. m\u00edn.' }, { key: 'maxDepth', label: 'Prof. m\u00e1x.' }],\n            'oblong': [{ key: 'length', label: 'Longitud' }, { key: 'width', label: 'Anchura' }, { key: 'minDepth', label: 'Prof. m\u00edn.' }, { key: 'maxDepth', label: 'Prof. m\u00e1x.' }],\n            'roman': [{ key: 'width', label: 'Anchura' }, { key: 'length1', label: 'Longitud 1' }, { key: 'length2', label: 'Longitud 2' }, { key: 'minDepth', label: 'Prof. m\u00edn.' }, { key: 'maxDepth', label: 'Prof. m\u00e1x.' }],\n        };\n\n        const inGroundOnlyShapes = ['l-shaped', 'triangular', 'kidney', 'roman'];\n        const aboveGroundOnlyShapes = ['circle'];\n\n        const shapeGrid = document.getElementById('psac-shape-grid');\n        const typeRow = document.getElementById('psac-type-row');\n        const typeNote = document.getElementById('psac-type-note');\n        const inputsGrid = document.getElementById('psac-inputs-grid');\n        const calcBtn = document.getElementById('psac-calc-btn');\n        const errorBox = document.getElementById('psac-error');\n        const resultWrap = document.getElementById('psac-result-wrap');\n        const recoGrid = document.getElementById('psac-reco-grid');\n        const costGrid = document.getElementById('psac-cost-grid');\n        const inputUnitPills = document.getElementById('psac-input-unit-pills');\n        const resultUnitPills = document.getElementById('psac-result-unit-pills');\n        const valArea = document.getElementById('psac-val-area');\n        const valVolume = document.getElementById('psac-val-volume');\n        const valPrimer = document.getElementById('psac-val-primer');\n        const valFinish = document.getElementById('psac-val-finish');\n        const finishNote = document.getElementById('psac-finish-note');\n        const materialText = document.getElementById('psac-material-text');\n\n        function toFeet(v) { return state.inputUnit === 'ft' ? v : v * 3.28084; }\n        function sqFtToSqM(v) { return v * 0.092903; }\n        function cuFtToGal(v) { return v * 7.48052; }\n        function galToLiters(v) { return v * 3.78541; }\n\n        function calculate(vals) {\n            const dims = {};\n            for (const [k, v] of Object.entries(vals)) {\n                if (k === '_allValid') continue;\n                dims[k] = toFeet(v);\n            }\n\n            let areaSqFt = 0;\n            switch (state.shape) {\n                case 'circle': areaSqFt = Math.PI * Math.pow(dims.diameter \/ 2, 2); break;\n                case 'oval': areaSqFt = Math.PI * (dims.length \/ 2) * (dims.width \/ 2); break;\n                case 'rectangular': areaSqFt = dims.length * dims.width; break;\n                case 'l-shaped': areaSqFt = (dims.length1 * dims.width1) + (dims.length3 * dims.width2); break;\n                case 'triangular': areaSqFt = 0.5 * dims.length * dims.width; break;\n                case 'kidney': areaSqFt = dims.length * ((dims.width1 + dims.width2) \/ 2) * 0.88; break;\n                case 'oblong': areaSqFt = (Math.max(0, dims.length - dims.width) * dims.width) + (Math.PI * Math.pow(dims.width \/ 2, 2)); break;\n                case 'roman': areaSqFt = (dims.length1 * dims.width) + (Math.PI * Math.pow(dims.width \/ 2, 2)); break;\n            }\n\n            const avgDepthFt = (dims.minDepth + dims.maxDepth) \/ 2;\n            const volCuFt = areaSqFt * avgDepthFt;\n            const volGal = cuFtToGal(volCuFt);\n            const waterFootprintSqFt = areaSqFt;\n            let perimeterFt = 0;\n            if(state.shape === 'rectangular') {\n                areaSqFt = dims.width*Math.hypot(dims.length,dims.maxDepth-dims.minDepth)+2*dims.length*avgDepthFt+dims.width*(dims.minDepth+dims.maxDepth);\n            } else {\n                if(state.shape==='circle') perimeterFt=Math.PI*dims.diameter;\n                else if(state.shape==='oval') {const a=dims.length\/2,b=dims.width\/2;perimeterFt=Math.PI*(3*(a+b)-Math.sqrt((3*a+b)*(a+3*b)));}\n                else if(state.shape==='oblong') perimeterFt=2*Math.max(0,dims.length-dims.width)+Math.PI*dims.width;\n                else if(state.shape==='roman') perimeterFt=2*dims.length1+Math.PI*dims.width;\n                else if(state.shape==='triangular') perimeterFt=dims.length+2*Math.hypot(dims.length\/2,dims.width);\n                else if(state.shape==='l-shaped') perimeterFt=2*(dims.length1+dims.width1+dims.length3+dims.width2);\n                else {const width=(dims.width1+dims.width2)\/2;perimeterFt=Math.PI*(3*(dims.length\/2+width\/2)-Math.sqrt((3*dims.length\/2+width\/2)*(dims.length\/2+3*width\/2)));}\n                areaSqFt=waterFootprintSqFt+perimeterFt*avgDepthFt;\n            }\n\n\n            \n\n            \/\/ Coverage standards: primer ~60 sq ft\/unit, finish ~45 sq ft\/unit\/coat.\n            const primerUnits = Math.ceil(areaSqFt \/ 60);\n            const finishBase = areaSqFt \/ 45;\n            const finishMinUnits = Math.ceil(finishBase * 2);\n            const finishRecUnits = Math.ceil(finishBase * 3);\n\n            return {\n                areaSqFt, areaSqM: sqFtToSqM(areaSqFt),\n                volGal, volLiters: galToLiters(volGal), volCuM: galToLiters(volGal) \/ 1000,\n                primerUnits,\n                finishMinUnits,\n                finishRecUnits\n            };\n        }\n\n        function updateResultDisplay() {\n            if (!state.computed) return;\n            const r = state.computed;\n            const isImp = state.resultUnit === 'imperial';\n\n            valArea.textContent = isImp ?\n                Math.round(r.areaSqFt).toLocaleString() + ' sq ft' :\n                Math.round(r.areaSqM).toLocaleString() + ' m\u00b2';\n\n            valVolume.textContent = isImp ?\n                Math.round(r.volGal).toLocaleString() + ' galones' :\n                Math.round(r.volLiters).toLocaleString() + ' L';\n\n            valPrimer.textContent = r.primerUnits + ' unidades';\n\n            valFinish.textContent = `${r.finishMinUnits} - ${r.finishRecUnits} unidades`;\n            finishNote.textContent = `Basado en 2-3 capas`;\n        }\n\n        function updateMaterialText(r) {\n            const isImp = state.resultUnit === 'imperial';\n            const areaLabel = isImp ? Math.round(r.areaSqFt) + ' sq ft' : Math.round(r.areaSqM) + ' m\u00b2';\n\n            materialText.innerHTML = `\n                Para una superficie de <strong>${areaLabel}<\/strong>:<br>\n                \u2022 <strong>Imprimaci\u00f3n:<\/strong> <strong>${r.primerUnits} unidades<\/strong> necesarias para una cobertura completa.<br>\n                \u2022 <strong>Acabado:<\/strong> Se requiere un m\u00ednimo de <strong>${r.finishMinUnits} unidades<\/strong> para 2 capas. Recomendamos encarecidamente <strong>${r.finishRecUnits} unidades<\/strong> para un acabado profesional de 3 capas.\n            `;\n        }\n\n        function updateRecommendations(r) {\n            const isImp = state.resultUnit === 'imperial';\n            const shockLbs = Math.round((r.volGal \/ 10000) * 3 * 10) \/ 10;\n            const weeklyLbs = Math.round((r.volGal \/ 10000) * 1.5 * 10) \/ 10;\n            const chemDosage = isImp ?\n                `Choque inicial: ~${shockLbs} lbs de cloro. Semanal: ~${weeklyLbs} lbs.` :\n                `Choque inicial: ~${Math.round(shockLbs * 0.45)} kg de cloro. Semanal: ~${Math.round(weeklyLbs * 0.45)} kg.`;\n\n            recoGrid.innerHTML = `\n                <div class=\"psac-reco-card\"><strong>Cubierta de piscina<\/strong>Se recomienda una cubierta est\u00e1ndar adaptada a la forma.<\/div>\n                <div class=\"psac-reco-card\"><strong>Dosis qu\u00edmica<\/strong>${chemDosage}<\/div>\n                <div class=\"psac-reco-card\"><strong>Mantenimiento<\/strong>Comprueba con regularidad el pH y la alcalinidad.<\/div>\n            `;\n        }\n\n        function updateCostGrid(r) {\n            const gal = r.volGal;\n            const m3 = r.volCuM;\n            const costs = [\n                { region: 'EE. UU. (municipal)', val: '$' + Math.round(gal * 0.008).toLocaleString() },\n                { region: 'Reino Unido', val: '\u00a3' + Math.round(m3 * 2.5).toLocaleString() },\n                { region: 'UE', val: '\u20ac' + Math.round(m3 * 2).toLocaleString() }\n            ];\n            costGrid.innerHTML = costs.map(c =>\n                `<div class=\"psac-cost-item\"><div class=\"psac-cost-region\">${c.region}<\/div><div class=\"psac-cost-val\">${c.val}<\/div><\/div>`\n            ).join('');\n        }\n\n        shapeGrid.addEventListener('click', function(e) {\n            const card = e.target.closest('.psac-shape-card');\n            if (!card) return;\n            shapeGrid.querySelectorAll('.psac-shape-card').forEach(c => c.classList.remove('psac-active'));\n            card.classList.add('psac-active');\n            state.shape = card.dataset.shape;\n\n            const aboveCard = typeRow.querySelector('[data-type=\"above-ground\"]');\n            const inCard = typeRow.querySelector('[data-type=\"in-ground\"]');\n            aboveCard.classList.remove('psac-disabled');\n            inCard.classList.remove('psac-disabled');\n\n            if (inGroundOnlyShapes.includes(state.shape)) {\n                aboveCard.classList.add('psac-disabled');\n                inCard.click();\n            } else if (aboveGroundOnlyShapes.includes(state.shape)) {\n                inCard.classList.add('psac-disabled');\n                aboveCard.click();\n            }\n\n            renderInputs();\n        });\n\n        typeRow.addEventListener('click', function(e) {\n            const card = e.target.closest('.psac-type-card');\n            if (!card || card.classList.contains('psac-disabled')) return;\n            typeRow.querySelectorAll('.psac-type-card').forEach(c => c.classList.remove('psac-active'));\n            card.classList.add('psac-active');\n            state.poolType = card.dataset.type;\n        });\n\n        inputUnitPills.addEventListener('click', function(e) {\n            const pill = e.target.closest('.psac-unit-pill');\n            if (!pill) return;\n            inputUnitPills.querySelectorAll('.psac-unit-pill').forEach(p => p.classList.remove('psac-active-pill'));\n            pill.classList.add('psac-active-pill');\n            state.inputUnit = pill.dataset.unit;\n            inputsGrid.querySelectorAll('.psac-unit-hint').forEach(h => h.textContent = `(${state.inputUnit})`);\n        });\n\n        resultUnitPills.addEventListener('click', function(e) {\n            const pill = e.target.closest('.psac-unit-pill');\n            if (!pill) return;\n            resultUnitPills.querySelectorAll('.psac-unit-pill').forEach(p => p.classList.remove('psac-active-pill'));\n            pill.classList.add('psac-active-pill');\n            state.resultUnit = pill.dataset.resultUnit;\n            if (state.computed) {\n                updateResultDisplay();\n                updateMaterialText(state.computed);\n                updateRecommendations(state.computed);\n            }\n        });\n\n        calcBtn.addEventListener('click', function() {\n            if (!state.shape) { errorBox.textContent = \"Selecciona una forma.\"; errorBox.style.display = \"block\"; return; }\n            errorBox.style.display = \"none\";\n\n            const fields = shapeFields[state.shape];\n            const vals = {};\n            for(let f of fields) {\n                const v = parseFloat(inputsGrid.querySelector(`[data-key=\"${f.key}\"]`).value);\n                if (isNaN(v) || v <= 0) { errorBox.textContent = \"Introduce n\u00fameros v\u00e1lidos.\"; errorBox.style.display = \"block\"; return; }\n                vals[f.key] = v;\n            }\n\n            const results = calculate(vals);\n            state.computed = results;\n            updateResultDisplay();\n            updateMaterialText(results);\n            updateRecommendations(results);\n            updateCostGrid(results);\n            resultWrap.style.display = \"block\";\n            resultWrap.scrollIntoView({ behavior: 'smooth' });\n        });\n\n        function renderInputs() {\n            if (!state.shape) return;\n            const fields = shapeFields[state.shape];\n            inputsGrid.innerHTML = fields.map(f => `\n                <div class=\"psac-field\">\n                    <label>${f.label} <span class=\"psac-unit-hint\">(${state.inputUnit})<\/span><\/label>\n                    <input type=\"number\" step=\"any\" data-key=\"${f.key}\" placeholder=\"0\">\n                <\/div>\n            `).join('');\n        }\n\n        renderInputs();\n\n    })();\n<\/script>\n\n\n\n<style>\n.pvc-guide-wrap {\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n    max-width: 900px;\n    margin: 30px auto;\n    padding: 30px;\n    background: #fff;\n    border-radius: 16px;\n    box-shadow: 0 4px 20px rgba(0,0,0,.08);\n    color: #222;\n    line-height: 1.6;\n}\n\n.pvc-guide-title {\n    font-size: 24px;\n    font-weight: 700;\n    margin-bottom: 20px;\n    color: #1a1a1a;\n    border-bottom: 3px solid #1ecad3;\n    display: inline-block;\n    padding-bottom: 5px;\n}\n\n.pvc-guide-intro {\n    font-size: 16px;\n    color: #444;\n    margin-bottom: 25px;\n}\n\n.pvc-math-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n    gap: 20px;\n}\n\n.pvc-math-card {\n    background: #f8fcfc;\n    border: 1px solid #e0eeef;\n    border-radius: 12px;\n    padding: 20px;\n    transition: transform 0.2s;\n}\n\n.pvc-math-card:hover {\n    border-color: #1ecad3;\n}\n\n.pvc-shape-name {\n    font-weight: 700;\n    font-size: 18px;\n    color: #0e7a82;\n    margin-bottom: 10px;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n}\n\n.pvc-formula {\n    background: #fff;\n    padding: 10px;\n    border-radius: 6px;\n    font-family: \"Courier New\", Courier, monospace;\n    font-weight: 700;\n    color: #1a1a1a;\n    border-left: 4px solid #1ecad3;\n    margin: 10px 0;\n}\n\n.pvc-math-desc {\n    font-size: 14px;\n    color: #666;\n}\n\n.pvc-tip {\n    margin-top: 30px;\n    padding: 15px 20px;\n    background: #e8fafb;\n    border-left: 4px solid #1ecad3;\n    border-radius: 4px;\n    font-size: 15px;\n}\n\n@media (max-width: 600px) {\n    .pvc-guide-wrap { padding: 20px; }\n}\n<\/style>\n\n<div class=\"pvc-guide-wrap\">\n    <h2 class=\"pvc-guide-title\">C\u00f3mo calcular la superficie de la piscina<\/h2>\n    <p class=\"pvc-guide-intro\">\n        Calcular la superficie es el primer paso para determinar cu\u00e1nta pintura, imprimaci\u00f3n o acabado necesita tu piscina. La f\u00f3rmula cambia seg\u00fan la forma geom\u00e9trica del vaso.\n    <\/p>\n\n    <div class=\"pvc-math-grid\">\n        <div class=\"pvc-math-card\">\n            <div class=\"pvc-shape-name\">Rectangular<\/div>\n            <p class=\"pvc-math-desc\">El c\u00e1lculo m\u00e1s sencillo. Multiplica la longitud por la anchura.<\/p>\n            <div class=\"pvc-formula\">Longitud \u00d7 Anchura<\/div>\n        <\/div>\n\n        <div class=\"pvc-math-card\">\n            <div class=\"pvc-shape-name\">Circular<\/div>\n            <p class=\"pvc-math-desc\">Calcula el radio (la mitad del di\u00e1metro), multipl\u00edcalo por s\u00ed mismo y luego por Pi (3,14).<\/p>\n            <div class=\"pvc-formula\">3,14 \u00d7 Radio\u00b2<\/div>\n        <\/div>\n\n        <div class=\"pvc-math-card\">\n            <div class=\"pvc-shape-name\">Ovalada \/ Oblonga<\/div>\n            <p class=\"pvc-math-desc\">Multiplica la longitud mayor por la anchura m\u00e1xima y luego por un factor de curvatura (aprox. 0,8).<\/p>\n            <div class=\"pvc-formula\">Longitud \u00d7 Anchura \u00d7 0,8<\/div>\n        <\/div>\n\n        <div class=\"pvc-math-card\">\n            <div class=\"pvc-shape-name\">Ri\u00f1\u00f3n<\/div>\n            <p class=\"pvc-math-desc\">Mide la longitud total y la anchura de los dos \u00abl\u00f3bulos\u00bb. Suma primero las anchuras.<\/p>\n            <div class=\"pvc-formula\">(Anchura A + Anchura B) \u00d7 Longitud \u00d7 0,45<\/div>\n        <\/div>\n\n        <div class=\"pvc-math-card\">\n            <div class=\"pvc-shape-name\">Romana<\/div>\n            <p class=\"pvc-math-desc\">Calcula la parte central como un rect\u00e1ngulo y suma el \u00e1rea de los extremos semicirculares.<\/p>\n            <div class=\"pvc-formula\">(L \u00d7 A) + (3,14 \u00d7 Radio\u00b2)<\/div>\n        <\/div>\n\n        <div class=\"pvc-math-card\">\n            <div class=\"pvc-shape-name\">En L<\/div>\n            <p class=\"pvc-math-desc\">Divide la piscina en dos rect\u00e1ngulos separados, calcula ambos y s\u00famalos.<\/p>\n            <div class=\"pvc-formula\">\u00c1rea A + \u00c1rea B<\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"pvc-tip\">\n        <strong>Consejo profesional:<\/strong> Al calcular el acabado (pintura o capa superior), multiplica siempre la superficie final por el n\u00famero de capas (2 m\u00ednimo, 3 recomendadas) para asegurarte de pedir suficiente material.\n    <\/div>\n<\/div>\n\n\n<!-- aiper-tool-links -->\n<style>.aiper-i18n-upgrade{box-sizing:border-box;width:100%;max-width:100%;overflow-wrap:anywhere;padding:24px;margin:24px 0;border:1px solid #1ecad3;border-radius:12px}.aiper-i18n-upgrade form{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:16px}.aiper-i18n-upgrade label{display:flex;flex-direction:column;gap:8px}.aiper-i18n-upgrade input{min-width:0;padding:12px;border:1px solid #a0b8c4;border-radius:8px}.aiper-i18n-upgrade button{padding:12px;background:#087e8b;color:white;border:0;border-radius:8px}.aiper-i18n-upgrade p{line-height:1.7}@media(max-width:600px){.aiper-i18n-upgrade form{grid-template-columns:minmax(0,1fr)}}<\/style><section class=\"aiper-i18n-upgrade\" id=\"aiper-upgrade-surface\"><h2>Comprobar superficie interior y del agua<\/h2><p>El rect\u00e1ngulo incluye el fondo inclinado. Otras formas son aproximaciones sin escalones, bancos ni curvas de encuentro. Confirme medidas antes de comprar materiales.<\/p><p>Introduzca decimales con punto (p. ej., 1.5). Galones estadounidenses salvo indicaci\u00f3n contraria. Importes en d\u00f3lares estadounidenses (USD).<\/p><form><label>Longitud (ft)<input type=\"number\" name=\"l\" value=\"32\" min=\"0\" step=\"any\" required><\/label><label>Anchura (ft)<input type=\"number\" name=\"b\" value=\"16\" min=\"0\" step=\"any\" required><\/label><label>Profundidad m\u00ednima (ft)<input type=\"number\" name=\"s\" value=\"3\" min=\"0\" step=\"any\" required><\/label><label>Profundidad m\u00e1xima (ft)<input type=\"number\" name=\"d\" value=\"6\" min=\"0\" step=\"any\" required><\/label><button type=\"submit\">Calcular<\/button><button type=\"reset\">Restablecer<\/button><\/form><p role=\"status\" aria-live=\"polite\"><\/p><\/section><script>(()=>{const root=document.currentScript.previousElementSibling,form=root.querySelector('form'),out=root.querySelector('[role=status]'),D={\"calc\": \"Calcular\", \"reset\": \"Restablecer\", \"format\": \"Introduzca decimales con punto (p. ej., 1.5). Galones estadounidenses salvo indicaci\u00f3n contraria.\", \"error\": \"Complete todos los campos con valores no negativos. El volumen, caudal y dimensiones deben ser positivos.\", \"unreachable\": \"No se puede alcanzar el objetivo con esta agua de reposici\u00f3n.\", \"day\": \"Por d\u00eda\", \"month\": \"Para 30 d\u00edas\", \"hours\": \"horas\", \"water\": \"Superficie del agua\", \"interior\": \"Superficie interior, fondo y paredes\", \"replace\": \"Reposici\u00f3n en una sola etapa\", \"stages\": \"Etapas iguales de reposici\u00f3n\", \"total\": \"Agua total utilizada\", \"flow\": \"Caudal medido de la manguera\", \"time\": \"Tiempo estimado de llenado\", \"target\": \"Objetivo temporal de cloro libre\", \"dose\": \"Cantidad de cloro l\u00edquido\", \"budget\": \"Presupuesto del proyecto con reserva\", \"invalid\": \"El objetivo no cabe en un d\u00eda de 24 horas.\", \"review\": \"Compruebe las mediciones, ajuste un par\u00e1metro cada vez, haga circular el agua y vuelva a medir. El revestimiento, el sistema desinfectante y la etiqueta determinan los objetivos.\", \"schedule\": \"Programa diario de varias velocidades\", \"off\": \"Apagado\", \"equal\": \"Comparaci\u00f3n con igual volumen de agua\", \"units\": \"US gal; ft; GPM; W; $\/kWh\", \"title\": [\"Tiempo diario y coste el\u00e9ctrico\", \"Comprobar superficie interior y del agua\", \"Reposici\u00f3n de agua para reducir concentraciones\", \"Medir el caudal de la manguera\", \"Reposici\u00f3n SLAM seg\u00fan el CYA\", \"Orden de ajuste del agua\", \"Presupuesto desglosado del proyecto\"], \"labels\": [\"Volumen de piscina (US gal)\", \"Caudal medido (GPM)\", \"Equivalentes de volumen al d\u00eda\", \"Tiempo m\u00ednimo de equipos (h)\", \"Potencia medida (W)\", \"Tarifa el\u00e9ctrica ($\/kWh)\", \"Longitud (ft)\", \"Anchura (ft)\", \"Profundidad m\u00ednima (ft)\", \"Profundidad m\u00e1xima (ft)\", \"Lectura actual (ppm)\", \"Lectura objetivo (ppm)\", \"Lectura del agua de reposici\u00f3n (ppm)\", \"Etapas iguales (1\u201310)\", \"Capacidad del cubo (US gal)\", \"Tiempo para llenar el cubo (s)\", \"CYA (ppm)\", \"Cloro libre actual (ppm)\", \"Concentraci\u00f3n de cloro l\u00edquido (%)\", \"Alcalinidad total (ppm)\", \"pH\", \"Dureza c\u00e1lcica (ppm)\", \"Construcci\u00f3n y equipos est\u00e1ndar ($)\", \"Excavaci\u00f3n ($)\", \"Terraza de piscina ($)\", \"Permisos y proyecto ($)\", \"Equipos opcionales ($)\", \"Reserva (%)\", \"Caudal a velocidad baja (GPM)\", \"Potencia a velocidad baja (W)\", \"Caudal a velocidad media (GPM)\", \"Potencia a velocidad media (W)\", \"Tiempo a velocidad media (h)\", \"Caudal a velocidad alta (GPM)\", \"Potencia a velocidad alta (W)\", \"Tiempo a velocidad alta (h)\"], \"help\": [\"Utilice mediciones reales. El tiempo de recirculaci\u00f3n no garantiza la calidad del agua; respete el caudal y tiempo m\u00ednimos de los equipos.\", \"El rect\u00e1ngulo incluye el fondo inclinado. Otras formas son aproximaciones sin escalones, bancos ni curvas de encuentro. Confirme medidas antes de comprar materiales.\", \"Calcule una sustancia cada vez. Antes de vaciar cantidades importantes, revise nivel fre\u00e1tico, estructura y normas de vertido; mezcle y vuelva a medir entre etapas.\", \"Mide la manguera de llenado, no el caudal de recirculaci\u00f3n requerido. Repita la medici\u00f3n con la instalaci\u00f3n real.\", \"Solo para CYA medido entre 20 y 90 ppm. El objetivo y la dosis no sustituyen el procedimiento SLAM completo. Mida el cloro libre antes de cada reposici\u00f3n, siga la etiqueta y no se ba\u00f1e durante el tratamiento.\", \"Esta lista no sustituye un an\u00e1lisis completo ni genera una mezcla autom\u00e1tica de productos.\", \"Introduzca presupuestos locales. El coste de construcci\u00f3n es distinto del pr\u00e9stamo y del mantenimiento.\"], \"pure\": \"Cantidades te\u00f3ricas para CaCl\u2082 anhidro puro al 100 % o cloruro c\u00e1lcico dihidratado puro; dureza expresada como ppm CaCO\u2083. Si el producto declara una fracci\u00f3n de CaCl\u2082 anhidro, divida la cantidad anhidra por esa fracci\u00f3n (77 % = 0.77). No aplique otra vez ese factor a la cantidad dihidratada. El hipoclorito c\u00e1lcico de choque es otro producto.\"},type=\"surface\";form.addEventListener('submit',e=>{e.preventDefault();const inputs=[...form.querySelectorAll('input')];if(inputs.some(x=>x.value.trim()===''||!Number.isFinite(Number(x.value))||Number(x.value)<0)){out.textContent=D.error;return;}const x=Object.fromEntries(inputs.map(x=>[x.name,Number(x.value)])),fmt=n=>new Intl.NumberFormat(\"es-ES\",{maximumFractionDigits:2}).format(n),line=(k,v,u='')=>D[k]+': '+fmt(v)+' '+u;let result='';if(type==='dilution'){if(x.t>=x.c){result=line('replace',0,'US gal');}else if(x.f>=x.t){result=D.unreachable;}else if(x.v<=0||x.n<1||x.n>10||!Number.isInteger(x.n)){result=D.error;}else{let f=(x.c-x.t)\/(x.c-x.f),st=1-Math.pow((x.t-x.f)\/(x.c-x.f),1\/x.n);result=line('replace',x.v*f,'US gal')+' ('+fmt(f*100)+'%); '+line('stages',x.n)+': '+fmt(st*100)+'%; '+line('total',st*x.v*x.n,'US gal');}}else if(type==='runtime'){if(x.v<=0||x.q<=0||x.n<=0){result=D.error;}else{let h=Math.max(x.v*x.n\/x.q\/60,x.min);result=h>24?D.invalid:line('time',h,D.hours)+'; '+line('day',h*x.w\/1000,'kWh')+'; '+line('month',h*x.w\/1000*x.r*30,'$');}}else if(type==='surface'){if(Math.min(x.l,x.b,x.s,x.d)<=0||x.d<x.s){result=D.error;}else{let a=x.b*Math.hypot(x.l,x.d-x.s)+x.l*(x.s+x.d)+x.b*(x.s+x.d);result=line('water',x.l*x.b,'ft\u00b2')+'; '+line('interior',a,'ft\u00b2');}}else if(type==='fill'){if(Math.min(x.v,x.b,x.s)<=0){result=D.error;}else{let q=x.b*60\/x.s;result=line('flow',q,'GPM')+'; '+line('time',x.v\/q\/60,D.hours);const f=document.getElementById('flowRate');if(f){f.value=q.toFixed(3);f.dispatchEvent(new Event('input',{bubbles:true}));}}}else if(type==='slam'){if(x.v<=0||x.s<=0||x.s>15||x.c<20||x.c>90){result=D.error;}else{let target=.4*x.c,litres=Math.max(0,target-x.f)*x.v*3.785411784\/(x.s*10000);result=line('target',target,'ppm')+'; '+line('dose',litres,'L');}}else if(type==='chemical'){result=D.review;}else if(type==='budget'){result=line('budget',(x.shell+x.site+x.deck+x.permit+x.extras)*(1+x.reserve\/100),'$');}else if(type==='schedule'){if(Math.min(x.v,x.n,x.q1,x.q2,x.q3)<=0){result=D.error;}else{let target=x.v*x.n,h1=Math.max(0,(target-60*(x.q2*x.h2+x.q3*x.h3))\/(60*x.q1)),h=h1+x.h2+x.h3;let energy=(h1*x.w1+x.h2*x.w2+x.h3*x.w3)\/1000;result=h>24?D.invalid:D.schedule+': '+fmt(h1)+' \/ '+fmt(x.h2)+' \/ '+fmt(x.h3)+' '+D.hours+'; '+line('off',24-h,D.hours)+'; '+line('day',energy*x.r,'$')+'; '+D.equal+': '+[1,2,3].map(i=>fmt(target\/x['q'+i]\/60*x['w'+i]\/1000*x.r)+' $').join(' \/ ');}}out.textContent=result;});form.addEventListener('reset',()=>out.textContent='');})();<\/script><div class=\"aiper-tool-links\">\n  <div class=\"aiper-tl-section\">\n    <div class=\"aiper-tl-heading\">M\u00e1s herramientas<\/div>\n    <div class=\"aiper-tl-tags\">\n<a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-de-terraza-de-piscina\/\" class=\"aiper-tl-tag\">Calculadora de terraza de piscina<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-de-costes-de-renovacion-del-revestimiento-de-piscina\/\" class=\"aiper-tl-tag\">Calculadora de costes de renovaci\u00f3n del revestimiento de piscina<\/a>\n      <a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-tiempo-llenado-piscina\/\" class=\"aiper-tl-tag\">Calculadora de tiempo de llenado de piscina<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-tasa-recambio-piscina\/\" class=\"aiper-tl-tag\">Calculadora de tasa de recambio de piscina<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-indice-saturacion-piscina\/\" class=\"aiper-tl-tag\">Calculadora del \u00edndice de saturaci\u00f3n de piscina (LSI)<\/a>\n    <\/div>\n  <\/div>\n  <div class=\"aiper-tl-section\">\n    <div class=\"aiper-tl-heading\">Art\u00edculos relacionados<\/div>\n    <div class=\"aiper-tl-tags\">\n      <a href=\"https:\/\/aiper.com\/blogs\/es\/bajar-alcalinidad-piscina\/\" class=\"aiper-tl-tag\">C\u00f3mo bajar la alcalinidad de la piscina<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/es\/robot-piscina-atascado-desague-principal\/\" class=\"aiper-tl-tag\">\u00bfPor qu\u00e9 el robot de piscina se queda atascado en el desag\u00fce principal?<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/es\/preparar-piscina-para-invierno\/\" class=\"aiper-tl-tag\">C\u00f3mo preparar una piscina enterrada para el invierno: gu\u00eda paso a paso<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/es\/dejar-robot-limpiapiscinas-en-el-agua\/\" class=\"aiper-tl-tag\">\u00bfSe puede dejar el robot limpiapiscinas en el agua?<\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n.aiper-tool-links{margin:2.5rem 0 1.5rem;padding:1.5rem 1.75rem;background:linear-gradient(135deg,rgba(148,134,247,.04),rgba(30,202,211,.04));border-radius:12px;border:1px solid rgba(148,134,247,.10)}\n.aiper-tl-section{margin-bottom:1.25rem}\n.aiper-tl-section:last-child{margin-bottom:0}\n.aiper-tl-heading{font-size:.75rem;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:#8899aa;margin:0 0 .65rem}\n.aiper-tl-tags{display:flex;flex-wrap:wrap;gap:.5rem}\n.aiper-tl-tag{display:inline-block;padding:.4rem .95rem;font-size:.82rem;font-weight:500;line-height:1.35;color:#9486f7;background:rgba(148,134,247,.055);border:1px solid rgba(30,202,211,.25);border-radius:22px;text-decoration:none;transition:all .18s}\n.aiper-tl-tag:hover{background:#1ecad3;color:#fff;border-color:#1ecad3;box-shadow:0 2px 10px rgba(30,202,211,.22)}\n<\/style>","protected":false},"excerpt":{"rendered":"<p>1 Selecciona la forma de la piscina Elige la forma que mejor se ajuste a tu piscina Rectangular En L Circular Triangular Ri\u00f1\u00f3n Ovalada Oblonga Romana 2 Selecciona el tipo de piscina Instalaci\u00f3n elevada o enterrada Elevada Enterrada 3 Introduce las dimensiones de la piscina Proporciona medidas precisas para un c\u00e1lculo exacto Unidad de entrada: [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"aiper_reading_time":3,"aiper_last_reviewed":"","aiper_reviewer":0,"aiper_related_ids":[],"aiper_layout":"","footnotes":""},"class_list":["post-2078","page","type-page","status-publish","hentry"],"lang":"es","translations":{"es":2078,"de":2076,"en":1476,"fr":2077},"_links":{"self":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2078","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/comments?post=2078"}],"version-history":[{"count":7,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2078\/revisions"}],"predecessor-version":[{"id":13297,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2078\/revisions\/13297"}],"wp:attachment":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/media?parent=2078"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}