{"id":2913,"date":"2026-06-17T01:44:12","date_gmt":"2026-06-17T01:44:12","guid":{"rendered":"https:\/\/aiper.com\/blogs\/?page_id=2913"},"modified":"2026-10-21T09:14:11","modified_gmt":"2026-10-21T09:14:11","slug":"calculateur-cloture","status":"publish","type":"page","link":"https:\/\/aiper.com\/blogs\/fr\/calculateur-cloture\/","title":{"rendered":"Calculateur de mat\u00e9riaux de cl\u00f4ture"},"content":{"rendered":"\n<style>#fence-calc-wrapper *, #fence-calc-wrapper *::before, #fence-calc-wrapper *::after { box-sizing: border-box; }\n#fence-calc-wrapper { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, sans-serif; max-width: 760px; margin: 20px auto; padding: 0; line-height: 1.5; --fcc-teal: #1ecad3; --fcc-teal-dark: #17a8b0; --fcc-teal-light: #e8fafa; --fcc-border: #e2e8f0; --fcc-text: #2d3748; --fcc-text-light: #5a6c7d; }\n#fence-calc-wrapper .fcc-intro { max-width: 680px; margin: 0 auto 16px; padding: 0 24px; text-align: center; color: var(--fcc-text-light); font-size: 15px; line-height: 1.5; }\n#fence-calc-wrapper .fcc-card { background: #fff; border-radius: 16px; box-shadow: 0 4px 24px rgba(0,0,0,0.07); padding: 28px 24px; margin-bottom: 20px; border: 1px solid var(--fcc-border); }\n#fence-calc-wrapper .fcc-subtitle { font-size: 0.9rem; color: var(--fcc-text-light); margin: 0 0 20px 0; }\n#fence-calc-wrapper .fcc-label { display: block; font-weight: 600; font-size: 0.9rem; color: var(--fcc-text); margin-bottom: 5px; }\n#fence-calc-wrapper .fcc-input-row { display: flex; gap: 10px; align-items: stretch; margin-bottom: 18px; }\n#fence-calc-wrapper .fcc-input-field { flex: 1; padding: 12px 14px; border: 2px solid var(--fcc-border); border-radius: 6px; font-size: 1rem; color: #2c3e50; background: #f9fafb; outline: none; width: 100%; }\n#fence-calc-wrapper .fcc-input-field:focus { border-color: #9486f7; background: #fff; color: #2c3e50; }\n#fence-calc-wrapper .fcc-unit-toggle { display: flex; background: #f1f5f9; border-radius: 6px; overflow: hidden; border: 2px solid var(--fcc-border); flex-wrap: wrap; }\n#fence-calc-wrapper .fcc-unit-btn { padding: 8px 14px; font-size: 0.85rem; font-weight: 600; cursor: pointer; border: none; background: transparent; color: var(--fcc-text-light); }\n#fence-calc-wrapper .fcc-unit-btn:focus, #fence-calc-wrapper .fcc-unit-btn:active { outline: 2px solid #9486f7; outline-offset: -2px; color: var(--fcc-text-light); }\n#fence-calc-wrapper .fcc-unit-btn.fcc-active { background: linear-gradient(135deg, #1ecad3, #9486f7); color: #fff; }\n#fence-calc-wrapper .fcc-preset-row { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; }\n#fence-calc-wrapper .fcc-preset-btn { padding: 6px 13px; font-size: 0.78rem; font-weight: 600; border-radius: 20px; border: 1.5px solid var(--fcc-border); background: #fff; color: var(--fcc-text-light); cursor: pointer; }\n#fence-calc-wrapper .fcc-preset-btn:focus, #fence-calc-wrapper .fcc-preset-btn:active { outline: 2px solid #9486f7; outline-offset: 1px; color: var(--fcc-text-light); }\n#fence-calc-wrapper .fcc-preset-btn.fcc-active { border-color: #9486f7; background: #f5f3ff; color: #2c3e50; }\n#fence-calc-wrapper .fcc-btn-row { display: flex; gap: 12px; max-width: 420px; margin: 26px auto 0; flex-wrap: wrap; }\n#fence-calc-wrapper .fcc-calculate-btn { display: block; flex: 1; min-width: 160px; padding: 14px 30px; background: linear-gradient(135deg, #1ecad3, #9486f7); color: #fff; border: none; border-radius: 999px; font-size: 16px; font-weight: 600; letter-spacing: .5px; cursor: pointer; transition: all .2s; }\n#fence-calc-wrapper .fcc-calculate-btn:hover { background: linear-gradient(135deg, #169fa6, #7b6be0); color: #fff; transform: translateY(-1px); box-shadow: 0 6px 16px rgba(148,134,247,.35); }\n#fence-calc-wrapper .fcc-calculate-btn:focus, #fence-calc-wrapper .fcc-calculate-btn:active { color: #fff; outline: none; box-shadow: 0 0 0 3px rgba(148,134,247,.45); }\n#fence-calc-wrapper .fcc-reset-btn { display: block; flex: 1; min-width: 120px; padding: 14px 20px; background: #fff; color: #5a6c7d; border: 2px solid #d1e8ea; border-radius: 999px; font-size: 16px; font-weight: 600; letter-spacing: .5px; cursor: pointer; transition: all .2s; }\n#fence-calc-wrapper .fcc-reset-btn:hover { background: #f0f7f8; border-color: #1ecad3; color: #0f8c94; }\n#fence-calc-wrapper .fcc-reset-btn:focus, #fence-calc-wrapper .fcc-reset-btn:active { background: #fff; outline: none; border-color: #9486f7; color: #0f8c94; }\n#fence-calc-wrapper .fcc-error-msg { color: #dc2626; font-size: 0.85rem; font-weight: 600; text-align: center; margin-top: 10px; display: none; }\n#fence-calc-wrapper .fcc-error-msg.fcc-visible { display: block; }\n#fence-calc-wrapper .fcc-result-area { display: none; margin-top: 25px; }\n#fence-calc-wrapper .fcc-result-area.fcc-visible { display: block; animation: fccFade 0.4s ease; }\n@keyframes fccFade { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }\n#fence-calc-wrapper .fcc-result-grid { display: flex; gap: 14px; flex-wrap: wrap; }\n#fence-calc-wrapper .fcc-result-card { flex: 1; min-width: 220px; background: linear-gradient(135deg, #f5f3ff 0%, #e8fafa 100%); border: 2px solid #9486f7; border-radius: 10px; padding: 22px 18px; text-align: center; }\n#fence-calc-wrapper .fcc-result-label { font-size: 0.82rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: #5b4ab8; margin: 0 0 8px; }\n#fence-calc-wrapper .fcc-result-amount { font-size: 2.4rem; font-weight: 800; color: #17a8b0; line-height: 1.15; }\n#fence-calc-wrapper .fcc-result-amount .fcc-unit-label { font-size: 1.1rem; }\n#fence-calc-wrapper .fcc-result-sub { margin: 6px 0 0; color: var(--fcc-text-light); font-size: 0.88rem; }\n#fence-calc-wrapper .fcc-acid-line { margin-top: 12px; padding: 8px 12px; background: #fff; border: 1px solid var(--fcc-border); border-radius: 6px; font-size: 0.82rem; color: var(--fcc-text); }\n#fence-calc-wrapper .fcc-warn { display: none; margin-top: 12px; padding: 10px 14px; background: #fff7ed; border: 1px solid #fed7aa; border-radius: 6px; color: #9a3412; font-size: 0.82rem; text-align: left; }\n#fence-calc-wrapper .fcc-warn.fcc-visible { display: block; }\n#fence-calc-wrapper .fcc-toggle-row { display: flex; justify-content: center; align-items: center; gap: 10px; margin-top: 20px; font-size: 0.85rem; color: var(--fcc-text-light); flex-wrap: wrap; }\n#fence-calc-wrapper .fcc-algebra { margin: 14px 0 0; font-size: 0.78rem; color: #8899a6; text-align: center; }\n#fence-calc-wrapper .fcc-next { margin: 14px 0 0; font-size: 0.85rem; color: var(--fcc-text-light); text-align: center; }\n#fence-calc-wrapper .fcc-next a { color: var(--fcc-teal-dark); font-weight: 600; text-decoration: none; }\n#fence-calc-wrapper .fcc-next a:hover { text-decoration: underline; }\n#fence-calc-wrapper .fcc-info-section { display: none; margin-top: 20px; }\n#fence-calc-wrapper .fcc-info-section.fcc-visible { display: block; }\n#fence-calc-wrapper .fcc-info-card { background: #fff; border: 1px solid var(--fcc-border); border-radius: 10px; padding: 20px; font-size: 0.9rem; }\n#fence-calc-wrapper .fcc-info-title { font-weight: 700; font-size: 1rem; margin-bottom: 10px; }\n#fence-calc-wrapper ol.fcc-howto-list { margin: 0; padding: 0 0 0 20px; }\n#fence-calc-wrapper ol.fcc-howto-list li { margin-bottom: 6px; }\n@media (max-width: 600px) { #fence-calc-wrapper .fcc-btn-row { flex-direction: column; max-width: 280px; } #fence-calc-wrapper .fcc-reset-btn { padding: 12px 20px; font-size: 14px; } }\n@media (max-width: 500px) { #fence-calc-wrapper .fcc-input-row { flex-direction: column; } }\n\n#fence-calc-wrapper .fcc-hide { display: none !important; }\n#fence-calc-wrapper .fcc-field { margin-bottom: 18px; }\n#fence-calc-wrapper .fcc-two-col { display: flex; gap: 14px; }\n#fence-calc-wrapper .fcc-two-col > .fcc-field { flex: 1; min-width: 0; }\n#fence-calc-wrapper .fcc-hint { font-size: 0.78rem; color: #8899a6; margin: 4px 0 0; }\n#fence-calc-wrapper .fcc-group { border: 1px solid var(--fcc-border); border-radius: 12px; padding: 18px 16px 4px; margin: 0 0 18px; background: #fcfdfe; }\n#fence-calc-wrapper .fcc-group-title { font-size: 0.78rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: #5b4ab8; margin: 0 0 14px; }\n#fence-calc-wrapper .fcc-input-field, #fence-calc-wrapper select.fcc-input-field { height: auto; margin: 0; }\n#fence-calc-wrapper .fcc-run { margin-bottom: 12px; }\n#fence-calc-wrapper .fcc-run-ctl { display: flex; gap: 10px; align-items: stretch; }\n#fence-calc-wrapper .fcc-run-del { padding: 8px 14px; font-size: 0.8rem; font-weight: 600; border-radius: 6px; border: 2px solid var(--fcc-border); background: #fff; color: var(--fcc-text-light); cursor: pointer; }\n#fence-calc-wrapper .fcc-run-del:hover { border-color: #dc2626; color: #dc2626; }\n#fence-calc-wrapper .fcc-run-del:focus, #fence-calc-wrapper .fcc-run-del:active { outline: 2px solid #9486f7; outline-offset: 1px; color: var(--fcc-text-light); background: #fff; }\n#fence-calc-wrapper .fcc-link-btn { background: none; border: none; padding: 4px 0; margin: 0 0 12px; color: #17a8b0; font-size: 0.88rem; font-weight: 700; cursor: pointer; }\n#fence-calc-wrapper .fcc-link-btn:hover { text-decoration: underline; color: #0f8c94; }\n#fence-calc-wrapper .fcc-link-btn:focus, #fence-calc-wrapper .fcc-link-btn:active { outline: 2px solid #9486f7; outline-offset: 2px; background: none; color: #17a8b0; }\n#fence-calc-wrapper .fcc-check { display: flex; align-items: center; gap: 8px; font-size: 0.88rem; color: var(--fcc-text); margin: 0 0 18px; cursor: pointer; }\n#fence-calc-wrapper .fcc-check input { width: 18px; height: 18px; accent-color: #9486f7; flex-shrink: 0; margin: 0; }\n#fence-calc-wrapper .fcc-unit-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 18px; }\n#fence-calc-wrapper .fcc-unit-row .fcc-label { margin: 0; }\n#fence-calc-wrapper details.fcc-prices { border: 1px solid var(--fcc-border); border-radius: 8px; padding: 10px 14px; margin: 0 0 18px; background: #fff; }\n#fence-calc-wrapper details.fcc-prices summary { cursor: pointer; font-weight: 600; font-size: 0.9rem; color: var(--fcc-text); }\n#fence-calc-wrapper .fcc-price-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px 14px; margin-top: 14px; }\n#fence-calc-wrapper .fcc-price-label { display: block; font-size: 0.78rem; font-weight: 600; color: var(--fcc-text-light); margin-bottom: 3px; }\n#fence-calc-wrapper .fcc-price-row .fcc-input-field { padding: 8px 10px; font-size: 0.9rem; }\n#fence-calc-wrapper .fcc-postline { margin: 16px 0 12px; font-size: 0.9rem; color: var(--fcc-text); text-align: center; font-weight: 600; }\n#fence-calc-wrapper .fcc-list { overflow-x: auto; -webkit-overflow-scrolling: touch; border: 1px solid var(--fcc-border); border-radius: 12px; }\n#fence-calc-wrapper .fcc-table { width: 100%; border-collapse: collapse; font-size: 0.85rem; min-width: 520px; }\n#fence-calc-wrapper .fcc-table thead th { background: linear-gradient(135deg, #1ecad3, #9486f7); color: #fff; font-weight: 600; font-size: 0.74rem; text-transform: uppercase; letter-spacing: 0.05em; padding: 10px; text-align: left; white-space: nowrap; }\n#fence-calc-wrapper .fcc-table tbody td { padding: 10px; border-bottom: 1px solid #eef1f5; vertical-align: top; color: var(--fcc-text); }\n#fence-calc-wrapper .fcc-table tbody tr:nth-child(even) { background: #fafcfd; }\n#fence-calc-wrapper .fcc-qty { font-weight: 800; color: #0f8c94; white-space: nowrap; }\n#fence-calc-wrapper .fcc-spec { color: var(--fcc-text-light); font-size: 0.8rem; }\n#fence-calc-wrapper .fcc-price { white-space: nowrap; text-align: right; }\n#fence-calc-wrapper tr.fcc-total-row td { font-weight: 700; text-align: right; background: #f5f3ff; }\n#fence-calc-wrapper .fcc-warn span { display: block; margin-top: 6px; }\n#fence-calc-wrapper .fcc-warn span:first-child { margin-top: 0; }\n#fence-calc-wrapper .fcc-jump { margin: 14px 0 0; font-size: 0.85rem; text-align: center; color: var(--fcc-text-light); }\n#fence-calc-wrapper .fcc-jump a { color: var(--fcc-teal-dark); font-weight: 600; text-decoration: none; }\n@media (max-width: 500px) { #fence-calc-wrapper .fcc-two-col { flex-direction: column; gap: 0; } #fence-calc-wrapper .fcc-price-grid { grid-template-columns: 1fr; } #fence-calc-wrapper .fcc-run-ctl { flex-direction: row; } }\n<\/style>\n<div id=\"fence-calc-wrapper\">\n    <p class=\"fcc-intro\">Ce calculateur de cl\u00f4ture d\u00e9termine les poteaux, traverses, lames ou panneaux, le b\u00e9ton et le co\u00fbt d&#8217;une cl\u00f4ture en bois, en PVC, en panneaux rigides m\u00e9talliques ou en grillage. Saisissez chaque c\u00f4t\u00e9 de votre cl\u00f4ture, ajoutez les portails et obtenez une liste d&#8217;achats compl\u00e8te avec une estimation du prix.<\/p>\n    <div class=\"fcc-card\">\n        <p class=\"fcc-subtitle\">Choisissez le type de cl\u00f4ture et saisissez les c\u00f4t\u00e9s. Les valeurs de d\u00e9part d\u00e9crivent une cl\u00f4ture brise-vue en bois de 20 m de long et 1,80 m de haut\u00a0: cliquez sur Calculer pour voir un exemple.<\/p>\n\n        <div class=\"fcc-field\">\n            <label class=\"fcc-label\" for=\"fcc-type\">Type de cl\u00f4ture<\/label>\n            <select id=\"fcc-type\" class=\"fcc-input-field\"><option value=\"picket\" selected>Cl\u00f4ture bois \u00e0 lames (mont\u00e9e sur place)<\/option><option value=\"wpanel\">Cl\u00f4ture bois \u00e0 panneaux (pr\u00eats \u00e0 poser)<\/option><option value=\"vinyl\">Cl\u00f4ture PVC (panneaux)<\/option><option value=\"alum\">Cl\u00f4ture m\u00e9tallique (panneaux rigides)<\/option><option value=\"chain\">Cl\u00f4ture grillage simple torsion<\/option><\/select>\n        <\/div>\n\n        <div class=\"fcc-group\">\n            <p class=\"fcc-group-title\">Trac\u00e9 de la cl\u00f4ture<\/p>\n            <div id=\"fcc-runs\"><\/div>\n            <button type=\"button\" id=\"fcc-add-run\" class=\"fcc-link-btn\">+ Ajouter un c\u00f4t\u00e9<\/button>\n            <label class=\"fcc-check\"><input type=\"checkbox\" id=\"fcc-closed\"> La cl\u00f4ture forme une boucle (le dernier c\u00f4t\u00e9 revient au premier)<\/label>\n            <div class=\"fcc-two-col\">\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-label\" for=\"fcc-gates\">Nombre de portails<\/label>\n                    <select id=\"fcc-gates\" class=\"fcc-input-field\"><option value=\"0\" selected>0<\/option><option value=\"1\">1<\/option><option value=\"2\">2<\/option><option value=\"3\">3<\/option><option value=\"4\">4<\/option><option value=\"5\">5<\/option><\/select>\n                <\/div>\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-label\" for=\"fcc-gatew\">Largeur du portail (<span class=\"fcc-u-len\">ft<\/span>)<\/label>\n                    <input type=\"number\" id=\"fcc-gatew\" class=\"fcc-input-field\" value=\"4\" min=\"0\" step=\"any\">\n                <\/div>\n            <\/div>\n            <p class=\"fcc-hint\">Incluez les ouvertures de portail dans la longueur des c\u00f4t\u00e9s. Le calculateur les retire de la cl\u00f4ture et ajoute les poteaux de portail.<\/p>\n            <div class=\"fcc-field\">\n                <label class=\"fcc-label\" for=\"fcc-attach\">Extr\u00e9mit\u00e9s fix\u00e9es \u00e0 une maison, un mur ou une cl\u00f4ture existante<\/label>\n                <select id=\"fcc-attach\" class=\"fcc-input-field\"><option value=\"0\" selected>Aucune, les deux extr\u00e9mit\u00e9s ont un poteau<\/option><option value=\"1\">Une extr\u00e9mit\u00e9<\/option><option value=\"2\">Les deux extr\u00e9mit\u00e9s<\/option><\/select>\n            <\/div>\n        <\/div>\n\n        <div class=\"fcc-group\">\n            <p class=\"fcc-group-title\">Style de cl\u00f4ture<\/p>\n            <div class=\"fcc-field\">\n                <label class=\"fcc-label\" for=\"fcc-height\">Hauteur de la cl\u00f4ture (<span class=\"fcc-u-len\">ft<\/span>)<\/label>\n                <input type=\"number\" id=\"fcc-height\" class=\"fcc-input-field\" value=\"6\" min=\"0\" step=\"any\">\n            <\/div>\n            <div class=\"fcc-preset-row\" id=\"fcc-height-presets\"><\/div>\n            <div class=\"fcc-two-col\">\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-label\" for=\"fcc-spacing\">Entraxe des poteaux ou largeur du panneau (<span class=\"fcc-u-len\">ft<\/span>)<\/label>\n                    <input type=\"number\" id=\"fcc-spacing\" class=\"fcc-input-field\" value=\"8\" min=\"0\" step=\"any\">\n                <\/div>\n                <div class=\"fcc-field\" data-show=\"picket,wpanel\">\n                    <label class=\"fcc-label\" for=\"fcc-postsel\">Section des poteaux bois<\/label>\n                    <select id=\"fcc-postsel\" class=\"fcc-input-field\"><\/select>\n                <\/div>\n            <\/div>\n            <div class=\"fcc-two-col\" data-show=\"picket\">\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-label\" for=\"fcc-rails\">Traverses par trav\u00e9e<\/label>\n                    <select id=\"fcc-rails\" class=\"fcc-input-field\"><option value=\"2\">2 traverses<\/option><option value=\"3\" selected>3 traverses<\/option><option value=\"4\">4 traverses<\/option><\/select>\n                <\/div>\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-label\" for=\"fcc-layout\">Disposition des lames<\/label>\n                    <select id=\"fcc-layout\" class=\"fcc-input-field\"><option value=\"spaced\" selected>Lames espac\u00e9es ou jointives<\/option><option value=\"bob\">Double couche \u00e0 recouvrement (2,5 cm)<\/option><\/select>\n                <\/div>\n            <\/div>\n            <div class=\"fcc-two-col\" data-show=\"picket\">\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-label\" for=\"fcc-pw\">Largeur des lames (<span class=\"fcc-u-in\">in<\/span>)<\/label>\n                    <input type=\"number\" id=\"fcc-pw\" class=\"fcc-input-field\" value=\"5.5\" min=\"0\" step=\"any\">\n                <\/div>\n                <div class=\"fcc-field\" id=\"fcc-gap-field\">\n                    <label class=\"fcc-label\" for=\"fcc-gap\">Espace entre les lames (<span class=\"fcc-u-in\">in<\/span>)<\/label>\n                    <input type=\"number\" id=\"fcc-gap\" class=\"fcc-input-field\" value=\"0.5\" min=\"0\" step=\"any\">\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"fcc-group\">\n            <p class=\"fcc-group-title\">Fondation des poteaux<\/p>\n            <div class=\"fcc-two-col\">\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-label\" for=\"fcc-hole\">Diam\u00e8tre du trou (<span class=\"fcc-u-in\">in<\/span>)<\/label>\n                    <input type=\"number\" id=\"fcc-hole\" class=\"fcc-input-field\" value=\"10\" min=\"0\" step=\"any\">\n                <\/div>\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-label\" for=\"fcc-depth\">Profondeur du trou (<span class=\"fcc-u-in\">in<\/span>)<\/label>\n                    <input type=\"number\" id=\"fcc-depth\" class=\"fcc-input-field\" value=\"24\" min=\"0\" step=\"any\">\n                <\/div>\n            <\/div>\n            <p class=\"fcc-hint\">La profondeur suit la hauteur de la cl\u00f4ture (environ un tiers, jamais moins de 60 cm). Saisissez la profondeur hors gel de votre r\u00e9gion si elle est plus grande.<\/p>\n            <div class=\"fcc-two-col\">\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-label\" for=\"fcc-bag\">Taille du sac de b\u00e9ton<\/label>\n                    <select id=\"fcc-bag\" class=\"fcc-input-field\"><\/select>\n                <\/div>\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-check\"><input type=\"checkbox\" id=\"fcc-gravel\" checked> Ajouter un lit de gravier de 15 cm<\/label>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"fcc-group\">\n            <p class=\"fcc-group-title\">Co\u00fbt et options<\/p>\n            <label class=\"fcc-check\"><input type=\"checkbox\" id=\"fcc-cost\" checked> Inclure une estimation du co\u00fbt<\/label>\n            <div id=\"fcc-cost-box\">\n                <details class=\"fcc-prices\">\n                    <summary>Modifier les prix (prix types en magasin de bricolage, en euros, \u00e0 remplacer par les v\u00f4tres)<\/summary>\n                    <div class=\"fcc-price-grid\" id=\"fcc-prices\"><\/div>\n                <\/details>\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-label\" for=\"fcc-labor\">Main-d&#8217;\u0153uvre de pose, par <span class=\"fcc-u-len\">ft<\/span> (facultatif)<\/label>\n                    <input type=\"number\" id=\"fcc-labor\" class=\"fcc-input-field\" placeholder=\"Laisser vide pour les mat\u00e9riaux seuls\" min=\"0\" step=\"any\">\n                <\/div>\n            <\/div>\n            <div class=\"fcc-two-col\">\n                <div class=\"fcc-field\" data-show=\"picket\">\n                    <label class=\"fcc-label\" for=\"fcc-waste\">Marge pour les chutes<\/label>\n                    <select id=\"fcc-waste\" class=\"fcc-input-field\"><option value=\"0\">Aucune<\/option><option value=\"5\">5%<\/option><option value=\"10\" selected>10%<\/option><option value=\"15\">15 % (terrain en pente)<\/option><\/select>\n                <\/div>\n                <div class=\"fcc-field\">\n                    <label class=\"fcc-check\"><input type=\"checkbox\" id=\"fcc-pool\"> Cette cl\u00f4ture entoure une piscine<\/label>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"fcc-btn-row\">\n            <button type=\"button\" id=\"fcc-calculate-btn\" class=\"fcc-calculate-btn\">Calculer<\/button>\n            <button type=\"button\" id=\"fcc-reset-btn\" class=\"fcc-reset-btn\">R\u00e9initialiser<\/button>\n        <\/div>\n        <p id=\"fcc-error-msg\" class=\"fcc-error-msg\"><\/p>\n\n        <div id=\"fcc-result-area\" class=\"fcc-result-area\">\n            <div class=\"fcc-result-grid\" id=\"fcc-result-grid\"><\/div>\n            <p class=\"fcc-postline\" id=\"fcc-postline\"><\/p>\n            <div class=\"fcc-list\" id=\"fcc-list\"><\/div>\n            <div id=\"fcc-warn\" class=\"fcc-warn\"><\/div>\n            <p class=\"fcc-algebra\" id=\"fcc-algebra\"><\/p>\n            <div class=\"fcc-info-card\">\n                <div class=\"fcc-info-title\">Avant de creuser ou d&#8217;acheter<\/div>\n                <ol class=\"fcc-howto-list\"><li>Renseignez-vous sur les r\u00e9seaux enterr\u00e9s (gaz, eau, \u00e9lectricit\u00e9, t\u00e9l\u00e9coms) avant de creuser, par exemple via le guichet unique des r\u00e9seaux ou votre mairie.<\/li><li>V\u00e9rifiez les r\u00e8gles d&#8217;urbanisme de votre commune (hauteur, d\u00e9claration pr\u00e9alable, PLU), le r\u00e8glement de copropri\u00e9t\u00e9 ou de lotissement, et la limite exacte de votre terrain avant de poser les poteaux.<\/li><li>Rep\u00e9rez chaque poteau avec un cordeau et des piquets, puis rev\u00e9rifiez l&#8217;entraxe avant de creuser le premier trou.<\/li><\/ol>\n            <\/div>\n        <\/div>\n    <\/div>\n    <p class=\"fcc-jump\">Besoin d&#8217;un chiffre rapide\u00a0? <a href=\"#fence-reference-table\">Acc\u00e9dez au tableau des mat\u00e9riaux de cl\u00f4ture par longueur<\/a>.<\/p>\n<\/div>\n<script>(function() {\nvar T = {\"sideLabel\": \"C\u00f4t\u00e9 {n}\u00a0: longueur ({u})\", \"runPh\": \"p. ex. 10\", \"remove\": \"Retirer\", \"removeAria\": \"Retirer ce c\u00f4t\u00e9\", \"postS_imp\": \"9 \u00d7 9 cm\", \"postL_imp\": \"12 \u00d7 12 cm\", \"postS_met\": \"9 \u00d7 9 cm\", \"postL_met\": \"12 \u00d7 12 cm\", \"p_post\": \"Poteau (l'unit\u00e9)\", \"p_rail\": \"Traverse (l'unit\u00e9)\", \"p_picket\": \"Lame (l'unit\u00e9)\", \"p_fasteners\": \"Vis (l'unit\u00e9)\", \"p_concrete\": \"Sac de b\u00e9ton (l'unit\u00e9)\", \"p_gravel\": \"Sac de gravier, 14 L (l'unit\u00e9)\", \"p_gate\": \"Portail (l'unit\u00e9)\", \"p_panel\": \"Panneau (l'unit\u00e9)\", \"p_lpost\": \"Poteau interm\u00e9diaire (l'unit\u00e9)\", \"p_tpost\": \"Poteau d'angle, d'extr\u00e9mit\u00e9 ou de portail (l'unit\u00e9)\", \"p_fabric\": \"Rouleau de grillage, 25 m (l'unit\u00e9)\", \"p_tbar\": \"Tension bar (each)\", \"p_tband\": \"Tension band (each)\", \"p_bband\": \"Brace band (each)\", \"p_cap\": \"Capuchon de poteau (l'unit\u00e9)\", \"p_ties\": \"Fil d'attache, rouleau (l'unit\u00e9)\", \"p_strut\": \"Jambe de force (l'unit\u00e9)\", \"p_wire\": \"Fil de tension, rouleau de 50 m (l'unit\u00e9)\", \"err_length\": \"Saisissez la longueur d'au moins un c\u00f4t\u00e9 de la cl\u00f4ture.\", \"err_height\": \"Saisissez la hauteur de la cl\u00f4ture.\", \"err_spacing\": \"Saisissez l'entraxe des poteaux (ou la largeur des panneaux).\", \"err_gatew\": \"Saisissez la largeur du portail.\", \"err_gates\": \"Les ouvertures de portail sont aussi longues que toute la cl\u00f4ture. Allongez la cl\u00f4ture ou r\u00e9duisez le nombre de portails.\", \"err_hole\": \"Le trou doit \u00eatre plus large que le poteau. Augmentez le diam\u00e8tre du trou.\", \"err_depth\": \"Le trou doit \u00eatre plus profond que le lit de gravier. Augmentez la profondeur ou d\u00e9cochez le lit de gravier.\", \"err_picket\": \"Saisissez la largeur des lames.\", \"estCost\": \"Co\u00fbt estim\u00e9\", \"matOnly\": \"Mat\u00e9riaux seuls, aux prix que vous avez saisis\", \"matLabor\": \"Mat\u00e9riaux {a} + pose {b}\", \"costPerFt\": \"Co\u00fbt par pied\", \"costPerM\": \"Co\u00fbt par m\u00e8tre\", \"forLen\": \"pour {n} {u} de cl\u00f4ture\", \"cardPosts\": \"Poteaux\", \"cardSections\": \"Trav\u00e9es\", \"cardPanels\": \"Panneaux\", \"cardBetween\": \"entre les poteaux, portails non compris\", \"pLine\": \"{n} interm\u00e9diaires\", \"pCorner\": \"{n} d'angle\", \"pEnd\": \"{n} d'extr\u00e9mit\u00e9\", \"pGate\": \"{n} de portail\", \"gatesOne\": \" plus {n} ouverture de portail\", \"gatesMany\": \" plus {n} ouvertures de portail\", \"postLine\": \"Poteaux\u00a0: {total} au total ({parts}). {sections} trav\u00e9es{gates}.\", \"thItem\": \"Article\", \"thQty\": \"Qt\u00e9\", \"thDetails\": \"D\u00e9tails\", \"thEach\": \"Prix unitaire\", \"thCost\": \"Co\u00fbt\", \"matSub\": \"Sous-total mat\u00e9riaux\", \"labor\": \"Pose\", \"total\": \"Total\", \"postType_vinyl\": \"PVC 10 \u00d7 10 cm\", \"postType_alum\": \"m\u00e9tal 6 \u00d7 4 cm\", \"postType_wpanel\": \"\", \"postType_picket\": \"\", \"postType_chain\": \"\", \"railPreImp\": \"\", \"railPreMet\": \"\", \"l_post\": \"Poteaux\", \"s_post\": \"Poteaux {post}, {len} de long ({depth} dans le sol)\", \"l_lpost\": \"Poteaux interm\u00e9diaires\", \"s_lpost\": \"Poteaux ronds, {len} de long ({depth} dans le sol)\", \"l_tpost\": \"Poteaux d'angle, d'extr\u00e9mit\u00e9 et de portail\", \"s_tpost\": \"Poteaux renforc\u00e9s, {len} de long\", \"l_toprail\": \"Top rail\", \"s_toprail\": \"10.5 ft lengths\", \"l_rail\": \"Traverses\", \"s_rail\": \"Traverses de {len}, {n} par trav\u00e9e\", \"l_picket\": \"Lames\", \"s_bob\": \"Double couche \u00e0 recouvrement, {w} de large, 2,5 cm de recouvrement\", \"s_picket\": \"{w} de large, espac\u00e9es de {g}\", \"l_fasteners\": \"Vis\", \"s_fasteners\": \"2 par lame et par traverse\", \"l_panel\": \"Panneaux\", \"s_panel\": \"{w} de large, {h} de haut (un par trav\u00e9e)\", \"l_fabric\": \"Grillage\", \"s_fabric\": \"Rouleaux de 25 m, {h} de haut\", \"l_tbar\": \"Tension bars\", \"s_tbar\": \"One at each fabric end\", \"l_tband\": \"Tension bands\", \"s_tband\": \"{n} per tension bar\", \"l_bband\": \"Brace bands and rail ends\", \"s_bband\": \"One per tension bar\", \"l_strut\": \"Jambes de force\", \"s_strut\": \"Une par c\u00f4t\u00e9 de poteau d'angle, d'extr\u00e9mit\u00e9 ou de portail\", \"l_wire\": \"Fil de tension\", \"s_wire\": \"{n} lignes le long de la cl\u00f4ture, rouleaux de 50 m\", \"l_cap\": \"Capuchons de poteau\", \"s_cap\": \"Un par poteau\", \"l_ties\": \"Fil d'attache\", \"s_ties\": \"Rouleaux de 50 m\", \"s_ties_eu\": \"Rouleaux de 50 m\", \"l_concrete\": \"B\u00e9ton pr\u00eat \u00e0 l'emploi\", \"s_concrete\": \"Sacs de {bag}, {vol} de b\u00e9ton (volume du poteau d\u00e9duit)\", \"l_gravel\": \"Lit de gravier\", \"s_gravel\": \"15 cm sous chaque poteau, {vol}\", \"l_gate\": \"Portails\", \"s_gate\": \"{w} de large, avec gonds et loquet\", \"w_waste\": \"Les lames, traverses et vis incluent {n} % de marge pour les chutes et les erreurs. Les poteaux, panneaux et le b\u00e9ton sont compt\u00e9s en unit\u00e9s enti\u00e8res.\", \"w_tall\": \"Une cl\u00f4ture de plus de 2 m demande souvent une autorisation ou une d\u00e9rogation. V\u00e9rifiez les r\u00e8gles locales avant d'acheter.\", \"w_spacing\": \"Au-del\u00e0 de 2,5 m d'entraxe, les traverses fl\u00e9chissent. Pr\u00e9voyez 2 \u00e0 2,5 m pour une cl\u00f4ture bois \u00e0 lames.\", \"w_gate\": \"Un portail de plus de 1,2 m de large charge fortement le poteau de gonds. Utilisez-y un poteau de 12 \u00d7 12 cm ou un poteau acier, scell\u00e9 dans davantage de b\u00e9ton.\", \"w_attach1\": \"L'extr\u00e9mit\u00e9 fix\u00e9e \u00e0 une maison ou \u00e0 un mur demande une fixation murale (\u00e9querre ou chevron fix\u00e9 au mur) \u00e0 la place d'un poteau.\", \"w_attach2\": \"Les extr\u00e9mit\u00e9s fix\u00e9es \u00e0 une maison ou \u00e0 un mur demandent une fixation murale (\u00e9querre ou chevron fix\u00e9 au mur) \u00e0 la place d'un poteau.\", \"w_shallow\": \"Un trou de moins de 60 cm de profondeur peut laisser pencher une cl\u00f4ture aussi haute. Dans les r\u00e9gions froides, placez les poteaux sous la limite du gel.\", \"w_pool\": \"Barri\u00e8re de piscine\u00a0: la norme fran\u00e7aise NF P90-306 sur les barri\u00e8res de protection demande une hauteur d'au moins 1,10 m, des espaces de 10 cm au maximum entre les \u00e9l\u00e9ments et un portillon \u00e0 verrouillage. V\u00e9rifiez que votre installation respecte la r\u00e9glementation en vigueur.\", \"w_poolLow\": \"Votre cl\u00f4ture mesure moins de {h} m.\", \"w_poolGap\": \"L'espace entre vos lames est de 10 cm ou plus.\", \"algebra\": \"Chaque c\u00f4t\u00e9 est divis\u00e9 par l'entraxe de {sp} et arrondi au nombre entier de trav\u00e9es{gates} = {sections} trav\u00e9es. Poteaux = {segments} segments {loop}{wall} = {posts}.\", \"alg_gates\": \" (ouvertures de portail retir\u00e9es des c\u00f4t\u00e9s les plus longs)\", \"alg_loop\": \"(boucle ferm\u00e9e, donc pas de poteau d'extr\u00e9mit\u00e9 en plus)\", \"alg_wall1\": \" - {n} extr\u00e9mit\u00e9 au mur\", \"alg_wall2\": \" - {n} extr\u00e9mit\u00e9s au mur\"};\nvar LOC = {\"locale\": \"fr-FR\", \"currency\": \"EUR\", \"metricOnly\": true, \"nbsp\": true, \"tallFt\": 6.561679790026246, \"maxSpacingFt\": 8.234908136482938, \"wideGateFt\": 3.9370078740157477, \"poolMinM\": 1.1, \"poolGapCm\": 10, \"runDefM\": 20, \"hDefM\": 1.8, \"gateWM\": 1.0, \"bagDefM\": \"25\", \"presetsM\": [1.0, 1.2, 1.5, 1.8, 2.0], \"model\": {\"eu\": true, \"woodPostMet\": {\"s\": 3.54, \"l\": 4.72}, \"chainLine\": 1.5, \"chainTerm\": 1.9, \"rollFt\": 82.02099737532808, \"railStdM\": [2.5, 3.0, 4.0, 5.0], \"postStdM\": [1.5, 1.8, 2.1, 2.4, 2.7, 3.0, 3.6, 4.2], \"typeOv\": {\"picket\": {\"spacingM\": 2.5}, \"wpanel\": {\"spacingM\": 1.8}, \"vinyl\": {\"spacingM\": 1.8, \"postW\": 3.94, \"holeD\": 10}, \"alum\": {\"spacingM\": 2.5, \"postW\": 2.36, \"holeD\": 8}, \"chain\": {\"spacingM\": 2.5, \"holeD\": 8}}}};\nvar FENCE_MODEL = (function () {\n    var PI = Math.PI;\n    var EPS = 1e-9;\n\n    \/\/ grp: which option group the type uses. postSq: square posts (else round).\n    var TYPES = {\n        picket: { name: 'Wood picket fence (built on site)', grp: 'picket', spacing: 8, spacingM: 2.4, wood: true },\n        wpanel: { name: 'Wood panel fence (prefab panels)', grp: 'panel', spacing: 8, spacingM: 2.4, wood: true },\n        vinyl: { name: 'Vinyl fence (panels)', grp: 'panel', spacing: 8, spacingM: 2.4, postW: 5, holeD: 12 },\n        alum: { name: 'Aluminum \/ ornamental fence (panels)', grp: 'panel', spacing: 6, spacingM: 1.8, postW: 2, holeD: 8 },\n        chain: { name: 'Chain link fence', grp: 'chain', spacing: 10, spacingM: 3, holeD: 10 }\n    };\n    var POST_STD = {\n        picket: [6, 8, 10, 12, 14, 16], wpanel: [6, 8, 10, 12, 14, 16], vinyl: [7, 8, 9, 10, 12],\n        alum: [4, 5, 6, 7, 8, 9, 10], chain: [5, 6, 7, 8, 9, 10, 12]\n    };\n    var POST_STD_M = [1.5, 1.8, 2.1, 2.4, 2.7, 3, 3.6, 4.2, 4.8].map(function (m) { return m \/ 0.3048; });\n    var RAIL_STD = [8, 10, 12, 16];\n    var RAIL_STD_M = [2.4, 3, 3.6, 4.8].map(function (m) { return m \/ 0.3048; });\n    \/\/ concrete bag yield in cubic feet (80 lb = 0.6 ft3, about 2.135 kg per litre for the metric bags)\n    var BAGS_IMP = [{ v: '50', label: '50 lb', y: 0.375 }, { v: '60', label: '60 lb', y: 0.45 }, { v: '80', label: '80 lb', y: 0.6 }];\n    var BAGS_MET = [{ v: '20', label: '20 kg', y: 9.37 \/ 28.3168 }, { v: '25', label: '25 kg', y: 11.71 \/ 28.3168 }, { v: '40', label: '40 kg', y: 18.74 \/ 28.3168 }];\n    var WOOD_POST_IN = { s: 3.5, l: 5.5 };\n    var WOOD_POST_IN_MET = { s: 3.94, l: 5.91 };\n    var GRAVEL_IN = 6;\n    \/\/ locale overrides (EU pages): typeOv, woodPostMet, chainLine\/chainTerm (in), rollFt, postStdM, railStdM, eu\n    var L = { eu: false, woodPostMet: WOOD_POST_IN_MET, chainLine: 2.375, chainTerm: 2.875, rollFt: 50, railLen: 10.5 };\n    function setLocale(loc) {\n        for (var k in loc) { if (k !== 'typeOv') L[k] = loc[k]; }\n        if (loc.typeOv) { for (var t in loc.typeOv) { for (var f in loc.typeOv[t]) TYPES[t][f] = loc.typeOv[t][f]; } }\n        if (loc.postStdM) POST_STD_M = loc.postStdM.map(function (m) { return m \/ 0.3048; });\n        if (loc.railStdM) RAIL_STD_M = loc.railStdM.map(function (m) { return m \/ 0.3048; });\n    }\n    function woodPostIn(metric, sel) { return metric ? L.woodPostMet[sel] : WOOD_POST_IN[sel]; }\n\n    function nextStd(x, arr) {\n        for (var i = 0; i < arr.length; i++) { if (arr[i] >= x - 1e-6) return arr[i]; }\n        return arr[arr.length - 1];\n    }\n    function defDepthIn(hFt) { return Math.max(24, Math.ceil(hFt * 12 \/ 3 \/ 6 - EPS) * 6); }\n    function defRails(hFt) { return hFt <= 4 + EPS ? 2 : (hFt <= 6 + EPS ? 3 : 4); }\n    function defHoleIn(type, large) {\n        if (TYPES[type].wood) return large ? 12 : 10;\n        return TYPES[type].holeD;\n    }\n    function postBuyFt(type, hFt, depthIn, metric) {\n        return nextStd(hFt + depthIn \/ 12, metric ? POST_STD_M : POST_STD[type]);\n    }\n    function railBuyFt(spacingFt, metric) { return nextStd(spacingFt, metric ? RAIL_STD_M : RAIL_STD); }\n    function r25(x) { return Math.round(x * 4) \/ 4; }\n\n    \/\/ Typical US big-box style estimates. Editable in the calculator.\n    function defaultPrices(type, hFt, o) {\n        var p = { concrete: r25(o.bagYield * 11.5), gravel: 5.5 };\n        var pf = o.postBuyFt, s = o.spacingFt;\n        if (L.eu) return euPrices(type, hFt, o);\n        if (type === 'picket') {\n            p.post = r25(pf * (o.large ? 4.2 : 2)); p.rail = r25(o.railBuyFt * 0.75); p.picket = r25(0.6 * hFt);\n            p.fasteners = 0.04; p.gate = 75;\n        } else if (type === 'wpanel') {\n            p.post = r25(pf * (o.large ? 4.2 : 2)); p.panel = r25(15 * hFt * s \/ 8); p.gate = 110;\n        } else if (type === 'vinyl') {\n            p.post = r25(pf * 5); p.panel = r25(22 * hFt * s \/ 8); p.gate = 220;\n        } else if (type === 'alum') {\n            p.post = r25(pf * 3.4); p.panel = r25(18 * hFt * s \/ 6); p.gate = 180;\n        } else {\n            p.lpost = r25(pf * 3.2); p.tpost = r25(pf * 4.5); p.rail = 15; p.fabric = r25(28 * hFt);\n            p.tbar = 6; p.tband = 1.25; p.bband = 1.5; p.cap = 1.75; p.ties = 0.12; p.gate = r25(25 * hFt);\n        }\n        return p;\n    }\n    \/\/ Typical EU store prices in EUR (heights\/lengths converted to metres)\n    function euPrices(type, hFt, o) {\n        var hM = hFt * 0.3048, sM = o.spacingFt * 0.3048, pM = o.postBuyFt * 0.3048;\n        var p = { concrete: Math.round(o.bagYield * 9.5 * 4) \/ 4, gravel: 4 };\n        if (type === 'picket') {\n            p.post = r25(pM * (o.large ? 10.5 : 5)); p.rail = r25(o.railBuyFt * 0.3048 * 1.7); p.picket = r25(1.8 * hM);\n            p.fasteners = 0.05; p.gate = 120;\n        } else if (type === 'wpanel') {\n            p.post = r25(pM * (o.large ? 10.5 : 5)); p.panel = r25(23 * hM * sM); p.gate = 140;\n        } else if (type === 'vinyl') {\n            p.post = r25(pM * 12); p.panel = r25(43 * hM * sM); p.gate = 250;\n        } else if (type === 'alum') {\n            p.post = r25(pM * 4.5); p.panel = r25(16.5 * hM * sM); p.gate = 150;\n        } else {\n            p.lpost = r25(pM * 3); p.tpost = r25(pM * 4.2); p.strut = 6; p.fabric = r25(29 * hM);\n            p.wire = 12; p.ties = 6; p.cap = 1.25; p.gate = 110;\n        }\n        return p;\n    }\n    var PRICE_KEYS = {\n        picket: ['post', 'rail', 'picket', 'fasteners', 'concrete', 'gravel', 'gate'],\n        wpanel: ['post', 'panel', 'concrete', 'gravel', 'gate'],\n        vinyl: ['post', 'panel', 'concrete', 'gravel', 'gate'],\n        alum: ['post', 'panel', 'concrete', 'gravel', 'gate'],\n        chain: ['lpost', 'tpost', 'rail', 'fabric', 'tbar', 'tband', 'bband', 'cap', 'ties', 'concrete', 'gravel', 'gate']\n    };\n    function priceKeys(type) {\n        if (L.eu) {\n            if (type === 'chain') return ['lpost', 'tpost', 'strut', 'fabric', 'wire', 'ties', 'cap', 'concrete', 'gravel', 'gate'];\n        }\n        return PRICE_KEYS[type];\n    }\n\n    \/\/ c: all lengths in feet, all small dimensions in inches.\n    function model(c) {\n        var T = TYPES[c.type];\n        var runs = c.runs.filter(function (x) { return x > 0; });\n        if (!runs.length) return { err: 'length' };\n        if (!(c.hFt > 0)) return { err: 'height' };\n        var s = c.spacingFt;\n        if (!(s > 0)) return { err: 'spacing' };\n        var gates = c.gates || 0;\n        if (gates > 0) {\n            if (!(c.gateW > 0)) return { err: 'gatew' };\n        }\n        var totalLen = 0;\n        runs.forEach(function (r) { totalLen += r; });\n        var G = gates * (c.gateW || 0);\n        if (G >= totalLen - EPS) return { err: 'gates' };\n        var netLen = totalLen - G;\n\n        \/\/ place each gate in the longest remaining side, then round every side up to whole sections\n        var rem = runs.slice();\n        for (var gi = 0; gi < gates; gi++) {\n            var mi = 0;\n            for (var ri = 1; ri < rem.length; ri++) { if (rem[ri] > rem[mi]) mi = ri; }\n            rem[mi] = Math.max(0, rem[mi] - c.gateW);\n        }\n        var sumN = 0;\n        rem.forEach(function (r) { sumN += Math.ceil(r \/ s - EPS); });\n        var sections = Math.max(1, sumN);\n        var closed = runs.length >= 3 ? !!c.closed : false;\n        var segments = sections + gates;\n        var corners = closed ? runs.length : runs.length - 1;\n        var attach = closed ? 0 : Math.min(c.attach || 0, 2);\n        var totalPosts = closed ? segments : segments + 1 - attach;\n        var endP = Math.min(closed ? 0 : 2 - attach, totalPosts);\n        var cornP = Math.min(corners, totalPosts - endP);\n        var gateP = Math.min(gates * 2, totalPosts - endP - cornP);\n        var lineP = totalPosts - endP - cornP - gateP;\n\n        var dIn = c.holeDIn, depthIn = c.depthIn;\n        var gIn = c.gravel ? GRAVEL_IN : 0;\n        var wMax = T.grp === 'chain' ? L.chainTerm : (c.postWIn || 0);\n        if (!(dIn > wMax)) return { err: 'hole' };\n        var cH = depthIn - gIn;\n        if (!(cH > 0)) return { err: 'depth' };\n        var holeArea = PI \/ 4 * dIn * dIn;\n        function perPost(w, sq) { return (holeArea - (sq ? w * w : PI \/ 4 * w * w)) * cH; }\n        var conc;\n        if (T.grp === 'chain') conc = lineP * perPost(L.chainLine, false) + (totalPosts - lineP) * perPost(L.chainTerm, false);\n        else conc = totalPosts * perPost(c.postWIn, true);\n        var concFt3 = conc \/ 1728;\n        var bags = Math.ceil(concFt3 \/ c.bagYield - EPS);\n        var gravelFt3 = c.gravel ? totalPosts * holeArea * gIn \/ 1728 : 0;\n        var gravelBags = c.gravel ? Math.ceil(gravelFt3 \/ 0.5 - EPS) : 0;\n        var postFt = c.hFt + depthIn \/ 12;\n        var buyFt = postBuyFt(c.type, c.hFt, depthIn, c.metric);\n\n        var items = [];\n        function add(key, qty, extra) {\n            var it = { key: key, qty: qty };\n            for (var k in extra) it[k] = extra[k];\n            items.push(it);\n        }\n        var waste = 1 + (c.wastePct || 0) \/ 100;\n        var info = { buyFt: buyFt, postFt: postFt };\n        if (T.grp === 'picket') {\n            var rails = Math.ceil(c.rails * sections * waste - EPS);\n            var peff = c.bob ? Math.max(1, c.pwIn - 1) : c.pwIn + c.gapIn;\n            if (!(c.pwIn > 0) || !(peff > 0)) return { err: 'picket' };\n            var picketsBase = Math.ceil(netLen * 12 \/ peff - EPS);\n            var pickets = Math.ceil(picketsBase * waste - EPS);\n            info.railBuyFt = railBuyFt(s, c.metric);\n            info.peff = peff;\n            add('post', totalPosts, {});\n            add('rail', rails, {});\n            add('picket', pickets, {});\n            add('fasteners', pickets * c.rails * 2, {});\n        } else if (T.grp === 'panel') {\n            add('post', totalPosts, {});\n            add('panel', sections, {});\n        } else if (L.eu) {\n            var struts = endP + 2 * cornP + gateP;\n            var lines = c.hFt * 0.3048 > 1.0 + EPS ? 3 : 2;\n            add('lpost', lineP, {});\n            add('tpost', totalPosts - lineP, {});\n            add('strut', struts, {});\n            add('fabric', Math.max(1, Math.ceil(netLen \/ L.rollFt - EPS)), {});\n            add('wire', Math.max(1, Math.ceil(lines * netLen * 0.3048 \/ 50 - EPS)), { lines: lines });\n            add('ties', Math.max(1, Math.ceil(netLen * 0.3048 \/ 50 - EPS)), {});\n            add('cap', totalPosts, {});\n        } else {\n            var tbars = endP + 2 * cornP + gateP;\n            var tbandEach = Math.max(2, Math.ceil(c.hFt - EPS) - 1);\n            var terminals = totalPosts - lineP;\n            add('lpost', lineP, {});\n            add('tpost', terminals, {});\n            add('rail', Math.ceil(netLen \/ 10.5 - EPS), {});\n            add('fabric', Math.max(1, Math.ceil(netLen \/ L.rollFt - EPS)), {});\n            add('tbar', tbars, {});\n            add('tband', tbars * tbandEach, {});\n            add('bband', tbars, {});\n            add('cap', totalPosts, {});\n            add('ties', Math.ceil(netLen \/ 2 - EPS) + lineP * Math.ceil(c.hFt - EPS), {});\n        }\n        add('concrete', bags, { ft3: concFt3 });\n        if (c.gravel) add('gravel', gravelBags, { ft3: gravelFt3 });\n        if (gates > 0) add('gate', gates, {});\n\n        var pr = c.prices || {};\n        var materials = 0;\n        items.forEach(function (it) {\n            it.price = Number(pr[it.key]) || 0;\n            it.cost = it.price * it.qty;\n            materials += it.cost;\n        });\n        var labor = (Number(c.laborPerFt) || 0) * totalLen;\n        var total = materials + labor;\n        return {\n            err: null, items: items, info: info,\n            totalLen: totalLen, netLen: netLen, sumN: sumN, sections: sections, segments: segments, closed: closed,\n            posts: { total: totalPosts, line: lineP, corner: cornP, end: endP, gate: gateP },\n            concFt3: concFt3, bags: bags, perPostBags: (conc \/ totalPosts \/ 1728) \/ c.bagYield,\n            materials: materials, labor: labor, total: total, perFt: total \/ totalLen\n        };\n    }\n\n    return {\n        TYPES: TYPES, PRICE_KEYS: PRICE_KEYS, priceKeys: priceKeys, setLocale: setLocale, woodPostIn: woodPostIn,\n        BAGS_IMP: BAGS_IMP, BAGS_MET: BAGS_MET, GRAVEL_IN: GRAVEL_IN,\n        defDepthIn: defDepthIn, defRails: defRails, defHoleIn: defHoleIn, postBuyFt: postBuyFt, railBuyFt: railBuyFt,\n        defaultPrices: defaultPrices, model: model, nextStd: nextStd\n    };\n})();\n\n    \/\/ T (texts) and LOC (locale settings) are defined above this code by the page builder\n    var get = function (id) { return document.getElementById(id); };\n    var M = FENCE_MODEL;\n    if (LOC.model) M.setLocale(LOC.model);\n    var FT = 0.3048, CM = 2.54;\n    var S = { metric: !!LOC.metricOnly, type: 'picket', touched: {}, pTouched: {}, pVals: {} };\n    var NB = LOC.nbsp ? '\u00a0' : ' ';\n    var PRESETS_FT = LOC.presetsM ? LOC.presetsM.map(function (m) { return m \/ FT; }) : [4, 5, 6, 8];\n\n    var t = function (key, vars) {\n        var s = T[key];\n        if (s === undefined) return key;\n        if (vars) { for (var k in vars) { s = s.split('{' + k + '}').join(vars[k]); } }\n        return s;\n    };\n    var rnd = function (n, d) { var p = Math.pow(10, d); return Math.round(n * p) \/ p; };\n    var nf = function (n, max) { return Number(n).toLocaleString(LOC.locale, { maximumFractionDigits: max === undefined ? 2 : max }); };\n    var num = function (n) { return Number(n).toLocaleString(LOC.locale); };\n    var curFmt = function (d) { return new Intl.NumberFormat(LOC.locale, { style: 'currency', currency: LOC.currency, minimumFractionDigits: d, maximumFractionDigits: d }); };\n    var money = function (n) { return curFmt(2).format(n); };\n    var money0 = function (n) { return curFmt(0).format(Math.round(n)); };\n    var val = function (id) { var v = parseFloat(get(id).value); return isNaN(v) ? NaN : v; };\n\n    \/\/ unit helpers: lengths are ft (US) or m, small dimensions are in (US) or cm\n    var toFt = function (v) { return S.metric ? v \/ FT : v; };\n    var toIn = function (v) { return S.metric ? v \/ CM : v; };\n    var roundCm5 = function (inch) { return Math.round(inch * CM \/ 5) * 5; };\n    var fLen = function (ft) { return S.metric ? nf(rnd(ft * FT, 2)) + NB + 'm' : rnd(ft, 1) + ' ft'; };\n    var fIn = function (inch) { return S.metric ? Math.round(inch * CM) + NB + 'cm' : rnd(inch, 1) + ' in'; };\n\n    var curType = function () { return M.TYPES[S.type]; };\n    var isLarge = function () { return get('fcc-postsel').value === 'l'; };\n    var postWIn = function () {\n        var T0 = curType();\n        if (T0.wood) return M.woodPostIn(S.metric, get('fcc-postsel').value);\n        return T0.postW || 0;\n    };\n    var bagList = function () { return S.metric ? M.BAGS_MET : M.BAGS_IMP; };\n    var bagYield = function () {\n        var v = get('fcc-bag').value, l = bagList();\n        for (var i = 0; i < l.length; i++) { if (l[i].v === v) return l[i].y; }\n        return l[l.length - 1].y;\n    };\n    var bagLabel = function () {\n        var v = get('fcc-bag').value, l = bagList();\n        for (var i = 0; i < l.length; i++) { if (l[i].v === v) return l[i].label; }\n        return '';\n    };\n\n    \/\/ ---------------------------------------------------------------- sides (runs)\n    var runsEl = get('fcc-runs');\n    var runRows = function () { return Array.prototype.slice.call(runsEl.querySelectorAll('.fcc-run')); };\n    var renumberRuns = function () {\n        var rows = runRows();\n        rows.forEach(function (row, i) {\n            var inp = row.querySelector('.fcc-run-in'), lab = row.querySelector('.fcc-run-label');\n            inp.id = 'fcc-run-' + (i + 1);\n            lab.htmlFor = inp.id;\n            lab.textContent = t('sideLabel', { n: i + 1, u: S.metric ? 'm' : 'ft' });\n            row.querySelector('.fcc-run-del').classList.toggle('fcc-hide', rows.length < 2);\n        });\n        var closed = get('fcc-closed');\n        closed.disabled = rows.length < 3;\n        if (rows.length < 3) closed.checked = false;\n        get('fcc-add-run').classList.toggle('fcc-hide', rows.length >= 12);\n    };\n    var addRun = function (v) {\n        var row = document.createElement('div');\n        row.className = 'fcc-run';\n        row.innerHTML = '<label class=\"fcc-run-label\"><\/label>' +\n            '<div class=\"fcc-run-ctl\"><input type=\"number\" class=\"fcc-input-field fcc-run-in\" min=\"0\" step=\"any\" placeholder=\"' + t('runPh') + '\">' +\n            '<button type=\"button\" class=\"fcc-run-del\" aria-label=\"' + t('removeAria') + '\">' + t('remove') + '<\/button><\/div>';\n        if (v !== undefined) { if (v !== null) row.querySelector('.fcc-run-in').value = v; }\n        runsEl.appendChild(row);\n        renumberRuns();\n        return row;\n    };\n    runsEl.addEventListener('click', function (e) {\n        if (!e.target.classList.contains('fcc-run-del')) return;\n        runsEl.removeChild(e.target.closest('.fcc-run'));\n        renumberRuns();\n    });\n    get('fcc-add-run').onclick = function () { addRun('').querySelector('.fcc-run-in').focus(); };\n\n    \/\/ ---------------------------------------------------------------- defaults \/ visibility\n    var heightFt = function () { var h = val('fcc-height'); return isNaN(h) ? NaN : toFt(h); };\n    var setSelectOptions = function (sel, list, keep, dflt) {\n        var cur = sel.value;\n        sel.innerHTML = '';\n        list.forEach(function (o) {\n            var op = document.createElement('option');\n            op.value = o.v; op.textContent = o.label;\n            sel.appendChild(op);\n        });\n        var has = keep ? list.some(function (o) { return o.v === cur; }) : false;\n        sel.value = has ? cur : (dflt || list[list.length - 1].v);\n    };\n    var presetLabel = function (ft) { return S.metric ? nf(rnd(ft * FT, 1), 1) + NB + 'm' : ft + ' ft'; };\n    var buildPresets = function () {\n        var box = get('fcc-height-presets');\n        box.innerHTML = '';\n        PRESETS_FT.forEach(function (ft) {\n            var b = document.createElement('button');\n            b.type = 'button'; b.className = 'fcc-preset-btn'; b.dataset.ft = String(ft);\n            box.appendChild(b);\n        });\n    };\n    var syncUnitLabels = function () {\n        Array.prototype.forEach.call(document.querySelectorAll('#fence-calc-wrapper .fcc-u-len'), function (el) { el.textContent = S.metric ? 'm' : 'ft'; });\n        Array.prototype.forEach.call(document.querySelectorAll('#fence-calc-wrapper .fcc-u-in'), function (el) { el.textContent = S.metric ? 'cm' : 'in'; });\n        Array.prototype.forEach.call(get('fcc-height-presets').children, function (b) { b.textContent = presetLabel(parseFloat(b.dataset.ft)); });\n        setSelectOptions(get('fcc-postsel'), S.metric ?\n            [{ v: 's', label: T.postS_met }, { v: 'l', label: T.postL_met }] :\n            [{ v: 's', label: T.postS_imp }, { v: 'l', label: T.postL_imp }], true);\n        setSelectOptions(get('fcc-bag'), bagList(), true, S.metric ? (LOC.bagDefM || '25') : '80');\n        if (!LOC.metricOnly) {\n            get('fcc-unit-toggle').children[0].classList.toggle('fcc-active', !S.metric);\n            get('fcc-unit-toggle').children[1].classList.toggle('fcc-active', S.metric);\n        }\n        renumberRuns();\n    };\n    var syncPresets = function () {\n        var h = heightFt();\n        Array.prototype.forEach.call(get('fcc-height-presets').children, function (b) {\n            b.classList.toggle('fcc-active', Math.abs(parseFloat(b.dataset.ft) - h) < 0.15);\n        });\n    };\n    var showGroups = function () {\n        Array.prototype.forEach.call(document.querySelectorAll('#fence-calc-wrapper [data-show]'), function (el) {\n            el.classList.toggle('fcc-hide', el.dataset.show.split(',').indexOf(S.type) < 0);\n        });\n    };\n    \/\/ values that follow the fence height \/ type until the user edits them\n    var applyAuto = function () {\n        var hFt = heightFt();\n        if (isNaN(hFt) || hFt <= 0) return;\n        if (!S.touched['fcc-depth']) { var dIn = M.defDepthIn(hFt); get('fcc-depth').value = S.metric ? roundCm5(dIn) : dIn; }\n        if (!S.touched['fcc-rails']) get('fcc-rails').value = String(M.defRails(hFt));\n        if (!S.touched['fcc-hole']) { var hIn = M.defHoleIn(S.type, isLarge()); get('fcc-hole').value = S.metric ? roundCm5(hIn) : hIn; }\n    };\n    var setTypeDefaults = function () {\n        var T0 = curType();\n        get('fcc-spacing').value = S.metric ? T0.spacingM : T0.spacing;\n        S.touched['fcc-spacing'] = false; S.touched['fcc-hole'] = false;\n        S.pTouched = {}; S.pVals = {};\n        showGroups();\n        applyAuto();\n        renderPrices();\n    };\n\n    \/\/ ---------------------------------------------------------------- prices\n    var renderPrices = function () {\n        var hFt = heightFt(), sp = toFt(val('fcc-spacing')), dIn = toIn(val('fcc-depth'));\n        if (isNaN(hFt) || hFt <= 0 || isNaN(sp) || sp <= 0 || isNaN(dIn) || dIn <= 0) return;\n        var def = M.defaultPrices(S.type, hFt, {\n            postBuyFt: M.postBuyFt(S.type, hFt, dIn, S.metric), large: isLarge(), spacingFt: sp,\n            railBuyFt: M.railBuyFt(sp, S.metric), bagYield: bagYield()\n        });\n        var box = get('fcc-prices');\n        box.innerHTML = '';\n        M.priceKeys(S.type).forEach(function (k) {\n            var v = S.pTouched[k] ? S.pVals[k] : def[k];\n            var row = document.createElement('div');\n            row.className = 'fcc-price-row';\n            row.innerHTML = '<label class=\"fcc-price-label\" for=\"fcc-p-' + k + '\">' + t('p_' + k) + '<\/label>' +\n                '<input type=\"number\" class=\"fcc-input-field fcc-price-in\" id=\"fcc-p-' + k + '\" data-key=\"' + k + '\" min=\"0\" step=\"0.01\">';\n            box.appendChild(row);\n            row.querySelector('input').value = v;\n        });\n    };\n    get('fcc-prices').addEventListener('input', function (e) {\n        var k = e.target.dataset.key;\n        if (!k) return;\n        S.pTouched[k] = true;\n        S.pVals[k] = e.target.value;\n    });\n    var readPrices = function () {\n        var o = {};\n        Array.prototype.forEach.call(get('fcc-prices').querySelectorAll('.fcc-price-in'), function (el) { o[el.dataset.key] = parseFloat(el.value) || 0; });\n        return o;\n    };\n\n    \/\/ ---------------------------------------------------------------- events\n    ['fcc-depth', 'fcc-rails', 'fcc-hole', 'fcc-spacing'].forEach(function (id) {\n        get(id).addEventListener('input', function () { S.touched[id] = true; if (id !== 'fcc-rails') renderPrices(); });\n    });\n    get('fcc-rails').addEventListener('change', function () { S.touched['fcc-rails'] = true; });\n    get('fcc-height').addEventListener('input', function () { applyAuto(); syncPresets(); renderPrices(); });\n    get('fcc-height-presets').addEventListener('click', function (e) {\n        if (!e.target.dataset.ft) return;\n        var ft = parseFloat(e.target.dataset.ft);\n        get('fcc-height').value = S.metric ? rnd(ft * FT, 1) : ft;\n        applyAuto(); syncPresets(); renderPrices();\n    });\n    get('fcc-postsel').addEventListener('change', function () { applyAuto(); renderPrices(); });\n    get('fcc-bag').addEventListener('change', renderPrices);\n    get('fcc-type').addEventListener('change', function () { S.type = get('fcc-type').value; setTypeDefaults(); hideResults(); });\n    get('fcc-layout').addEventListener('change', function () { get('fcc-gap-field').classList.toggle('fcc-hide', get('fcc-layout').value === 'bob'); });\n    get('fcc-cost').addEventListener('change', function () { get('fcc-cost-box').classList.toggle('fcc-hide', !get('fcc-cost').checked); });\n\n    if (!LOC.metricOnly) get('fcc-unit-toggle').onclick = function (e) {\n        var m = e.target.dataset.unit;\n        if (!m) return;\n        var toMetric = m === 'metric';\n        if (toMetric === S.metric) return;\n        var lenFn = toMetric ? function (v) { return rnd(v * FT, 2); } : function (v) { return rnd(v \/ FT, 1); };\n        var inFn = toMetric ? function (v) { return rnd(v * CM, 1); } : function (v) { return rnd(v \/ CM, 2); };\n        var conv = function (id, fn) { var el = get(id), v = parseFloat(el.value); if (!isNaN(v)) el.value = fn(v); };\n        \/\/ fields that still hold the starting value switch to the starting value of the other system\n        var pairs = { 'fcc-gatew': [4, 1.2], 'fcc-pw': [5.5, 14], 'fcc-gap': [0.5, 1] };\n        Object.keys(pairs).forEach(function (id) {\n            var el = get(id), v = parseFloat(el.value), p = pairs[id];\n            if (isNaN(v)) return;\n            if (Math.abs(v - p[S.metric ? 1 : 0]) < 1e-6) el.value = p[toMetric ? 1 : 0];\n            else el.value = (id === 'fcc-gatew' ? lenFn : inFn)(v);\n        });\n        var h = heightFt();\n        var hp = null;\n        PRESETS_FT.forEach(function (ft) { if (Math.abs(ft - h) < 0.15) hp = ft; });\n        if (hp !== null) get('fcc-height').value = toMetric ? rnd(hp * FT, 1) : hp;\n        else conv('fcc-height', lenFn);\n        Array.prototype.forEach.call(document.querySelectorAll('#fcc-runs .fcc-run-in'), function (el) { var v = parseFloat(el.value); if (!isNaN(v)) el.value = lenFn(v); });\n        var spTouched = S.touched['fcc-spacing'];\n        if (spTouched) conv('fcc-spacing', lenFn);\n        ['fcc-hole', 'fcc-depth'].forEach(function (id) { if (S.touched[id]) conv(id, inFn); });\n        S.metric = toMetric;\n        if (!spTouched) get('fcc-spacing').value = toMetric ? curType().spacingM : curType().spacing;\n        syncUnitLabels();\n        applyAuto();\n        syncPresets(); renderPrices(); hideResults();\n    };\n\n    \/\/ ---------------------------------------------------------------- results\n    var hideResults = function () { get('fcc-result-area').classList.remove('fcc-visible'); };\n    var showError = function (msg) {\n        var err = get('fcc-error-msg');\n        err.textContent = msg;\n        err.classList.add('fcc-visible');\n        hideResults();\n    };\n    var card = function (label, amount, sub) {\n        return '<div class=\"fcc-result-card\"><p class=\"fcc-result-label\">' + label + '<\/p><div class=\"fcc-result-amount\">' + amount + '<\/div><p class=\"fcc-result-sub\">' + sub + '<\/p><\/div>';\n    };\n\n    var readCfg = function () {\n        var runs = Array.prototype.map.call(document.querySelectorAll('#fcc-runs .fcc-run-in'), function (el) { var v = parseFloat(el.value); return isNaN(v) ? 0 : toFt(v); });\n        var labor = parseFloat(get('fcc-labor').value) || 0;\n        return {\n            type: S.type, runs: runs, closed: get('fcc-closed').checked,\n            gates: parseInt(get('fcc-gates').value, 10) || 0, gateW: toFt(val('fcc-gatew')),\n            attach: parseInt(get('fcc-attach').value, 10) || 0,\n            hFt: heightFt(), spacingFt: toFt(val('fcc-spacing')),\n            postWIn: postWIn(), holeDIn: toIn(val('fcc-hole')), depthIn: toIn(val('fcc-depth')),\n            gravel: get('fcc-gravel').checked, bagYield: bagYield(),\n            rails: parseInt(get('fcc-rails').value, 10) || 2,\n            pwIn: toIn(val('fcc-pw')), gapIn: toIn(isNaN(val('fcc-gap')) ? 0 : val('fcc-gap')), bob: get('fcc-layout').value === 'bob',\n            wastePct: parseFloat(get('fcc-waste').value) || 0, metric: S.metric,\n            laborPerFt: get('fcc-cost').checked ? (S.metric ? labor * FT : labor) : 0,\n            prices: get('fcc-cost').checked ? readPrices() : {}\n        };\n    };\n\n    var postLabel = function () {\n        var T0 = curType();\n        if (T0.wood) return S.metric ? (isLarge() ? T.postL_met : T.postS_met) : (isLarge() ? '6x6' : '4x4');\n        return t('postType_' + S.type);\n    };\n    var itemRow = function (it, r, c) {\n        var spec = '', label = '';\n        var buy = r.info.buyFt;\n        var vol = function (ft3) { return S.metric ? nf(rnd(ft3 * 28.3168, 0), 0) + NB + 'L' : rnd(ft3, 1) + ' cu ft'; };\n        if (it.key === 'post') {\n            label = t('l_post');\n            spec = t('s_post', { post: postLabel(), len: fLen(buy), depth: fIn(c.depthIn) });\n        } else if (it.key === 'lpost') { label = t('l_lpost'); spec = t('s_lpost', { len: fLen(buy), depth: fIn(c.depthIn) });\n        } else if (it.key === 'tpost') { label = t('l_tpost'); spec = t('s_tpost', { len: fLen(buy) });\n        } else if (it.key === 'rail') {\n            label = S.type === 'chain' ? t('l_toprail') : t('l_rail');\n            spec = S.type === 'chain' ? t('s_toprail') : t('s_rail', { pre: S.metric ? T.railPreMet : T.railPreImp, len: fLen(r.info.railBuyFt), n: c.rails });\n        } else if (it.key === 'picket') {\n            label = t('l_picket');\n            spec = c.bob ? t('s_bob', { w: fIn(c.pwIn) }) : t('s_picket', { w: fIn(c.pwIn), g: fIn(c.gapIn) });\n        } else if (it.key === 'fasteners') { label = t('l_fasteners'); spec = t('s_fasteners');\n        } else if (it.key === 'panel') { label = t('l_panel'); spec = t('s_panel', { w: fLen(c.spacingFt), h: fLen(c.hFt) });\n        } else if (it.key === 'fabric') { label = t('l_fabric'); spec = t('s_fabric', { h: fLen(c.hFt) });\n        } else if (it.key === 'tbar') { label = t('l_tbar'); spec = t('s_tbar');\n        } else if (it.key === 'tband') { label = t('l_tband'); spec = t('s_tband', { n: Math.max(2, Math.ceil(c.hFt - 0.001) - 1) });\n        } else if (it.key === 'bband') { label = t('l_bband'); spec = t('s_bband');\n        } else if (it.key === 'strut') { label = t('l_strut'); spec = t('s_strut');\n        } else if (it.key === 'wire') { label = t('l_wire'); spec = t('s_wire', { n: it.lines });\n        } else if (it.key === 'cap') { label = t('l_cap'); spec = t('s_cap');\n        } else if (it.key === 'ties') { label = t('l_ties'); var euChain = LOC.model ? LOC.model.eu : false; spec = S.type === 'chain' ? (euChain ? t('s_ties_eu') : t('s_ties')) : t('s_ties');\n        } else if (it.key === 'concrete') { label = t('l_concrete'); spec = t('s_concrete', { bag: bagLabel(), vol: vol(it.ft3) });\n        } else if (it.key === 'gravel') { label = t('l_gravel'); spec = t('s_gravel', { vol: vol(it.ft3) });\n        } else if (it.key === 'gate') { label = t('l_gate'); spec = t('s_gate', { w: fLen(c.gateW) }); }\n        return { label: label, spec: spec };\n    };\n\n    var calc = function () {\n        var err = get('fcc-error-msg');\n        err.classList.remove('fcc-visible');\n        err.textContent = '';\n        var c = readCfg();\n        var r = M.model(c);\n        if (r.err) { showError(t('err_' + r.err)); return; }\n        var cost = get('fcc-cost').checked;\n\n        \/\/ cost \/ summary cards\n        var grid = get('fcc-result-grid');\n        var unitLen = S.metric ? 'm' : 'ft';\n        var totalDisp = S.metric ? rnd(r.totalLen * FT, 1) : rnd(r.totalLen, 1);\n        var forLen = t('forLen', { n: nf(totalDisp, 1), u: unitLen });\n        if (cost) {\n            var perDisp = S.metric ? r.perFt \/ FT : r.perFt;\n            var subCost = c.laborPerFt > 0 ? t('matLabor', { a: money0(r.materials), b: money0(r.labor) }) : t('matOnly');\n            grid.innerHTML = card(t('estCost'), '<span>' + money0(r.total) + '<\/span>', subCost) +\n                card(S.metric ? t('costPerM') : t('costPerFt'), '<span>' + money(perDisp) + '<\/span>', forLen);\n        } else {\n            grid.innerHTML = card(t('cardPosts'), '<span>' + num(r.posts.total) + '<\/span>', forLen) +\n                card(S.type === 'picket' || S.type === 'chain' ? t('cardSections') : t('cardPanels'), '<span>' + num(r.sections) + '<\/span>', t('cardBetween'));\n        }\n\n        \/\/ post breakdown\n        var pb = [];\n        if (r.posts.line) pb.push(t('pLine', { n: r.posts.line }));\n        if (r.posts.corner) pb.push(t('pCorner', { n: r.posts.corner }));\n        if (r.posts.end) pb.push(t('pEnd', { n: r.posts.end }));\n        if (r.posts.gate) pb.push(t('pGate', { n: r.posts.gate }));\n        var gtxt = c.gates ? t(c.gates > 1 ? 'gatesMany' : 'gatesOne', { n: c.gates }) : '';\n        get('fcc-postline').textContent = t('postLine', { total: num(r.posts.total), parts: pb.join(', '), sections: num(r.sections), gates: gtxt });\n\n        \/\/ shopping list\n        var head = '<tr><th>' + t('thItem') + '<\/th><th>' + t('thQty') + '<\/th><th>' + t('thDetails') + '<\/th>' + (cost ? '<th>' + t('thEach') + '<\/th><th>' + t('thCost') + '<\/th>' : '') + '<\/tr>';\n        var body = r.items.map(function (it) {\n            var d = itemRow(it, r, c);\n            return '<tr><td><strong>' + d.label + '<\/strong><\/td><td class=\"fcc-qty\">' + num(it.qty) + '<\/td><td class=\"fcc-spec\">' + d.spec + '<\/td>' +\n                (cost ? '<td class=\"fcc-price\">' + money(it.price) + '<\/td><td class=\"fcc-price\">' + money(it.cost) + '<\/td>' : '') + '<\/tr>';\n        }).join('');\n        var foot = '';\n        if (cost) {\n            var span = 4;\n            foot = '<tr class=\"fcc-total-row\"><td colspan=\"' + span + '\">' + t('matSub') + '<\/td><td class=\"fcc-price\">' + money(r.materials) + '<\/td><\/tr>';\n            if (r.labor > 0) foot += '<tr class=\"fcc-total-row\"><td colspan=\"' + span + '\">' + t('labor') + '<\/td><td class=\"fcc-price\">' + money(r.labor) + '<\/td><\/tr>' +\n                '<tr class=\"fcc-total-row\"><td colspan=\"' + span + '\">' + t('total') + '<\/td><td class=\"fcc-price\">' + money(r.total) + '<\/td><\/tr>';\n        }\n        get('fcc-list').innerHTML = '<table class=\"fcc-table\"><thead>' + head + '<\/thead><tbody>' + body + foot + '<\/tbody><\/table>';\n\n        \/\/ notes and warnings\n        var w = [];\n        var hM = c.hFt * FT;\n        if (S.type === 'picket') { if (c.wastePct > 0) w.push(t('w_waste', { n: c.wastePct })); }\n        if (c.hFt > LOC.tallFt + 0.01) w.push(t('w_tall'));\n        if (S.type === 'picket') { if (c.spacingFt > LOC.maxSpacingFt + 0.01) w.push(t('w_spacing')); }\n        if (c.gates > 0) { if (c.gateW > LOC.wideGateFt + 0.01) w.push(t('w_gate')); }\n        if (c.attach > 0) w.push(t(c.attach > 1 ? 'w_attach2' : 'w_attach1'));\n        var shallow = c.depthIn < 23.5;\n        if (shallow) shallow = c.hFt >= 4;\n        if (shallow) w.push(t('w_shallow'));\n        if (get('fcc-pool').checked) {\n            var pool = t('w_pool');\n            var low = LOC.poolMinM ? hM < LOC.poolMinM - 0.005 : false;\n            if (low) pool = t('w_poolLow', { h: nf(LOC.poolMinM, 2) }) + ' ' + pool;\n            var wideGap = S.type === 'picket' ? !c.bob : false;\n            if (wideGap) wideGap = c.gapIn * CM >= LOC.poolGapCm - 0.05;\n            if (wideGap) pool = t('w_poolGap') + ' ' + pool;\n            w.push(pool);\n        }\n        var wb = get('fcc-warn');\n        wb.innerHTML = w.map(function (m) { return '<span>' + m + '<\/span>'; }).join('');\n        wb.classList.toggle('fcc-visible', w.length > 0);\n\n        get('fcc-algebra').textContent = t('algebra', {\n            sp: fLen(c.spacingFt), gates: c.gates ? t('alg_gates') : '', sections: r.sections, segments: r.segments,\n            loop: r.closed ? t('alg_loop') : '+ 1', wall: c.attach ? t(c.attach > 1 ? 'alg_wall2' : 'alg_wall1', { n: c.attach }) : '', posts: r.posts.total\n        });\n\n        get('fcc-result-area').classList.add('fcc-visible');\n        get('fcc-result-area').scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n    };\n\n    \/\/ ---------------------------------------------------------------- reset\n    var resetAll = function () {\n        S.metric = !!LOC.metricOnly; S.type = 'picket'; S.touched = {}; S.pTouched = {}; S.pVals = {};\n        get('fcc-type').value = 'picket';\n        runsEl.innerHTML = '';\n        addRun(S.metric ? (LOC.runDefM || 30) : 100);\n        get('fcc-closed').checked = false;\n        get('fcc-gates').value = '0';\n        get('fcc-gatew').value = S.metric ? (LOC.gateWM || 1.2) : '4';\n        get('fcc-attach').value = '0';\n        get('fcc-height').value = S.metric ? (LOC.hDefM || 1.8) : '6';\n        get('fcc-layout').value = 'spaced';\n        get('fcc-pw').value = S.metric ? '14' : '5.5';\n        get('fcc-gap').value = S.metric ? '1' : '0.5';\n        get('fcc-gap-field').classList.remove('fcc-hide');\n        get('fcc-gravel').checked = true;\n        get('fcc-waste').value = '10';\n        get('fcc-pool').checked = false;\n        get('fcc-cost').checked = true;\n        get('fcc-cost-box').classList.remove('fcc-hide');\n        get('fcc-labor').value = '';\n        get('fcc-postsel').innerHTML = '';\n        get('fcc-bag').innerHTML = '';\n        syncUnitLabels();\n        get('fcc-postsel').value = 's';\n        setTypeDefaults();\n        syncPresets();\n        var err = get('fcc-error-msg');\n        err.classList.remove('fcc-visible');\n        err.textContent = '';\n        get('fcc-warn').classList.remove('fcc-visible');\n        hideResults();\n    };\n\n    get('fcc-calculate-btn').onclick = calc;\n    get('fcc-reset-btn').onclick = function () { resetAll(); var f = get('fcc-run-1'); if (f) f.focus(); };\n    buildPresets();\n    resetAll();\n\n})();<\/script>\n\n\n\n<style>\n  #fence-reference-table { max-width: 860px; margin: 2.5rem auto; font-family: 'Inter', system-ui, sans-serif; color: #2c3e50; scroll-margin-top: 80px; }\n  #fence-reference-table h2 { font-size: 1.5rem; font-weight: 700; color: #17a8b0; margin: 0 0 8px; }\n  #fence-reference-table h3 { font-size: 1.1rem; font-weight: 700; color: #5b4ab8; margin: 28px 0 6px; }\n  #fence-reference-table .fct-subtitle { font-size: 0.9rem; color: #5a6c7d; margin: 0 0 16px; line-height: 1.5; }\n  #fence-reference-table .fct-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; border: 1px solid #e0e5eb; border-radius: 14px; box-shadow: 0 4px 16px rgba(0,0,0,0.04); }\n  #fence-reference-table .fct-table { width: 100%; border-collapse: collapse; font-size: 0.88rem; min-width: 520px; }\n  #fence-reference-table .fct-table thead th { background: linear-gradient(135deg, #1ecad3, #9486f7); color: #fff; font-weight: 600; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.05em; padding: 12px 10px; text-align: center; white-space: nowrap; }\n  #fence-reference-table .fct-table thead th:first-child { border-radius: 13px 0 0 0; text-align: left; }\n  #fence-reference-table .fct-table thead th:last-child { border-radius: 0 13px 0 0; }\n  #fence-reference-table .fct-table tbody td { padding: 10px; border-bottom: 1px solid #eef1f5; vertical-align: middle; text-align: center; }\n  #fence-reference-table .fct-table tbody tr:nth-child(even) { background: #fafcfd; }\n  #fence-reference-table .fct-table tbody tr:hover { background: #e8fafb; }\n  #fence-reference-table .fct-vol { font-weight: 600; color: #2c3e50; white-space: nowrap; text-align: left; }\n  #fence-reference-table .fct-num { font-weight: 700; color: #0f8c94; white-space: nowrap; }\n  #fence-reference-table .fct-acid { font-weight: 600; color: #5b4ab8; white-space: nowrap; }\n  #fence-reference-table .fct-note { margin-top: 12px; font-size: 0.8rem; color: #8899a6; line-height: 1.5; }\n  @media (max-width: 500px) {\n    #fence-reference-table { padding: 0 6px; }\n    #fence-reference-table .fct-table { font-size: 0.78rem; min-width: 460px; }\n    #fence-reference-table .fct-table thead th { padding: 8px 6px; font-size: 0.65rem; }\n    #fence-reference-table .fct-table tbody td { padding: 7px 6px; }\n  }\n<\/style>\n<div id=\"fence-reference-table\">\n  <h2>Tableau des mat\u00e9riaux de cl\u00f4ture\u00a0: poteaux, lames et b\u00e9ton selon la longueur<\/h2>\n  <p class=\"fct-subtitle\">Rep\u00e9rez la longueur de votre cl\u00f4ture pour obtenir les quantit\u00e9s. Tous les tableaux suivent les m\u00eames r\u00e8gles que le calculateur ci-dessus, pour une cl\u00f4ture droite avec un poteau \u00e0 chaque extr\u00e9mit\u00e9, sans portail et sans marge pour les chutes. Pour des angles, des portails ou vos propres dimensions, utilisez le calculateur.<\/p>\n\n  <h3>Combien de poteaux, traverses et lames pour une cl\u00f4ture, selon la longueur (cl\u00f4ture bois brise-vue de 1,80 m)<\/h3>\n  <div class=\"fct-table-wrap\">\n    <table class=\"fct-table\">\n      <thead><tr><th>Longueur<\/th><th>Trav\u00e9es<\/th><th>Poteaux<\/th><th>Traverses (2,5 m)<\/th><th>Lames (14 cm)<\/th><th>B\u00e9ton (sacs de 25 kg)<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td class=\"fct-vol\">5\u00a0m<\/td><td class=\"fct-num\">2<\/td><td class=\"fct-num\">3<\/td><td class=\"fct-num\">6<\/td><td class=\"fct-num\">34<\/td><td class=\"fct-acid\">5<\/td><\/tr><tr><td class=\"fct-vol\">10\u00a0m<\/td><td class=\"fct-num\">4<\/td><td class=\"fct-num\">5<\/td><td class=\"fct-num\">12<\/td><td class=\"fct-num\">67<\/td><td class=\"fct-acid\">8<\/td><\/tr><tr><td class=\"fct-vol\">15\u00a0m<\/td><td class=\"fct-num\">6<\/td><td class=\"fct-num\">7<\/td><td class=\"fct-num\">18<\/td><td class=\"fct-num\">100<\/td><td class=\"fct-acid\">11<\/td><\/tr><tr><td class=\"fct-vol\">20\u00a0m<\/td><td class=\"fct-num\">8<\/td><td class=\"fct-num\">9<\/td><td class=\"fct-num\">24<\/td><td class=\"fct-num\">134<\/td><td class=\"fct-acid\">15<\/td><\/tr><tr><td class=\"fct-vol\">25\u00a0m<\/td><td class=\"fct-num\">10<\/td><td class=\"fct-num\">11<\/td><td class=\"fct-num\">30<\/td><td class=\"fct-num\">167<\/td><td class=\"fct-acid\">18<\/td><\/tr><tr><td class=\"fct-vol\">30\u00a0m<\/td><td class=\"fct-num\">12<\/td><td class=\"fct-num\">13<\/td><td class=\"fct-num\">36<\/td><td class=\"fct-num\">200<\/td><td class=\"fct-acid\">21<\/td><\/tr><tr><td class=\"fct-vol\">40\u00a0m<\/td><td class=\"fct-num\">16<\/td><td class=\"fct-num\">17<\/td><td class=\"fct-num\">48<\/td><td class=\"fct-num\">267<\/td><td class=\"fct-acid\">27<\/td><\/tr><tr><td class=\"fct-vol\">50\u00a0m<\/td><td class=\"fct-num\">20<\/td><td class=\"fct-num\">21<\/td><td class=\"fct-num\">60<\/td><td class=\"fct-num\">334<\/td><td class=\"fct-acid\">33<\/td><\/tr><tr><td class=\"fct-vol\">75\u00a0m<\/td><td class=\"fct-num\">30<\/td><td class=\"fct-num\">31<\/td><td class=\"fct-num\">90<\/td><td class=\"fct-num\">500<\/td><td class=\"fct-acid\">49<\/td><\/tr><tr><td class=\"fct-vol\">100\u00a0m<\/td><td class=\"fct-num\">40<\/td><td class=\"fct-num\">41<\/td><td class=\"fct-num\">120<\/td><td class=\"fct-num\">667<\/td><td class=\"fct-acid\">65<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n  <p class=\"fct-note\">Calcul\u00e9 avec un entraxe de 2,5 m, 3 traverses par trav\u00e9e, des poteaux de 9 \u00d7 9 cm, des lames de 14 cm espac\u00e9es de 1 cm et un trou de 25 cm de diam\u00e8tre et 60 cm de profondeur avec un lit de gravier de 15 cm. Ajoutez environ 10 % de marge pour les lames et les traverses.<\/p>\n\n  <h3>Combien de poteaux pour une longueur de cl\u00f4ture, selon l&#8217;entraxe<\/h3>\n  <div class=\"fct-table-wrap\">\n    <table class=\"fct-table\">\n      <thead><tr><th>Longueur<\/th><th>Entraxe 1,8 m<\/th><th>Entraxe 2,0 m<\/th><th>Entraxe 2,4 m<\/th><th>Entraxe 2,5 m<\/th><th>Entraxe 3,0 m<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td class=\"fct-vol\">5\u00a0m<\/td><td class=\"fct-num\">4<\/td><td class=\"fct-num\">4<\/td><td class=\"fct-num\">4<\/td><td class=\"fct-num\">3<\/td><td class=\"fct-num\">3<\/td><\/tr><tr><td class=\"fct-vol\">10\u00a0m<\/td><td class=\"fct-num\">7<\/td><td class=\"fct-num\">6<\/td><td class=\"fct-num\">6<\/td><td class=\"fct-num\">5<\/td><td class=\"fct-num\">5<\/td><\/tr><tr><td class=\"fct-vol\">15\u00a0m<\/td><td class=\"fct-num\">10<\/td><td class=\"fct-num\">9<\/td><td class=\"fct-num\">8<\/td><td class=\"fct-num\">7<\/td><td class=\"fct-num\">6<\/td><\/tr><tr><td class=\"fct-vol\">20\u00a0m<\/td><td class=\"fct-num\">13<\/td><td class=\"fct-num\">11<\/td><td class=\"fct-num\">10<\/td><td class=\"fct-num\">9<\/td><td class=\"fct-num\">8<\/td><\/tr><tr><td class=\"fct-vol\">25\u00a0m<\/td><td class=\"fct-num\">15<\/td><td class=\"fct-num\">14<\/td><td class=\"fct-num\">12<\/td><td class=\"fct-num\">11<\/td><td class=\"fct-num\">10<\/td><\/tr><tr><td class=\"fct-vol\">30\u00a0m<\/td><td class=\"fct-num\">18<\/td><td class=\"fct-num\">16<\/td><td class=\"fct-num\">14<\/td><td class=\"fct-num\">13<\/td><td class=\"fct-num\">11<\/td><\/tr><tr><td class=\"fct-vol\">40\u00a0m<\/td><td class=\"fct-num\">24<\/td><td class=\"fct-num\">21<\/td><td class=\"fct-num\">18<\/td><td class=\"fct-num\">17<\/td><td class=\"fct-num\">15<\/td><\/tr><tr><td class=\"fct-vol\">50\u00a0m<\/td><td class=\"fct-num\">29<\/td><td class=\"fct-num\">26<\/td><td class=\"fct-num\">22<\/td><td class=\"fct-num\">21<\/td><td class=\"fct-num\">18<\/td><\/tr><tr><td class=\"fct-vol\">75\u00a0m<\/td><td class=\"fct-num\">43<\/td><td class=\"fct-num\">39<\/td><td class=\"fct-num\">33<\/td><td class=\"fct-num\">31<\/td><td class=\"fct-num\">26<\/td><\/tr><tr><td class=\"fct-vol\">100\u00a0m<\/td><td class=\"fct-num\">57<\/td><td class=\"fct-num\">51<\/td><td class=\"fct-num\">43<\/td><td class=\"fct-num\">41<\/td><td class=\"fct-num\">35<\/td><\/tr><tr><td class=\"fct-vol\">150\u00a0m<\/td><td class=\"fct-num\">85<\/td><td class=\"fct-num\">76<\/td><td class=\"fct-num\">64<\/td><td class=\"fct-num\">61<\/td><td class=\"fct-num\">51<\/td><\/tr><tr><td class=\"fct-vol\">200\u00a0m<\/td><td class=\"fct-num\">113<\/td><td class=\"fct-num\">101<\/td><td class=\"fct-num\">85<\/td><td class=\"fct-num\">81<\/td><td class=\"fct-num\">68<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n  <p class=\"fct-note\">Poteaux = longueur de cl\u00f4ture divis\u00e9e par l&#8217;entraxe, arrondie au sup\u00e9rieur, plus un. Les cl\u00f4tures bois \u00e0 lames ont en g\u00e9n\u00e9ral 2 \u00e0 2,5 m d&#8217;entraxe, les panneaux bois et PVC font souvent 1,8 m de large, les panneaux rigides 2,5 m, et les poteaux interm\u00e9diaires d&#8217;un grillage sont pos\u00e9s environ tous les 2,5 m.<\/p>\n\n  <h3>Quelle quantit\u00e9 de b\u00e9ton par poteau\u00a0: sacs selon la taille du trou<\/h3>\n  <div class=\"fct-table-wrap\">\n    <table class=\"fct-table\">\n      <thead><tr><th>Poteau<\/th><th>Trou (diam\u00e8tre \u00d7 profondeur)<\/th><th>B\u00e9ton (litres)<\/th><th>Sacs de 20 kg<\/th><th>Sacs de 25 kg<\/th><th>Sacs de 40 kg<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td class=\"fct-vol\">9 \u00d7 9 cm<\/td><td class=\"fct-num\">20 \u00d7 60\u00a0cm<\/td><td class=\"fct-num\">10<\/td><td class=\"fct-acid\">1,1<\/td><td class=\"fct-acid\">0,9<\/td><td class=\"fct-acid\">0,6<\/td><\/tr><tr><td class=\"fct-vol\">9 \u00d7 9 cm<\/td><td class=\"fct-num\">25 \u00d7 60\u00a0cm<\/td><td class=\"fct-num\">18<\/td><td class=\"fct-acid\">2,0<\/td><td class=\"fct-acid\">1,6<\/td><td class=\"fct-acid\">1,0<\/td><\/tr><tr><td class=\"fct-vol\">9 \u00d7 9 cm<\/td><td class=\"fct-num\">25 \u00d7 80\u00a0cm<\/td><td class=\"fct-num\">27<\/td><td class=\"fct-acid\">2,8<\/td><td class=\"fct-acid\">2,3<\/td><td class=\"fct-acid\">1,4<\/td><\/tr><tr><td class=\"fct-vol\">9 \u00d7 9 cm<\/td><td class=\"fct-num\">30 \u00d7 80\u00a0cm<\/td><td class=\"fct-num\">41<\/td><td class=\"fct-acid\">4,3<\/td><td class=\"fct-acid\">3,5<\/td><td class=\"fct-acid\">2,2<\/td><\/tr><tr><td class=\"fct-vol\">12 \u00d7 12 cm<\/td><td class=\"fct-num\">30 \u00d7 80\u00a0cm<\/td><td class=\"fct-num\">36<\/td><td class=\"fct-acid\">3,9<\/td><td class=\"fct-acid\">3,1<\/td><td class=\"fct-acid\">1,9<\/td><\/tr><tr><td class=\"fct-vol\">12 \u00d7 12 cm<\/td><td class=\"fct-num\">30 \u00d7 100\u00a0cm<\/td><td class=\"fct-num\">48<\/td><td class=\"fct-acid\">5,1<\/td><td class=\"fct-acid\">4,1<\/td><td class=\"fct-acid\">2,5<\/td><\/tr><tr><td class=\"fct-vol\">12 \u00d7 12 cm<\/td><td class=\"fct-num\">35 \u00d7 100\u00a0cm<\/td><td class=\"fct-num\">69<\/td><td class=\"fct-acid\">7,4<\/td><td class=\"fct-acid\">5,9<\/td><td class=\"fct-acid\">3,7<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n  <p class=\"fct-note\">Sacs par poteau pour un trou, en d\u00e9duisant le volume du poteau, avec 15 cm de gravier en fond de trou. Un sac de 25 kg donne environ 12 litres de b\u00e9ton. Arrondissez le total au sup\u00e9rieur pour toute la cl\u00f4ture. Sans lit de gravier, un poteau de 9 \u00d7 9 cm dans un trou de 25 \u00d7 60 cm demande environ 2,1 sacs de 25 kg.<\/p>\n\n  <h3>Quelle profondeur et quelle longueur pour les poteaux de cl\u00f4ture, selon la hauteur<\/h3>\n  <div class=\"fct-table-wrap\">\n    <table class=\"fct-table\">\n      <thead><tr><th>Hauteur de la cl\u00f4ture<\/th><th>Profondeur du trou<\/th><th>Longueur de poteau n\u00e9cessaire<\/th><th>Poteau standard \u00e0 acheter<\/th><th>Traverses par trav\u00e9e<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td class=\"fct-vol\">1,0\u00a0m<\/td><td class=\"fct-num\">60\u00a0cm<\/td><td class=\"fct-num\">1,60\u00a0m<\/td><td class=\"fct-num\">1,8\u00a0m<\/td><td class=\"fct-acid\">2<\/td><\/tr><tr><td class=\"fct-vol\">1,2\u00a0m<\/td><td class=\"fct-num\">60\u00a0cm<\/td><td class=\"fct-num\">1,80\u00a0m<\/td><td class=\"fct-num\">1,8\u00a0m<\/td><td class=\"fct-acid\">2<\/td><\/tr><tr><td class=\"fct-vol\">1,5\u00a0m<\/td><td class=\"fct-num\">60\u00a0cm<\/td><td class=\"fct-num\">2,10\u00a0m<\/td><td class=\"fct-num\">2,1\u00a0m<\/td><td class=\"fct-acid\">3<\/td><\/tr><tr><td class=\"fct-vol\">1,8\u00a0m<\/td><td class=\"fct-num\">60\u00a0cm<\/td><td class=\"fct-num\">2,40\u00a0m<\/td><td class=\"fct-num\">2,4\u00a0m<\/td><td class=\"fct-acid\">3<\/td><\/tr><tr><td class=\"fct-vol\">2,0\u00a0m<\/td><td class=\"fct-num\">75\u00a0cm<\/td><td class=\"fct-num\">2,75\u00a0m<\/td><td class=\"fct-num\">3,0\u00a0m<\/td><td class=\"fct-acid\">4<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n  <p class=\"fct-note\">La profondeur vaut environ un tiers de la hauteur de la cl\u00f4ture, jamais moins de 60 cm. La longueur du poteau est la hauteur de la cl\u00f4ture plus la profondeur du trou. Dans les r\u00e9gions froides, placez la profondeur sous la limite du gel.<\/p>\n\n  <h3>Co\u00fbt d&#8217;une cl\u00f4ture selon la longueur et le type (mat\u00e9riaux seuls, 1,80 m de haut)<\/h3>\n  <div class=\"fct-table-wrap\">\n    <table class=\"fct-table\">\n      <thead><tr><th>Longueur<\/th><th>Bois \u00e0 lames<\/th><th>Panneaux bois<\/th><th>PVC<\/th><th>Panneaux rigides<\/th><th>Grillage<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td class=\"fct-vol\">10\u00a0m<\/td><td class=\"fct-num\">393\u00a0\u20ac<\/td><td class=\"fct-num\">591\u00a0\u20ac<\/td><td class=\"fct-num\">1\u202f097\u00a0\u20ac<\/td><td class=\"fct-num\">383\u00a0\u20ac<\/td><td class=\"fct-num\">162\u00a0\u20ac<\/td><\/tr><tr><td class=\"fct-vol\">20\u00a0m<\/td><td class=\"fct-num\">766\u00a0\u20ac<\/td><td class=\"fct-num\">1\u202f162\u00a0\u20ac<\/td><td class=\"fct-num\">2\u202f153\u00a0\u20ac<\/td><td class=\"fct-num\">747\u00a0\u20ac<\/td><td class=\"fct-num\">236\u00a0\u20ac<\/td><\/tr><tr><td class=\"fct-vol\">30\u00a0m<\/td><td class=\"fct-num\">1\u202f131\u00a0\u20ac<\/td><td class=\"fct-num\">1\u202f639\u00a0\u20ac<\/td><td class=\"fct-num\">3\u202f033\u00a0\u20ac<\/td><td class=\"fct-num\">1\u202f107\u00a0\u20ac<\/td><td class=\"fct-num\">343\u00a0\u20ac<\/td><\/tr><tr><td class=\"fct-vol\">50\u00a0m<\/td><td class=\"fct-num\">1\u202f873\u00a0\u20ac<\/td><td class=\"fct-num\">2\u202f682\u00a0\u20ac<\/td><td class=\"fct-num\">4\u202f973\u00a0\u20ac<\/td><td class=\"fct-num\">1\u202f835\u00a0\u20ac<\/td><td class=\"fct-num\">475\u00a0\u20ac<\/td><\/tr><tr><td class=\"fct-vol\">75\u00a0m<\/td><td class=\"fct-num\">2\u202f794\u00a0\u20ac<\/td><td class=\"fct-num\">4\u202f009\u00a0\u20ac<\/td><td class=\"fct-num\">7\u202f437\u00a0\u20ac<\/td><td class=\"fct-num\">2\u202f737\u00a0\u20ac<\/td><td class=\"fct-num\">698\u00a0\u20ac<\/td><\/tr><tr><td class=\"fct-vol\">100\u00a0m<\/td><td class=\"fct-num\">3\u202f718\u00a0\u20ac<\/td><td class=\"fct-num\">5\u202f340\u00a0\u20ac<\/td><td class=\"fct-num\">9\u202f905\u00a0\u20ac<\/td><td class=\"fct-num\">3\u202f643\u00a0\u20ac<\/td><td class=\"fct-num\">907\u00a0\u20ac<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n  <p class=\"fct-note\">Mat\u00e9riaux seuls, pour une cl\u00f4ture droite sans portail, avec les prix par d\u00e9faut du calculateur (prix types en magasin de bricolage, en euros, qui varient selon la r\u00e9gion et la saison). La pose n&#8217;est pas comprise. Saisissez vos propres prix dans le calculateur pour une estimation locale.<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Comment ce calculateur de cl\u00f4ture compte les mat\u00e9riaux<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Trav\u00e9es.<\/strong> Chaque c\u00f4t\u00e9 est divis\u00e9 par l&#8217;entraxe des poteaux et arrondi au nombre entier de trav\u00e9es. Un c\u00f4t\u00e9 de 10 m avec 2,5 m d&#8217;entraxe donne exactement 4 trav\u00e9es, un c\u00f4t\u00e9 de 10,5 m en donne 5. Les ouvertures de portail sont retir\u00e9es d&#8217;abord des c\u00f4t\u00e9s les plus longs.<\/li><li><strong>Poteaux.<\/strong> Une cl\u00f4ture qui ne forme pas de boucle demande un poteau de plus que de trav\u00e9es. Une boucle ferm\u00e9e demande exactement un poteau par trav\u00e9e. Chaque portail ajoute deux poteaux de portail, et une extr\u00e9mit\u00e9 fix\u00e9e \u00e0 un mur n&#8217;a pas besoin de poteau.<\/li><li><strong>Longueur et profondeur des poteaux.<\/strong> La profondeur du trou vaut environ un tiers de la hauteur, jamais moins de 60 cm. La longueur du poteau est la hauteur plus cette profondeur, arrondie \u00e0 la longueur standard sup\u00e9rieure.<\/li><li><strong>Lames et traverses.<\/strong> Les lames sont la longueur de cl\u00f4ture moins les portails, divis\u00e9e par la largeur de la lame plus l&#8217;espace, arrondie au sup\u00e9rieur. Les traverses sont le nombre de traverses par trav\u00e9e multipli\u00e9 par le nombre de trav\u00e9es.<\/li><li><strong>B\u00e9ton.<\/strong> Chaque trou est un cylindre dont on retire le volume du poteau. Un lit de gravier occupe les 15 cm du fond, et le b\u00e9ton remplit le reste. Les sacs sont arrondis au sup\u00e9rieur pour toute la cl\u00f4ture.<\/li><li><strong>Co\u00fbt.<\/strong> Chaque quantit\u00e9 est multipli\u00e9e par le prix de l&#8217;\u00e9diteur de prix, et la pose par m\u00e8tre s&#8217;ajoute si vous la saisissez.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Questions fr\u00e9quentes sur le calculateur de cl\u00f4ture<\/h2>\n\n\n\n<div class=\"schema-faq wp-block-yoast-faq-block\"><div class=\"schema-faq-section\" id=\"faq-question-1790200000000\"><strong class=\"schema-faq-question\">Comment les angles et la forme de la cl\u00f4ture changent-ils le nombre de poteaux\u00a0?<\/strong> <p class=\"schema-faq-answer\">La forme compte, car chaque c\u00f4t\u00e9 est arrondi s\u00e9par\u00e9ment au nombre entier de trav\u00e9es. Une cl\u00f4ture droite de 24 m avec 2,5 m d&#8217;entraxe demande 11 poteaux, mais les m\u00eames 24 m en un carr\u00e9 ferm\u00e9 de 6 m sur 6 m en demandent 12. Saisissez chaque c\u00f4t\u00e9 s\u00e9par\u00e9ment dans le calculateur et cochez la boucle si la cl\u00f4ture revient \u00e0 son point de d\u00e9part.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1790200017311\"><strong class=\"schema-faq-question\">Faut-il sceller tous les poteaux de cl\u00f4ture dans du b\u00e9ton\u00a0?<\/strong> <p class=\"schema-faq-answer\">Les poteaux d&#8217;angle, d&#8217;extr\u00e9mit\u00e9 et de portail doivent toujours \u00eatre scell\u00e9s, car ils supportent la traction de la cl\u00f4ture ou le poids du portail. Les poteaux interm\u00e9diaires peuvent tenir dans du gravier bien dam\u00e9 en sol ferme et bien drain\u00e9. Le b\u00e9ton est plus s\u00fbr en sol sableux ou meuble, pour les hautes cl\u00f4tures pleines qui prennent le vent, et pour les poteaux de cl\u00f4ture PVC ou de grillage. Le calculateur compte tous les poteaux avec du b\u00e9ton, il donne donc la quantit\u00e9 la plus haute.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1790200034622\"><strong class=\"schema-faq-question\">Quelle profondeur pour les poteaux dans les r\u00e9gions froides\u00a0?<\/strong> <p class=\"schema-faq-answer\">Placez-les sous la limite du gel de votre r\u00e9gion. Un sol qui g\u00e8le et agrippe un poteau peu profond le soul\u00e8ve un peu chaque hiver. Saisissez la profondeur hors gel de votre r\u00e9gion dans le champ de profondeur du trou, et gardez les 15 cm de gravier pour que l&#8217;eau s&#8217;\u00e9coule du pied du poteau. Votre mairie peut vous indiquer cette profondeur.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1790200051933\"><strong class=\"schema-faq-question\">Combien co\u00fbte une cl\u00f4ture au m\u00e8tre\u00a0?<\/strong> <p class=\"schema-faq-answer\">Le calculateur affiche les mat\u00e9riaux aux prix de l&#8217;\u00e9diteur de prix\u00a0: saisissez ce que votre magasin demande pour les poteaux, les lames ou panneaux et le b\u00e9ton, puis ajoutez un tarif de pose au m\u00e8tre si vous avez un devis. Le devis d&#8217;un professionnel peut aussi inclure les d\u00e9marches, la d\u00e9pose d&#8217;une ancienne cl\u00f4ture, l&#8217;\u00e9vacuation et le surco\u00fbt d&#8217;un terrain en pente ou rocheux, que cette estimation ne comprend pas.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1790200069244\"><strong class=\"schema-faq-question\">Comment calculer l&#8217;espacement des lames d&#8217;une cl\u00f4ture\u00a0?<\/strong> <p class=\"schema-faq-answer\">Pour des espaces r\u00e9guliers, divisez l&#8217;espace libre entre deux poteaux moins la largeur de toutes les lames par le nombre de lames plus un. Exemple\u00a0: 240 cm d&#8217;espace libre, 20 lames de 9 cm, donne (240 \u2212 180) \u00f7 21, soit environ 2,9 cm d&#8217;espace. Pour un brise-vue, laissez 0,5 \u00e0 1 cm, car le bois se r\u00e9tracte en s\u00e9chant. Choisissez la double couche \u00e0 recouvrement dans le calculateur si les lames doivent recouvrir les joints\u00a0: il compte 2,5 cm de recouvrement.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1790200086555\"><strong class=\"schema-faq-question\">Comment poser une cl\u00f4ture sur un terrain en pente\u00a0?<\/strong> <p class=\"schema-faq-answer\">Mesurez chaque c\u00f4t\u00e9 le long du sol avec un m\u00e8tre ruban, pas \u00e0 l&#8217;horizontale. Il y a ensuite deux m\u00e9thodes. Avec le suivi de pente, les trav\u00e9es suivent le terrain, et avec le d\u00e9crochement, chaque trav\u00e9e reste horizontale et un triangle se forme sous le c\u00f4t\u00e9 haut. Sur une forte pente, choisissez 15 % de marge et achetez des poteaux d&#8217;une longueur de plus pour le bas, car l&#8217;\u00e9cart avec le sol y grandit.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1790200103866\"><strong class=\"schema-faq-question\">Quelle diff\u00e9rence entre poteaux interm\u00e9diaires, d&#8217;angle, d&#8217;extr\u00e9mit\u00e9 et de portail\u00a0?<\/strong> <p class=\"schema-faq-answer\">Les poteaux interm\u00e9diaires tiennent la cl\u00f4ture entre les autres poteaux. Les poteaux d&#8217;angle et d&#8217;extr\u00e9mit\u00e9 reprennent la traction de la cl\u00f4ture d&#8217;un c\u00f4t\u00e9\u00a0: ils demandent la fondation la plus profonde, et en grillage ce sont des poteaux plus forts avec jambes de force. Les poteaux de portail supportent le poids et le mouvement du portail. Pour un portail de plus de 1,2 m, prenez un poteau de 12 \u00d7 12 cm ou en acier et scellez-le dans davantage de b\u00e9ton pour \u00e9viter qu&#8217;il s&#8217;affaisse.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1790200121177\"><strong class=\"schema-faq-question\">Que demande la r\u00e9glementation pour une cl\u00f4ture de piscine\u00a0?<\/strong> <p class=\"schema-faq-answer\">En France, les barri\u00e8res de protection de piscine sont encadr\u00e9es par la norme NF P90-306\u00a0: elle demande en particulier une hauteur minimale de 1,10 m, des espaces de 10 cm au maximum entre les \u00e9l\u00e9ments, l&#8217;absence de prise permettant de grimper et un portillon \u00e0 verrouillage. V\u00e9rifiez la r\u00e9glementation en vigueur et vos obligations de s\u00e9curit\u00e9 avant de choisir votre dispositif. Cochez la case piscine pour obtenir un rappel avec le r\u00e9sultat.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1790200138488\"><strong class=\"schema-faq-question\">Faut-il une autorisation, ou se renseigner sur les r\u00e9seaux, avant de poser une cl\u00f4ture\u00a0?<\/strong> <p class=\"schema-faq-answer\">Avant de creuser, renseignez-vous sur les r\u00e9seaux enterr\u00e9s de gaz, d&#8217;eau, d&#8217;\u00e9lectricit\u00e9 et de t\u00e9l\u00e9coms, par exemple via le guichet unique des r\u00e9seaux ou votre mairie. Selon la commune, une cl\u00f4ture peut demander une d\u00e9claration pr\u00e9alable, et le plan local d&#8217;urbanisme fixe souvent la hauteur et l&#8217;aspect. Un r\u00e8glement de copropri\u00e9t\u00e9 ou de lotissement peut s&#8217;y ajouter. Faites v\u00e9rifier la limite exacte du terrain avant de poser les poteaux.<\/p> <\/div><\/div>\n\n\n<!-- aiper-tool-links -->\n<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-pave\/\" class=\"aiper-tl-tag\">Calculateur de Pav\u00e9 Pr\u00e9cis<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-terrasse\/\" class=\"aiper-tl-tag\">Calculateur de Terrasse<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-mur-de-soutenement\/\" class=\"aiper-tl-tag\">Calculateur De Mur De Sout\u00e8nement<\/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\/comment-eloigner-bernaches-pelouse\/\" class=\"aiper-tl-tag\">Comment \u00e9loigner les bernaches de la pelouse<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/comment-eliminer-champignons-pelouse\/\" class=\"aiper-tl-tag\">Comment se d\u00e9barrasser des champignons dans la pelouse<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/defeutrer-pelouse-reconnaitre-traiter-feutre\/\" class=\"aiper-tl-tag\">D\u00e9feutrer sa pelouse : reconna\u00eetre et traiter le feutre<\/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>\n\n\n<p class=\"has-text-align-center aiper-last-updated has-small-font-size wp-block-paragraph\"><time datetime=\"2026-09-30\">Derni\u00e8re mise \u00e0 jour\u00a0: 30 septembre 2026<\/time><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ce calculateur de cl\u00f4ture d\u00e9termine les poteaux, traverses, lames ou panneaux, le b\u00e9ton et le co\u00fbt d&#8217;une cl\u00f4ture en bois, en PVC, en panneaux rigides m\u00e9talliques ou en grillage. Saisissez chaque c\u00f4t\u00e9 de votre cl\u00f4ture, ajoutez les portails et obtenez une liste d&#8217;achats compl\u00e8te avec une estimation du prix. Choisissez le type de cl\u00f4ture et&#8230;<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-2913","page","type-page","status-publish","hentry"],"lang":"fr","translations":{"fr":2913,"es":2915,"en":2908,"de":2910},"_links":{"self":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2913","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=2913"}],"version-history":[{"count":6,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2913\/revisions"}],"predecessor-version":[{"id":11867,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2913\/revisions\/11867"}],"wp:attachment":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/media?parent=2913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}