{"id":2077,"date":"2026-05-29T09:59:55","date_gmt":"2026-05-29T09:59:55","guid":{"rendered":"https:\/\/aiper.com\/blogs\/?page_id=2077"},"modified":"2026-11-04T09:47:39","modified_gmt":"2026-11-04T09:47:39","slug":"calculateur-surface-piscine","status":"publish","type":"page","link":"https:\/\/aiper.com\/blogs\/fr\/calculateur-surface-piscine\/","title":{"rendered":"Calculateur de surface de piscine"},"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\">Choisir la forme de la piscine<\/div>\n                <div class=\"psac-step-subtitle\">Choisissez la forme qui correspond le mieux \u00e0 votre piscine<\/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\">Rectangulaire<\/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\">Ronde<\/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\">Triangulaire<\/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\">Haricot<\/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\">Ovale<\/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\">Oblongue<\/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\">Romaine<\/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\">Choisir le type de piscine<\/div>\n                <div class=\"psac-step-subtitle\">Installation hors-sol ou enterr\u00e9e<\/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\">Hors-sol<\/span>\n            <\/div>\n            <div class=\"psac-type-card psac-active\" data-type=\"in-ground\">\n                <span class=\"psac-type-label\">Enterr\u00e9e<\/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\">Saisir les dimensions de la piscine<\/div>\n                <div class=\"psac-step-subtitle\">Indiquez des mesures pr\u00e9cises pour un calcul exact<\/div>\n            <\/div>\n        <\/div>\n        <div class=\"psac-unit-toggle-row\">\n            <span class=\"psac-unit-toggle-label\">Unit\u00e9 d\u2019entr\u00e9e\u00a0:<\/span>\n            <div class=\"psac-unit-pills\" id=\"psac-input-unit-pills\">\n                <button class=\"psac-unit-pill psac-active-pill\" data-unit=\"ft\">Pieds (ft)<\/button>\n                <button class=\"psac-unit-pill\" data-unit=\"m\">M\u00e8tres (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\">Calculer<\/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\">R\u00e9sultats du calcul<\/span>\n                <div class=\"psac-result-toggle\">\n                    <span style=\"font-size:11px;font-weight:600;color:#64748b;\">Affichage\u00a0:<\/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\">Imp\u00e9rial<\/button>\n                        <button class=\"psac-unit-pill\" data-result-unit=\"metric\">M\u00e9trique<\/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\">Surface int\u00e9rieure estim\u00e9e (fond et parois)<\/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\">Volume d\u2019eau<\/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\">Appr\u00eat n\u00e9cessaire<\/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\">Finition n\u00e9cessaire<\/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\">Recommandations &#038; estimations<\/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\">Co\u00fbt estim\u00e9 de l\u2019eau (remplissage initial)<\/div>\n                <div class=\"psac-cost-grid\" id=\"psac-cost-grid\"><\/div>\n            <\/div>\n            <p class=\"psac-disclaimer\">* Tous les calculs sont des estimations. Les besoins r\u00e9els varient selon la construction de la piscine, les conditions locales et les sp\u00e9cifications du produit.<\/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: 'Diam\u00e8tre' }, { key: 'minDepth', label: 'Profondeur min.' }, { key: 'maxDepth', label: 'Profondeur max.' }],\n            'oval': [{ key: 'length', label: 'Longueur' }, { key: 'width', label: 'Largeur' }, { key: 'minDepth', label: 'Profondeur min.' }, { key: 'maxDepth', label: 'Profondeur max.' }],\n            'rectangular': [{ key: 'length', label: 'Longueur' }, { key: 'width', label: 'Largeur' }, { key: 'minDepth', label: 'Profondeur min.' }, { key: 'maxDepth', label: 'Profondeur max.' }],\n            'l-shaped': [{ key: 'length1', label: 'Longueur 1' }, { key: 'length2', label: 'Longueur 2' }, { key: 'length3', label: 'Longueur 3' }, { key: 'length4', label: 'Longueur 4' }, { key: 'width1', label: 'Largeur 1' }, { key: 'width2', label: 'Largeur 2' }, { key: 'minDepth', label: 'Profondeur min.' }, { key: 'maxDepth', label: 'Profondeur max.' }],\n            'triangular': [{ key: 'length', label: 'Longueur (base)' }, { key: 'width', label: 'Largeur (hauteur)' }, { key: 'minDepth', label: 'Profondeur min.' }, { key: 'maxDepth', label: 'Profondeur max.' }],\n            'kidney': [{ key: 'length', label: 'Longueur' }, { key: 'width1', label: 'Largeur 1' }, { key: 'width2', label: 'Largeur 2' }, { key: 'minDepth', label: 'Profondeur min.' }, { key: 'maxDepth', label: 'Profondeur max.' }],\n            'oblong': [{ key: 'length', label: 'Longueur' }, { key: 'width', label: 'Largeur' }, { key: 'minDepth', label: 'Profondeur min.' }, { key: 'maxDepth', label: 'Profondeur max.' }],\n            'roman': [{ key: 'width', label: 'Largeur' }, { key: 'length1', label: 'Longueur 1' }, { key: 'length2', label: 'Longueur 2' }, { key: 'minDepth', label: 'Profondeur min.' }, { key: 'maxDepth', label: 'Profondeur max.' }],\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() + ' gallons' :\n                Math.round(r.volLiters).toLocaleString() + ' L';\n\n            valPrimer.textContent = r.primerUnits + ' unit\u00e9s';\n\n            valFinish.textContent = `${r.finishMinUnits} - ${r.finishRecUnits} unit\u00e9s`;\n            finishNote.textContent = `Bas\u00e9 sur 2 \u00e0 3 couches`;\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                Pour une surface de <strong>${areaLabel}<\/strong>:<br>\n                \u2022 <strong>Appr\u00eat\u00a0:<\/strong> <strong>${r.primerUnits} unit\u00e9s<\/strong> n\u00e9cessaires pour une couverture compl\u00e8te.<br>\n                \u2022 <strong>Finition\u00a0:<\/strong> Un minimum de <strong>${r.finishMinUnits} unit\u00e9s<\/strong> est requis pour 2 couches. Nous recommandons fortement <strong>${r.finishRecUnits} unit\u00e9s<\/strong> pour une finition professionnelle en 3 couches.\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                `Choc initial\u00a0: ~${shockLbs} lbs de chlore. Hebdomadaire\u00a0: ~${weeklyLbs} lbs.` :\n                `Choc initial\u00a0: ~${Math.round(shockLbs * 0.45)} kg de chlore. Hebdomadaire\u00a0: ~${Math.round(weeklyLbs * 0.45)} kg.`;\n\n            recoGrid.innerHTML = `\n                <div class=\"psac-reco-card\"><strong>B\u00e2che de piscine<\/strong>B\u00e2che standard adapt\u00e9e \u00e0 la forme recommand\u00e9e.<\/div>\n                <div class=\"psac-reco-card\"><strong>Dosage chimique<\/strong>${chemDosage}<\/div>\n                <div class=\"psac-reco-card\"><strong>Entretien<\/strong>V\u00e9rifiez r\u00e9guli\u00e8rement le pH et l\u2019alcalinit\u00e9.<\/div>\n            `;\n        }\n\n        function updateCostGrid(r) {\n            const gal = r.volGal;\n            const m3 = r.volCuM;\n            const costs = [\n                { region: '\u00c9tats-Unis (municipal)', val: '$' + Math.round(gal * 0.008).toLocaleString() },\n                { region: 'Royaume-Uni', 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 = \"Veuillez s\u00e9lectionner une forme.\"; 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 = \"Veuillez saisir des nombres valides.\"; 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\">Comment calculer la surface d\u2019une piscine<\/h2>\n    <p class=\"pvc-guide-intro\">\n        Le calcul de la surface est la premi\u00e8re \u00e9tape pour d\u00e9terminer la quantit\u00e9 de peinture, d\u2019appr\u00eat ou de finition n\u00e9cessaire \u00e0 votre piscine. La formule change selon la forme g\u00e9om\u00e9trique de votre bassin.\n    <\/p>\n\n    <div class=\"pvc-math-grid\">\n        <div class=\"pvc-math-card\">\n            <div class=\"pvc-shape-name\">Rectangulaire<\/div>\n            <p class=\"pvc-math-desc\">Le calcul le plus simple. Multipliez la longueur par la largeur.<\/p>\n            <div class=\"pvc-formula\">Longueur \u00d7 Largeur<\/div>\n        <\/div>\n\n        <div class=\"pvc-math-card\">\n            <div class=\"pvc-shape-name\">Ronde<\/div>\n            <p class=\"pvc-math-desc\">Trouvez le rayon (la moiti\u00e9 du diam\u00e8tre), multipliez-le par lui-m\u00eame, puis par Pi (3,14).<\/p>\n            <div class=\"pvc-formula\">3,14 \u00d7 Rayon\u00b2<\/div>\n        <\/div>\n\n        <div class=\"pvc-math-card\">\n            <div class=\"pvc-shape-name\">Ovale \/ Oblongue<\/div>\n            <p class=\"pvc-math-desc\">Multipliez la grande longueur par la largeur maximale, puis par un facteur de courbure (environ 0,8).<\/p>\n            <div class=\"pvc-formula\">Longueur \u00d7 Largeur \u00d7 0,8<\/div>\n        <\/div>\n\n        <div class=\"pvc-math-card\">\n            <div class=\"pvc-shape-name\">Haricot<\/div>\n            <p class=\"pvc-math-desc\">Mesurez la longueur totale et la largeur des deux \u00ab\u00a0bulbes\u00a0\u00bb. Additionnez d\u2019abord les largeurs.<\/p>\n            <div class=\"pvc-formula\">(Largeur A + Largeur B) \u00d7 Longueur \u00d7 0,45<\/div>\n        <\/div>\n\n        <div class=\"pvc-math-card\">\n            <div class=\"pvc-shape-name\">Romaine<\/div>\n            <p class=\"pvc-math-desc\">Calculez le centre comme un rectangle, puis ajoutez l\u2019aire des extr\u00e9mit\u00e9s en demi-cercle.<\/p>\n            <div class=\"pvc-formula\">(L \u00d7 l) + (3,14 \u00d7 Rayon\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\">Divisez la piscine en deux rectangles distincts, calculez les deux, puis additionnez les r\u00e9sultats.<\/p>\n            <div class=\"pvc-formula\">Aire A + Aire B<\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"pvc-tip\">\n        <strong>Astuce de pro\u00a0:<\/strong> Lors du calcul pour la finition (peinture ou couche sup\u00e9rieure), multipliez toujours la surface finale par le nombre de couches (2 au minimum, 3 recommand\u00e9es) pour vous assurer de commander suffisamment de mat\u00e9riel\u00a0!\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>V\u00e9rifier la surface int\u00e9rieure et le plan d\u2019eau<\/h2><p>Le rectangle inclut le fond inclin\u00e9. Les autres formes sont des approximations sans marches, banquettes ni arrondis. Faites mesurer avant toute commande.<\/p><p>Saisir les d\u00e9cimales avec un point (ex. 1.5). Gallons am\u00e9ricains sauf indication contraire. Montants en dollars am\u00e9ricains (USD).<\/p><form><label>Longueur (ft)<input type=\"number\" name=\"l\" value=\"32\" min=\"0\" step=\"any\" required><\/label><label>Largeur (ft)<input type=\"number\" name=\"b\" value=\"16\" min=\"0\" step=\"any\" required><\/label><label>Profondeur faible (ft)<input type=\"number\" name=\"s\" value=\"3\" min=\"0\" step=\"any\" required><\/label><label>Profondeur maximale (ft)<input type=\"number\" name=\"d\" value=\"6\" min=\"0\" step=\"any\" required><\/label><button type=\"submit\">Calculer<\/button><button type=\"reset\">R\u00e9initialiser<\/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\": \"Calculer\", \"reset\": \"R\u00e9initialiser\", \"format\": \"Saisir les d\u00e9cimales avec un point (ex. 1.5). Gallons am\u00e9ricains sauf indication contraire.\", \"error\": \"Renseignez tous les champs avec des valeurs non n\u00e9gatives. Volume, d\u00e9bit et dimensions doivent \u00eatre positifs.\", \"unreachable\": \"Cette eau de remplissage ne permet pas d\u2019atteindre la cible.\", \"day\": \"Par jour\", \"month\": \"Pour 30 jours\", \"hours\": \"heures\", \"water\": \"Surface du plan d\u2019eau\", \"interior\": \"Surface int\u00e9rieure, fond et parois\", \"replace\": \"Remplacement en une fois\", \"stages\": \"\u00c9tapes identiques de remplacement\", \"total\": \"Eau totale utilis\u00e9e\", \"flow\": \"D\u00e9bit mesur\u00e9 du tuyau\", \"time\": \"Dur\u00e9e de remplissage estim\u00e9e\", \"target\": \"Cible temporaire de chlore libre\", \"dose\": \"Quantit\u00e9 de chlore liquide\", \"budget\": \"Budget du projet avec r\u00e9serve\", \"invalid\": \"Cet objectif ne tient pas dans une journ\u00e9e de 24 heures.\", \"review\": \"V\u00e9rifiez les mesures, corrigez un seul param\u00e8tre \u00e0 la fois, faites circuler puis contr\u00f4lez de nouveau. Le rev\u00eatement, le syst\u00e8me de d\u00e9sinfection et l\u2019\u00e9tiquette d\u00e9terminent les cibles.\", \"schedule\": \"Programme quotidien \u00e0 plusieurs vitesses\", \"off\": \"Arr\u00eat\", \"equal\": \"Comparaison \u00e0 volume d\u2019eau \u00e9gal\", \"units\": \"US gal ; ft ; GPM ; W ; $\/kWh\", \"title\": [\"Dur\u00e9e quotidienne et co\u00fbt \u00e9lectrique\", \"V\u00e9rifier la surface int\u00e9rieure et le plan d\u2019eau\", \"Remplacer l\u2019eau pour r\u00e9duire une concentration\", \"Mesurer le d\u00e9bit du tuyau\", \"Compl\u00e9ment SLAM selon le CYA\", \"Ordre des corrections chimiques\", \"Budget d\u00e9taill\u00e9 du projet\"], \"labels\": [\"Volume du bassin (US gal)\", \"D\u00e9bit mesur\u00e9 (GPM)\", \"\u00c9quivalents de volume par jour\", \"Dur\u00e9e minimale des \u00e9quipements (h)\", \"Puissance mesur\u00e9e (W)\", \"Tarif \u00e9lectrique ($\/kWh)\", \"Longueur (ft)\", \"Largeur (ft)\", \"Profondeur faible (ft)\", \"Profondeur maximale (ft)\", \"Concentration actuelle (ppm)\", \"Concentration cible (ppm)\", \"Concentration de l\u2019eau neuve (ppm)\", \"Nombre d\u2019\u00e9tapes identiques (1\u201310)\", \"Volume du seau (US gal)\", \"Temps pour remplir le seau (s)\", \"CYA (ppm)\", \"Chlore libre actuel (ppm)\", \"Concentration du chlore liquide (%)\", \"Alcalinit\u00e9 totale (ppm)\", \"pH\", \"Duret\u00e9 calcique (ppm)\", \"Bassin et \u00e9quipements standard ($)\", \"Terrassement ($)\", \"Plage de piscine ($)\", \"Permis et \u00e9tudes ($)\", \"\u00c9quipements optionnels ($)\", \"R\u00e9serve (%)\", \"D\u00e9bit \u00e0 petite vitesse (GPM)\", \"Puissance \u00e0 petite vitesse (W)\", \"D\u00e9bit \u00e0 vitesse moyenne (GPM)\", \"Puissance \u00e0 vitesse moyenne (W)\", \"Dur\u00e9e \u00e0 vitesse moyenne (h)\", \"D\u00e9bit \u00e0 grande vitesse (GPM)\", \"Puissance \u00e0 grande vitesse (W)\", \"Dur\u00e9e \u00e0 grande vitesse (h)\"], \"help\": [\"Utilisez des mesures r\u00e9elles. Un temps de renouvellement ne garantit pas la qualit\u00e9 de l\u2019eau ; respectez les d\u00e9bits et dur\u00e9es minimaux des \u00e9quipements.\", \"Le rectangle inclut le fond inclin\u00e9. Les autres formes sont des approximations sans marches, banquettes ni arrondis. Faites mesurer avant toute commande.\", \"Calculez une seule substance \u00e0 la fois. Avant une vidange importante, v\u00e9rifiez nappe phr\u00e9atique, structure et r\u00e8gles de rejet ; m\u00e9langez et contr\u00f4lez entre les \u00e9tapes.\", \"Cette mesure concerne le tuyau de remplissage, pas le d\u00e9bit de circulation requis. R\u00e9p\u00e9tez avec la configuration r\u00e9elle.\", \"Pour un CYA mesur\u00e9 entre 20 et 90 ppm. La cible et la dose ne remplacent pas la proc\u00e9dure SLAM compl\u00e8te. Mesurez le chlore libre avant chaque compl\u00e9ment, suivez l\u2019\u00e9tiquette et ne vous baignez pas pendant le traitement.\", \"Cette liste ne remplace pas une analyse compl\u00e8te et ne cr\u00e9e pas de recette automatique de produits.\", \"Saisissez des devis locaux. Le co\u00fbt du projet est distinct des mensualit\u00e9s de cr\u00e9dit et de l\u2019entretien.\"], \"pure\": \"Quantit\u00e9s th\u00e9oriques de CaCl\u2082 anhydre pur \u00e0 100 % ou de chlorure de calcium dihydrat\u00e9 pur ; duret\u00e9 exprim\u00e9e en ppm CaCO\u2083. Si le produit indique une fraction de CaCl\u2082 anhydre, divisez la quantit\u00e9 anhydre par cette fraction (77 % = 0.77). Ne r\u00e9appliquez pas ce facteur \u00e0 la quantit\u00e9 dihydrat\u00e9e. L\u2019hypochlorite de calcium pour traitement choc est un autre produit.\"},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(\"fr-FR\",{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\">Plus d&#8217;outils<\/div>\n    <div class=\"aiper-tl-tags\">\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-de-plage-de-piscine\/\" class=\"aiper-tl-tag\">Calculateur de plage de piscine<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-du-cout-de-renovation-du-revetement-de-piscine\/\" class=\"aiper-tl-tag\">Calculateur du co\u00fbt de r\u00e9novation du rev\u00eatement de piscine<\/a>\n      <a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-temps-remplissage-piscine\/\" class=\"aiper-tl-tag\">Calculateur de temps de remplissage de piscine<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-taux-renouvellement-piscine\/\" class=\"aiper-tl-tag\">Calculateur de taux de renouvellement de piscine<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-indice-saturation-piscine\/\" class=\"aiper-tl-tag\">Calculateur d&#8217;indice de saturation pour piscine (LSI)<\/a>\n    <\/div>\n  <\/div>\n  <div class=\"aiper-tl-section\">\n    <div class=\"aiper-tl-heading\">Articles connexes<\/div>\n    <div class=\"aiper-tl-tags\">\n      <a href=\"https:\/\/aiper.com\/blogs\/fr\/reduire-alcalinite-piscine\/\" class=\"aiper-tl-tag\">Comment r\u00e9duire l&#8217;alcalinit\u00e9 d&#8217;une piscine<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/robot-piscine-bloque-drain-principal\/\" class=\"aiper-tl-tag\">Pourquoi le robot de piscine reste bloqu\u00e9 sur le drain principal ?<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/hivernage-piscine-enterree\/\" class=\"aiper-tl-tag\">Hivernage piscine enterr\u00e9e : guide \u00e9tape par \u00e9tape<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/laisser-robot-nettoyeur-piscine-dans-eau\/\" class=\"aiper-tl-tag\">Peut-on laisser un robot nettoyeur de piscine dans l&#8217;eau ?<\/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 Choisir la forme de la piscine Choisissez la forme qui correspond le mieux \u00e0 votre piscine Rectangulaire En L Ronde Triangulaire Haricot Ovale Oblongue Romaine 2 Choisir le type de piscine Installation hors-sol ou enterr\u00e9e Hors-sol Enterr\u00e9e 3 Saisir les dimensions de la piscine Indiquez des mesures pr\u00e9cises pour un calcul exact Unit\u00e9 d\u2019entr\u00e9e\u00a0: [&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-2077","page","type-page","status-publish","hentry"],"lang":"fr","translations":{"fr":2077,"de":2076,"en":1476,"es":2078},"_links":{"self":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2077","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=2077"}],"version-history":[{"count":7,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2077\/revisions"}],"predecessor-version":[{"id":13278,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2077\/revisions\/13278"}],"wp:attachment":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/media?parent=2077"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}