{"id":2327,"date":"2026-06-04T06:56:31","date_gmt":"2026-06-04T06:56:31","guid":{"rendered":"https:\/\/aiper.com\/blogs\/?page_id=2327"},"modified":"2026-06-24T04:24:24","modified_gmt":"2026-06-24T04:24:24","slug":"calculateur-semences-gazon","status":"publish","type":"page","link":"https:\/\/aiper.com\/blogs\/fr\/calculateur-semences-gazon\/","title":{"rendered":"Calculateur de semences de gazon"},"content":{"rendered":"\n<div class=\"grass-calc-wrapper\">\n    <style>\n        .grass-calc-wrapper {\n            --brand: #1ecad3;\n            --brand-dark: #17a8b0;\n            --brand-light: #e8fafa;\n            --brand-lighter: #f4fdfd;\n            --text: #2d3748;\n            --text-light: #5a6c7d;\n            --text-muted: #8899a6;\n            --bg: #f8fafb;\n            --card-bg: #ffffff;\n            --border: #e2e8f0;\n            --border-focus: #1ecad3;\n            --error: #e53e3e;\n            --error-bg: #fff5f5;\n            --shadow-sm: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);\n            --shadow-md: 0 4px 16px rgba(0,0,0,0.08), 0 2px 6px rgba(0,0,0,0.04);\n            --shadow-lg: 0 8px 30px rgba(0,0,0,0.10), 0 3px 10px rgba(0,0,0,0.05);\n            --radius-sm: 6px;\n            --radius: 10px;\n            --radius-lg: 14px;\n            --transition: 0.2s cubic-bezier(0.4,0,0.2,1);\n            --font-stack: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n            font-family: var(--font-stack);\n            color: var(--text);\n            max-width: 680px;\n            margin: 0 auto;\n            padding: 8px;\n            box-sizing: border-box;\n            line-height: 1.6;\n        }\n        .grass-calc-wrapper *,\n        .grass-calc-wrapper *::before,\n        .grass-calc-wrapper *::after {\n            box-sizing: border-box;\n        }\n        .grass-calc-card {\n            background: var(--card-bg);\n            border-radius: var(--radius-lg);\n            box-shadow: var(--shadow-lg);\n            padding: 32px 28px 28px;\n            border: 1px solid var(--border);\n        }\n        @media (max-width: 600px) {\n            .grass-calc-card { padding: 20px 16px 18px; border-radius: var(--radius); }\n        }\n        .grass-calc-header {\n            text-align: center;\n            margin-bottom: 28px;\n            padding-bottom: 20px;\n            border-bottom: 2px solid var(--brand-lighter);\n        }\n        .grass-calc-icon {\n            display: inline-flex;\n            align-items: center;\n            justify-content: center;\n            width: 48px;\n            height: 48px;\n            border-radius: 50%;\n            background: var(--brand-lighter);\n            font-size: 26px;\n            margin-bottom: 10px;\n            color: var(--brand-dark);\n            font-weight: 700;\n        }\n        .grass-calc-header h2 {\n            margin: 0 0 4px;\n            font-size: 1.5rem;\n            font-weight: 700;\n            color: var(--text);\n            letter-spacing: -0.3px;\n        }\n        .grass-calc-subtitle {\n            margin: 0;\n            font-size: 0.9rem;\n            color: var(--text-muted);\n        }\n        .grass-calc-step {\n            margin-bottom: 22px;\n            padding: 18px 20px;\n            background: var(--bg);\n            border-radius: var(--radius);\n            border: 1px solid transparent;\n        }\n        .grass-calc-step-label {\n            display: flex;\n            align-items: center;\n            gap: 8px;\n            font-size: 0.8rem;\n            font-weight: 700;\n            text-transform: uppercase;\n            letter-spacing: 0.6px;\n            color: var(--brand-dark);\n            margin-bottom: 10px;\n        }\n        .step-num {\n            display: inline-flex;\n            align-items: center;\n            justify-content: center;\n            width: 22px;\n            height: 22px;\n            border-radius: 50%;\n            background: var(--brand);\n            color: #fff;\n            font-size: 0.7rem;\n            font-weight: 800;\n        }\n        .grass-calc-wrapper label {\n            display: block;\n            font-size: 0.85rem;\n            font-weight: 600;\n            color: var(--text);\n            margin-bottom: 4px;\n        }\n        .label-hint {\n            font-weight: 400;\n            color: var(--text-muted);\n            font-size: 0.78rem;\n        }\n        .grass-calc-wrapper select,\n        .grass-calc-wrapper input[type=\"number\"] {\n            width: 100%;\n            padding: 10px 12px;\n            font-size: 0.95rem;\n            font-family: var(--font-stack);\n            border: 1.5px solid var(--border);\n            border-radius: var(--radius-sm);\n            background: #fff;\n            color: var(--text);\n            transition: border-color var(--transition), box-shadow var(--transition);\n            appearance: none;\n            -webkit-appearance: none;\n            outline: none;\n            min-height: 44px;\n        }\n        .grass-calc-wrapper select {\n            background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238899a6' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C\/polyline%3E%3C\/svg%3E\");\n            background-repeat: no-repeat;\n            background-position: right 12px center;\n            padding-right: 36px;\n            cursor: pointer;\n        }\n        .grass-calc-wrapper input[type=\"number\"] {\n            -moz-appearance: textfield;\n        }\n        .grass-calc-wrapper select:focus,\n        .grass-calc-wrapper input[type=\"number\"]:focus {\n            border-color: var(--border-focus);\n            box-shadow: 0 0 0 3px rgba(30,202,211,0.12);\n        }\n        .grass-calc-wrapper .has-error {\n            border-color: var(--error) !important;\n            box-shadow: 0 0 0 3px rgba(229,62,62,0.08) !important;\n            background: var(--error-bg);\n        }\n        .grass-calc-row {\n            display: flex;\n            gap: 12px;\n            flex-wrap: wrap;\n            align-items: flex-end;\n        }\n        .grass-calc-field {\n            flex: 1;\n            min-width: 130px;\n        }\n        .grass-calc-field-sm {\n            flex: 0 0 auto;\n            min-width: 100px;\n            max-width: 160px;\n        }\n        @media (max-width: 480px) {\n            .grass-calc-row { flex-direction: column; gap: 10px; }\n            .grass-calc-field, .grass-calc-field-sm { min-width: 100%; max-width: 100%; }\n        }\n        .grass-calc-radio-group {\n            display: flex;\n            gap: 10px;\n            flex-wrap: wrap;\n        }\n        .grass-calc-radio-chip {\n            flex: 1;\n            min-width: 130px;\n            position: relative;\n        }\n        .grass-calc-radio-chip input[type=\"radio\"] {\n            position: absolute;\n            opacity: 0;\n            pointer-events: none;\n        }\n        .grass-calc-radio-chip label {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            text-align: center;\n            padding: 10px 14px;\n            border: 2px solid var(--border);\n            border-radius: var(--radius-sm);\n            cursor: pointer;\n            font-weight: 600;\n            font-size: 0.88rem;\n            transition: all var(--transition);\n            background: #fff;\n            user-select: none;\n            min-height: 44px;\n        }\n        .grass-calc-radio-chip input:checked + label {\n            border-color: var(--brand);\n            background: var(--brand-lighter);\n            color: var(--brand-dark);\n            box-shadow: 0 0 0 2px rgba(30,202,211,0.15);\n        }\n        .grass-calc-or-divider {\n            display: flex;\n            align-items: center;\n            gap: 10px;\n            margin: 10px 0;\n            color: var(--text-muted);\n            font-size: 0.8rem;\n            font-weight: 600;\n            text-transform: uppercase;\n        }\n        .grass-calc-or-divider::before,\n        .grass-calc-or-divider::after {\n            content: '';\n            flex: 1;\n            height: 1px;\n            background: var(--border);\n        }\n        .grass-calc-btn-row {\n            display: flex;\n            gap: 12px;\n            margin-top: 24px;\n        }\n        .grass-calc-btn {\n            flex: 1;\n            min-width: 140px;\n            padding: 12px 20px;\n            font-size: 1rem;\n            font-weight: 700;\n            font-family: var(--font-stack);\n            border-radius: var(--radius-sm);\n            cursor: pointer;\n            transition: all var(--transition);\n            text-align: center;\n            border: 2px solid transparent;\n            outline: none;\n            min-height: 48px;\n            display: inline-flex;\n            align-items: center;\n            justify-content: center;\n        }\n        .grass-calc-btn-primary {\n            background: var(--brand);\n            color: #fff;\n            border-color: var(--brand);\n            box-shadow: 0 2px 8px rgba(30,202,211,0.3);\n        }\n        .grass-calc-btn-primary:hover {\n            background: var(--brand-dark);\n            border-color: var(--brand-dark);\n        }\n        .grass-calc-btn-outline {\n            background: #fff;\n            color: var(--brand-dark);\n            border-color: var(--brand);\n        }\n        .grass-calc-btn-outline:hover {\n            background: var(--brand-lighter);\n        }\n        .grass-calc-unit-toggle-group {\n            display: inline-flex;\n            gap: 4px;\n            margin-left: 8px;\n        }\n        .grass-calc-unit-toggle-btn {\n            padding: 4px 10px;\n            font-size: 0.7rem;\n            font-weight: 700;\n            border: 1.5px solid var(--border);\n            border-radius: 14px;\n            background: #fff;\n            color: var(--text-muted);\n            cursor: pointer;\n            transition: all var(--transition);\n        }\n        .grass-calc-unit-toggle-btn.active {\n            background: var(--brand);\n            border-color: var(--brand);\n            color: #fff;\n        }\n        .grass-calc-results {\n            display: none;\n            margin-top: 24px;\n            padding: 22px 20px;\n            background: #fff;\n            border-radius: var(--radius);\n            border: 2px solid var(--brand);\n            border-left: 5px solid var(--brand);\n            box-shadow: var(--shadow-md);\n        }\n        .grass-calc-results.visible {\n            display: block;\n        }\n        .grass-calc-results h3 {\n            margin: 0 0 14px;\n            font-size: 1.2rem;\n            font-weight: 700;\n            color: var(--brand-dark);\n        }\n        .grass-calc-result-item {\n            padding: 10px 0;\n            border-bottom: 1px solid var(--border);\n        }\n        .grass-calc-result-item:last-child { border-bottom: none; }\n        .grass-calc-result-label {\n            font-size: 0.8rem;\n            font-weight: 600;\n            text-transform: uppercase;\n            color: var(--text-muted);\n            margin-bottom: 2px;\n        }\n        .grass-calc-result-value {\n            font-size: 1.3rem;\n            font-weight: 700;\n        }\n        .primary-weight {\n            color: var(--brand-dark);\n            font-size: 1.5rem;\n        }\n        .alt-unit {\n            font-weight: 400;\n            font-size: 0.95rem;\n            color: var(--text-muted);\n            margin-left: 4px;\n        }\n        .grass-calc-recommendation {\n            margin-top: 14px;\n            padding: 14px 16px;\n            background: var(--brand-lighter);\n            border-radius: var(--radius-sm);\n            font-size: 0.9rem;\n            color: #3c5a5c;\n            line-height: 1.5;\n            border-left: 3px solid var(--brand);\n        }\n        .grass-calc-validation-msg {\n            display: none;\n            color: var(--error);\n            font-size: 0.82rem;\n            font-weight: 600;\n            margin-top: 8px;\n        }\n        .grass-calc-validation-msg.visible {\n            display: block;\n        }\n    <\/style>\n\n    <div class=\"grass-calc-card\">\n        <div class=\"grass-calc-header\">\n           \n            <p class=\"grass-calc-subtitle\">Estimez la quantit\u00e9 parfaite de semences pour votre pelouse<\/p>\n        <\/div>\n\n        <div class=\"grass-calc-step\">\n            <div class=\"grass-calc-step-label\"><span class=\"step-num\">1<\/span> Emplacement &amp; climat<\/div>\n            <div class=\"grass-calc-row\">\n                <div class=\"grass-calc-field\">\n                    <label for=\"countrySelect\">Pays<\/label>\n                    <select id=\"countrySelect\">\n                        <option value=\"USA\">\u00c9tats-Unis<\/option>\n                        <option value=\"Australia\">Australie<\/option>\n                        <option value=\"Germany\">Allemagne<\/option>\n                        <option value=\"France\">France<\/option>\n                        <option value=\"Spain\">Espagne<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"grass-calc-field\">\n                    <label for=\"citySelect\">Ville \/ R\u00e9gion<\/label>\n                    <select id=\"citySelect\"><\/select>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"grass-calc-step\">\n            <div class=\"grass-calc-step-label\"><span class=\"step-num\">2<\/span> D\u00e9tails de la pelouse<\/div>\n            <div class=\"grass-calc-row\">\n                <div class=\"grass-calc-field\">\n                    <label for=\"grassTypeSelect\">Type de gazon<\/label>\n                    <select id=\"grassTypeSelect\"><\/select>\n                <\/div>\n            <\/div>\n            <div style=\"margin-top: 12px;\">\n                <label style=\"margin-bottom: 6px;\">Type de projet<\/label>\n                <div class=\"grass-calc-radio-group\">\n                    <div class=\"grass-calc-radio-chip\">\n                        <input type=\"radio\" name=\"projectType\" id=\"projectNewLawn\" value=\"newLawn\" checked>\n                        <label for=\"projectNewLawn\">Nouvelle pelouse<\/label>\n                    <\/div>\n                    <div class=\"grass-calc-radio-chip\">\n                        <input type=\"radio\" name=\"projectType\" id=\"projectOverseeding\" value=\"overseeding\">\n                        <label for=\"projectOverseeding\">Sursemis \/ R\u00e9paration<\/label>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"grass-calc-step\">\n            <div class=\"grass-calc-step-label\"><span class=\"step-num\">3<\/span> Dimensions de la surface<\/div>\n            <div class=\"grass-calc-row\">\n                <div class=\"grass-calc-field-sm\">\n                    <label for=\"areaUnitSelect\">Unit\u00e9 de surface\n                        <span class=\"grass-calc-unit-toggle-group\">\n                            <button type=\"button\" class=\"grass-calc-unit-toggle-btn active\" data-system=\"imperial\">Imp\u00e9rial<\/button>\n                            <button type=\"button\" class=\"grass-calc-unit-toggle-btn\" data-system=\"metric\">M\u00e9trique<\/button>\n                        <\/span>\n                    <\/label>\n                    <select id=\"areaUnitSelect\">\n                        <option value=\"sqft\">Pieds carr\u00e9s (sq ft)<\/option>\n                        <option value=\"sqm\">M\u00e8tres carr\u00e9s (sq m)<\/option>\n                        <option value=\"acres\">Acres<\/option>\n                        <option value=\"hectares\">Hectares (ha)<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"grass-calc-field-sm\">\n                    <label for=\"weightUnitSelect\">Unit\u00e9 de poids des semences<\/label>\n                    <select id=\"weightUnitSelect\">\n                        <option value=\"lbs\">Livres (lbs)<\/option>\n                        <option value=\"oz\">Onces (oz)<\/option>\n                        <option value=\"kg\">Kilogrammes (kg)<\/option>\n                        <option value=\"g\">Grammes (g)<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n            <div class=\"grass-calc-row\" style=\"margin-top: 10px;\">\n                <div class=\"grass-calc-field\">\n                    <label for=\"lengthInput\" id=\"lengthLabel\">Longueur<\/label>\n                    <input type=\"number\" id=\"lengthInput\" placeholder=\"ex. 30\" min=\"0\" step=\"any\">\n                <\/div>\n                <div class=\"grass-calc-field\">\n                    <label for=\"widthInput\" id=\"widthLabel\">Largeur<\/label>\n                    <input type=\"number\" id=\"widthInput\" placeholder=\"ex. 50\" min=\"0\" step=\"any\">\n                <\/div>\n            <\/div>\n            <div class=\"grass-calc-or-divider\">ou<\/div>\n            <div class=\"grass-calc-row\">\n                <div class=\"grass-calc-field\">\n                    <label for=\"totalAreaInput\" id=\"totalAreaLabel\">Surface totale <span class=\"label-hint\">(ignore longueur &amp; largeur)<\/span><\/label>\n                    <input type=\"number\" id=\"totalAreaInput\" placeholder=\"Entrez la surface totale directement\" min=\"0\" step=\"any\">\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"grass-calc-btn-row\">\n            <button class=\"grass-calc-btn grass-calc-btn-primary\" id=\"calculateBtn\">Calculer<\/button>\n            <button class=\"grass-calc-btn grass-calc-btn-outline\" id=\"resetBtn\">R\u00e9initialiser<\/button>\n        <\/div>\n\n        <div class=\"grass-calc-validation-msg\" id=\"validationMsg\"><\/div>\n\n        <div class=\"grass-calc-results\" id=\"resultsSection\">\n            <h3>R\u00e9sultat pour vos semences de gazon<\/h3>\n            <div class=\"grass-calc-result-item\">\n                <div class=\"grass-calc-result-label\">Surface totale de la pelouse<\/div>\n                <div class=\"grass-calc-result-value\" id=\"resultArea\"><\/div>\n            <\/div>\n            <div class=\"grass-calc-result-item\">\n                <div class=\"grass-calc-result-label\">Quantit\u00e9 totale de semences n\u00e9cessaire<\/div>\n                <div class=\"grass-calc-result-value\" id=\"resultSeed\"><\/div>\n            <\/div>\n            <div class=\"grass-calc-recommendation\" id=\"resultRecommendation\"><\/div>\n        <\/div>\n    <\/div>\n\n    <script>\n        (function() {\n            const wrapper = document.currentScript.parentElement;\n            const citiesByCountry = {\n                USA: ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'Miami'],\n                Australia: ['Sydney', 'Melbourne', 'Brisbane', 'Perth', 'Adelaide'],\n                Germany: ['Berlin', 'Hamburg', 'Munich', 'Frankfurt'],\n                France: ['Paris', 'Marseille', 'Lyon', 'Toulouse'],\n                Spain: ['Madrid', 'Barcelona', 'Valencia', 'Seville']\n            };\n            const cityClimate = {\n                'New York':'cool','Los Angeles':'warm','Chicago':'cool','Houston':'warm','Phoenix':'warm','Miami':'warm',\n                'Sydney':'warm','Melbourne':'warm','Brisbane':'warm','Perth':'warm','Adelaide':'warm',\n                'Berlin':'cool','Hamburg':'cool','Munich':'cool','Frankfurt':'cool',\n                'Paris':'cool','Marseille':'cool','Lyon':'cool','Toulouse':'cool',\n                'Madrid':'warm','Barcelona':'warm','Valencia':'warm','Seville':'warm'\n            };\n            const hotDryCities = new Set(['Phoenix', 'Madrid', 'Seville', 'Perth']);\n            const allGrassTypes = [\n                { name: 'P\u00e2turin des pr\u00e9s', season: 'cool' },\n                { name: 'Ray-grass anglais', season: 'cool' },\n                { name: 'F\u00e9tuque fine', season: 'cool' },\n                { name: 'Chiendent pied-de-poule', season: 'warm' },\n                { name: 'Zoysia', season: 'warm' },\n                { name: 'Herbe aux bisons', season: 'warm' }\n            ];\n            const seedingRates = { cool: { newLawn: 4, overseeding: 2 }, warm: { newLawn: 2, overseeding: 1 } };\n            const hotDryMultiplier = 1.12;\n            const defaultUnits = {\n                USA: { area: 'sqft', weight: 'lbs' },\n                Australia: { area: 'sqm', weight: 'kg' },\n                Germany: { area: 'sqm', weight: 'kg' },\n                France: { area: 'sqm', weight: 'kg' },\n                Spain: { area: 'sqm', weight: 'kg' }\n            };\n\n            const qs = sel => wrapper.querySelector(sel);\n            const countrySelect = qs('#countrySelect');\n            const citySelect = qs('#citySelect');\n            const grassTypeSelect = qs('#grassTypeSelect');\n            const areaUnitSelect = qs('#areaUnitSelect');\n            const weightUnitSelect = qs('#weightUnitSelect');\n            const lengthInput = qs('#lengthInput');\n            const widthInput = qs('#widthInput');\n            const totalAreaInput = qs('#totalAreaInput');\n            const calculateBtn = qs('#calculateBtn');\n            const resetBtn = qs('#resetBtn');\n            const resultsSection = qs('#resultsSection');\n            const resultArea = qs('#resultArea');\n            const resultSeed = qs('#resultSeed');\n            const resultRecommendation = qs('#resultRecommendation');\n            const validationMsg = qs('#validationMsg');\n            const lengthLabel = qs('#lengthLabel');\n            const widthLabel = qs('#widthLabel');\n            const totalAreaLabel = qs('#totalAreaLabel');\n            const imperialToggle = qs('.grass-calc-unit-toggle-btn[data-system=\"imperial\"]');\n            const metricToggle = qs('.grass-calc-unit-toggle-btn[data-system=\"metric\"]');\n\n            let currentCountry = 'USA', currentCity = 'New York', userChangedUnits = false;\n\n            function updateUnitHints() {\n                const unit = areaUnitSelect.value;\n                const abbr = { sqft:'pi', sqm:'m', acres:'acres', hectares:'ha' }[unit] || '';\n                lengthLabel.textContent = `Longueur (${abbr})`;\n                widthLabel.textContent = `Largeur (${abbr})`;\n                totalAreaLabel.innerHTML = `Surface totale <span class=\"label-hint\">(ignore longueur &amp; largeur, ${abbr})<\/span>`;\n                lengthInput.placeholder = `ex. 30 ${abbr}`;\n                widthInput.placeholder = `ex. 50 ${abbr}`;\n                totalAreaInput.placeholder = `Entrez la surface totale en ${abbr}`;\n            }\n\n            function updateToggleBtns() {\n                const imp = areaUnitSelect.value === 'sqft' || areaUnitSelect.value === 'acres';\n                imperialToggle.classList.toggle('active', imp);\n                metricToggle.classList.toggle('active', !imp);\n            }\n\n            function applyDefaultUnits(country) {\n                if (userChangedUnits) return;\n                const d = defaultUnits[country] || defaultUnits['USA'];\n                areaUnitSelect.value = d.area;\n                weightUnitSelect.value = d.weight;\n                updateUnitHints();\n                updateToggleBtns();\n            }\n\n            function populateCities(country) {\n                citySelect.innerHTML = '';\n                (citiesByCountry[country]||[]).forEach(c => {\n                    const o = document.createElement('option');\n                    o.value = c; o.textContent = c; citySelect.appendChild(o);\n                });\n                citySelect.value = citiesByCountry[country][0] || '';\n                currentCity = citySelect.value;\n                populateGrassTypes(country, currentCity);\n                applyDefaultUnits(country);\n            }\n\n            function populateGrassTypes(country, city) {\n                let seasons;\n                if (country === 'USA') seasons = ['cool','warm'];\n                else if (country === 'Australia' || country === 'Spain') seasons = ['warm'];\n                else seasons = ['cool'];\n                const filtered = allGrassTypes.filter(g => seasons.includes(g.season));\n                grassTypeSelect.innerHTML = '';\n                filtered.forEach(g => {\n                    const o = document.createElement('option');\n                    o.value = g.name;\n                    o.textContent = g.name + (g.season==='cool'?' (saison fra\u00eeche)':' (saison chaude)');\n                    o.dataset.season = g.season;\n                    grassTypeSelect.appendChild(o);\n                });\n                const climate = cityClimate[city] || 'cool';\n                const pref = filtered.filter(g => g.season === climate);\n                grassTypeSelect.value = pref.length ? pref[0].name : (filtered[0]?.name||'');\n            }\n\n            function clearValidation() {\n                validationMsg.classList.remove('visible');\n                validationMsg.textContent = '';\n                [lengthInput, widthInput, totalAreaInput].forEach(el => el.classList.remove('has-error'));\n            }\n\n            function showValidation(msg) { validationMsg.textContent = msg; validationMsg.classList.add('visible'); }\n\n            function getSelectedSeason() {\n                const sel = grassTypeSelect.options[grassTypeSelect.selectedIndex];\n                return sel ? sel.dataset.season : 'cool';\n            }\n            function getProjectType() {\n                const checked = qs('input[name=\"projectType\"]:checked');\n                return checked ? checked.value : 'newLawn';\n            }\n\n            function areaToSqFt(v, u) {\n                switch(u){ case'sqft':return v; case'sqm':return v*10.7639; case'acres':return v*43560; case'hectares':return v*107639; default:return v; }\n            }\n            function sqFtToArea(v,u) {\n                switch(u){ case'sqft':return v; case'sqm':return v\/10.7639; case'acres':return v\/43560; case'hectares':return v\/107639; default:return v; }\n            }\n            function lbsToWeight(v,u) {\n                switch(u){ case'lbs':return v; case'oz':return v*16; case'kg':return v\/2.20462; case'g':return v\/2.20462*1000; default:return v; }\n            }\n            function altAreaUnit(u) { const p={sqft:'sqm',sqm:'sqft',acres:'hectares',hectares:'acres'}; return p[u]||'sqm'; }\n            function altWeightUnit(u) { const p={lbs:'kg',oz:'g',kg:'lbs',g:'oz'}; return p[u]||'kg'; }\n            function fmtAreaUnit(u) { return {sqft:'pieds carr\u00e9s',sqm:'m\u00e8tres carr\u00e9s',acres:'acres',hectares:'hectares'}[u]||u; }\n            function fmtWeightUnit(u) { return {lbs:'livres',oz:'onces',kg:'kilogrammes',g:'grammes'}[u]||u; }\n            function fmtNum(v) {\n                if(v===0) return '0';\n                const a=Math.abs(v);\n                if(a<0.01) return v.toFixed(4);\n                if(a<1) return v.toFixed(3);\n                if(a<100) return v.toFixed(2);\n                if(a<10000) return v.toFixed(1);\n                return v.toFixed(0).replace(\/\\B(?=(\\d{3})+(?!\\d))\/g,',');\n            }\n\n            function buildRecommendation(city, grass, season, proj) {\n                const climate = cityClimate[city]||'cool';\n                const window = (climate==='cool'?\n                    (proj==='newLawn'?'d\u00e9but d\\'automne (septembre \u00e0 octobre) ou d\u00e9but du printemps (mars \u00e0 avril)':'d\u00e9but d\\'automne ou d\u00e9but du printemps'):\n                    (proj==='newLawn'?'fin du printemps au d\u00e9but de l\\'\u00e9t\u00e9 (mai \u00e0 juin)':'fin du printemps au d\u00e9but de l\\'\u00e9t\u00e9'));\n                const note = {\n                    'Phoenix':'En raison de la chaleur extr\u00eame du d\u00e9sert \u00e0 Phoenix, semez au tout d\u00e9but du printemps (f\u00e9vrier\u2013mars) ou au d\u00e9but de l\\'automne (octobre).',\n                    'Madrid':'Madrid conna\u00eet des \u00e9t\u00e9s chauds et secs. Les meilleures p\u00e9riodes sont le d\u00e9but du printemps (mars\u2013avril) ou le d\u00e9but de l\\'automne (septembre\u2013octobre).',\n                    'Seville':'S\u00e9ville a des \u00e9t\u00e9s tr\u00e8s chauds. Semez au d\u00e9but du printemps (f\u00e9vrier\u2013mars) ou en automne (octobre).',\n                    'Perth':'Perth a un climat m\u00e9diterran\u00e9en avec des \u00e9t\u00e9s chauds et secs. L\\'automne (avril\u2013mai) ou le printemps (septembre\u2013octobre) sont id\u00e9aux.',\n                    'Miami':'Dans le climat subtropical de Miami, les gazons de saison chaude prosp\u00e8rent. Semez \u00e0 la fin du printemps (avril\u2013mai).',\n                    'Houston':'Le climat subtropical humide de Houston est id\u00e9al pour les gazons de saison chaude. La fin du printemps (avril\u2013mai) est la meilleure p\u00e9riode.',\n                    'Los Angeles':'Le climat m\u00e9diterran\u00e9en doux de Los Angeles permet des semis flexibles du printemps au d\u00e9but de l\\'automne.',\n                    'New York':'Le climat \u00e0 quatre saisons de New York favorise les gazons de saison fra\u00eeche. Le d\u00e9but de l\\'automne (septembre) est id\u00e9al.',\n                    'Chicago':'Les hivers froids de Chicago rendent le d\u00e9but de l\\'automne (fin ao\u00fbt\u2013septembre) optimal pour les gazons de saison fra\u00eeche.',\n                    'Berlin':'Le climat temp\u00e9r\u00e9 de Berlin convient aux gazons de saison fra\u00eeche. Semez au d\u00e9but de l\\'automne (septembre) ou au printemps (avril).',\n                    'Hamburg':'Le climat maritime de Hambourg est excellent pour les gazons de saison fra\u00eeche. Semis d\\'automne (septembre\u2013octobre) recommand\u00e9.',\n                    'Munich':'Munich a des hivers plus froids. Un semis au d\u00e9but de l\\'automne (septembre) permet l\\'enracinement avant le gel.',\n                    'Frankfurt':'Le climat continental doux de Francfort soutient les gazons de saison fra\u00eeche. Semez en septembre ou avril.',\n                    'Paris':'Le climat temp\u00e9r\u00e9 de Paris est id\u00e9al pour les gazons de saison fra\u00eeche. Le d\u00e9but de l\\'automne ou le printemps fonctionnent bien.',\n                    'Marseille':'Le climat m\u00e9diterran\u00e9en de Marseille avec des \u00e9t\u00e9s chauds n\u00e9cessite des semis au printemps ou en automne.',\n                    'Lyon':'Le climat semi-continental de Lyon convient aux gazons de saison fra\u00eeche. Automne (septembre) ou printemps (avril).',\n                    'Toulouse':'Toulouse a un climat doux. Le semis d\\'automne (septembre\u2013octobre) est id\u00e9al.',\n                    'Sydney':'Le climat temp\u00e9r\u00e9 de Sydney est parfait pour les gazons de saison chaude. Semez au printemps (septembre\u2013novembre).',\n                    'Melbourne':'Le climat variable de Melbourne signifie que le printemps (octobre\u2013novembre) ou le d\u00e9but de l\\'automne (mars) sont appropri\u00e9s.',\n                    'Brisbane':'Le climat subtropical de Brisbane est parfait pour les gazons de saison chaude. Semez au printemps (septembre\u2013octobre).',\n                    'Adelaide':'Le climat m\u00e9diterran\u00e9en d\\'Ad\u00e9la\u00efde signifie automne (avril\u2013mai) ou printemps (septembre\u2013octobre).',\n                    'Barcelona':'Le climat m\u00e9diterran\u00e9en de Barcelone soutient les gazons de saison chaude. Semez au printemps (avril\u2013mai) ou au d\u00e9but de l\\'automne.',\n                    'Valencia':'Le climat chaud de Valence est id\u00e9al pour les gazons de saison chaude. Le semis de printemps (avril\u2013mai) est recommand\u00e9.'\n                }[city] || '';\n                let rec = climate==='warm'?\n                    `Pour le climat chaud de <strong>${city}<\/strong>, nous recommandons de semer du <strong>${grass}<\/strong> pendant ${window}. ` :\n                    `Pour le climat temp\u00e9r\u00e9 de <strong>${city}<\/strong>, nous recommandons de semer du <strong>${grass}<\/strong> pendant ${window}. `;\n                rec += proj==='newLawn'?\n                    'Pr\u00e9parez soigneusement le sol, maintenez le lit de semence humide pendant 7 \u00e0 21 jours.' :\n                    'Tondez le gazon existant \u00e0 ras, ratissez et arrosez l\u00e9g\u00e8rement jusqu\\'\u00e0 ce que les nouveaux semis soient bien \u00e9tablis.';\n                if (note) rec += `<br><br><strong>Note locale :<\/strong> ${note}`;\n                if (hotDryCities.has(city)) rec += '<br><br><strong>Conseil :<\/strong> La quantit\u00e9 de semences a \u00e9t\u00e9 augment\u00e9e de +12 % pour ce climat chaud\/sec.';\n                return rec;\n            }\n\n            function calculateAndDisplay() {\n                clearValidation();\n                let err = false;\n                const areaUnit = areaUnitSelect.value;\n                const lv = parseFloat(lengthInput.value), wv = parseFloat(widthInput.value), tv = parseFloat(totalAreaInput.value);\n                const hasL = !isNaN(lv) && lengthInput.value.trim()!=='', hasW = !isNaN(wv) && widthInput.value.trim()!=='', hasT = !isNaN(tv) && totalAreaInput.value.trim()!=='';\n                let areaInUnit;\n                if (hasT) {\n                    if (tv<0) { showValidation('La surface ne peut pas \u00eatre n\u00e9gative.'); totalAreaInput.classList.add('has-error'); err=true; }\n                    else if (tv===0) { showValidation('La surface doit \u00eatre sup\u00e9rieure \u00e0 0.'); totalAreaInput.classList.add('has-error'); err=true; }\n                    else areaInUnit = tv;\n                } else if (hasL && hasW) {\n                    if (lv<0||wv<0) { showValidation('Les dimensions ne peuvent pas \u00eatre n\u00e9gatives.'); if(lv<0)lengthInput.classList.add('has-error'); if(wv<0)widthInput.classList.add('has-error'); err=true; }\n                    else if (lv===0||wv===0) { showValidation('Les dimensions doivent \u00eatre sup\u00e9rieures \u00e0 0.'); if(lv===0)lengthInput.classList.add('has-error'); if(wv===0)widthInput.classList.add('has-error'); err=true; }\n                    else areaInUnit = lv * wv;\n                } else if (hasL && !hasW) { showValidation('Veuillez entrer la largeur.'); widthInput.classList.add('has-error'); err=true; }\n                else if (!hasL && hasW) { showValidation('Veuillez entrer la longueur.'); lengthInput.classList.add('has-error'); err=true; }\n                else { showValidation('Entrez les dimensions ou la surface totale.'); lengthInput.classList.add('has-error'); widthInput.classList.add('has-error'); totalAreaInput.classList.add('has-error'); err=true; }\n                if (err) { resultsSection.classList.remove('visible'); return; }\n\n                const areaSqFt = areaToSqFt(areaInUnit, areaUnit);\n                const season = getSelectedSeason(), proj = getProjectType();\n                const base = seedingRates[season]?.[proj] || 4;\n                const adjusted = hotDryCities.has(currentCity) ? base * hotDryMultiplier : base;\n                const seedLbs = (areaSqFt\/1000) * adjusted;\n                const weightUnit = weightUnitSelect.value;\n                const seedVal = lbsToWeight(seedLbs, weightUnit);\n                const altAreaU = altAreaUnit(areaUnit), altWeightU = altWeightUnit(weightUnit);\n                const areaAlt = sqFtToArea(areaSqFt, altAreaU);\n                const seedAlt = lbsToWeight(seedLbs, altWeightU);\n\n                resultArea.innerHTML = `<strong>${fmtNum(areaInUnit)} ${fmtAreaUnit(areaUnit)}<\/strong> <span class=\"alt-unit\">(${fmtNum(areaAlt)} ${fmtAreaUnit(altAreaU)})<\/span>`;\n                resultSeed.innerHTML = `<span class=\"primary-weight\">${fmtNum(seedVal)} ${fmtWeightUnit(weightUnit)}<\/span> <span class=\"alt-unit\">(${fmtNum(seedAlt)} ${fmtWeightUnit(altWeightU)})<\/span>`;\n                resultRecommendation.innerHTML = buildRecommendation(currentCity, grassTypeSelect.value, season, proj);\n                resultsSection.classList.add('visible');\n                resultsSection.scrollIntoView({ behavior:'smooth', block:'nearest' });\n            }\n\n            function resetAll() {\n                clearValidation();\n                resultsSection.classList.remove('visible');\n                userChangedUnits = false;\n                countrySelect.value = 'USA'; currentCountry = 'USA';\n                populateCities('USA');\n                currentCity = citySelect.value;\n                populateGrassTypes('USA', currentCity);\n                areaUnitSelect.value = 'sqft'; weightUnitSelect.value = 'lbs';\n                updateUnitHints(); updateToggleBtns();\n                qs('#projectNewLawn').checked = true;\n                lengthInput.value = ''; widthInput.value = ''; totalAreaInput.value = '';\n            }\n\n            countrySelect.addEventListener('change', function() {\n                currentCountry = this.value; userChangedUnits = false;\n                populateCities(currentCountry);\n                currentCity = citySelect.value;\n                populateGrassTypes(currentCountry, currentCity);\n                applyDefaultUnits(currentCountry);\n                clearValidation(); resultsSection.classList.remove('visible');\n            });\n            citySelect.addEventListener('change', function() {\n                currentCity = this.value;\n                populateGrassTypes(currentCountry, currentCity);\n                clearValidation(); resultsSection.classList.remove('visible');\n            });\n            grassTypeSelect.addEventListener('change', ()=>{ clearValidation(); resultsSection.classList.remove('visible'); });\n            wrapper.querySelectorAll('input[name=\"projectType\"]').forEach(r => r.addEventListener('change', ()=>{ clearValidation(); resultsSection.classList.remove('visible'); }));\n            areaUnitSelect.addEventListener('change', function() {\n                userChangedUnits = true; updateUnitHints(); updateToggleBtns();\n                clearValidation(); resultsSection.classList.remove('visible');\n            });\n            weightUnitSelect.addEventListener('change', function() {\n                userChangedUnits = true; clearValidation(); resultsSection.classList.remove('visible');\n            });\n            imperialToggle.addEventListener('click', ()=>{\n                areaUnitSelect.value = 'sqft'; weightUnitSelect.value = 'lbs';\n                userChangedUnits = true; updateUnitHints(); updateToggleBtns();\n                clearValidation(); resultsSection.classList.remove('visible');\n            });\n            metricToggle.addEventListener('click', ()=>{\n                areaUnitSelect.value = 'sqm'; weightUnitSelect.value = 'kg';\n                userChangedUnits = true; updateUnitHints(); updateToggleBtns();\n                clearValidation(); resultsSection.classList.remove('visible');\n            });\n            [lengthInput, widthInput, totalAreaInput].forEach(inp => {\n                inp.addEventListener('input', function() {\n                    this.classList.remove('has-error');\n                    if (validationMsg.classList.contains('visible')) clearValidation();\n                    resultsSection.classList.remove('visible');\n                });\n                inp.addEventListener('keydown', function(e) { if(e.key==='Enter'){ e.preventDefault(); calculateAndDisplay(); } });\n            });\n            calculateBtn.addEventListener('click', calculateAndDisplay);\n            resetBtn.addEventListener('click', resetAll);\n\n            \/\/ Initialisation\n            currentCountry = 'USA';\n            populateCities('USA');\n            currentCity = citySelect.value;\n            populateGrassTypes('USA', currentCity);\n            areaUnitSelect.value = 'sqft'; weightUnitSelect.value = 'lbs';\n            updateUnitHints(); updateToggleBtns();\n            qs('#projectNewLawn').checked = true;\n            resultsSection.classList.remove('visible');\n            clearValidation();\n            userChangedUnits = false;\n        })();\n    <\/script>\n<\/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-cloture\/\" class=\"aiper-tl-tag\">Calculateur de mat\u00e9riaux de cl\u00f4ture<\/a>\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    <\/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\/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<a href=\"https:\/\/aiper.com\/blogs\/fr\/comment-eliminer-lierre-terrestre-pelouse\/\" class=\"aiper-tl-tag\">Comment se d\u00e9barrasser du lierre terrestre dans la pelouse<\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n.aiper-tool-links{margin:2.5rem 0 1.5rem;padding:1.5rem 1.75rem;background:linear-gradient(135deg,rgba(148,134,247,.04),rgba(30,202,211,.04));border-radius:12px;border:1px solid rgba(148,134,247,.10)}\n.aiper-tl-section{margin-bottom:1.25rem}\n.aiper-tl-section:last-child{margin-bottom:0}\n.aiper-tl-heading{font-size:.75rem;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:#8899aa;margin:0 0 .65rem}\n.aiper-tl-tags{display:flex;flex-wrap:wrap;gap:.5rem}\n.aiper-tl-tag{display:inline-block;padding:.4rem .95rem;font-size:.82rem;font-weight:500;line-height:1.35;color:#9486f7;background:rgba(148,134,247,.055);border:1px solid rgba(30,202,211,.25);border-radius:22px;text-decoration:none;transition:all .18s}\n.aiper-tl-tag:hover{background:#1ecad3;color:#fff;border-color:#1ecad3;box-shadow:0 2px 10px rgba(30,202,211,.22)}\n<\/style>","protected":false},"excerpt":{"rendered":"<p>Estimez la quantit\u00e9 parfaite de semences pour votre pelouse 1 Emplacement &amp; climat Pays \u00c9tats-UnisAustralieAllemagneFranceEspagne Ville \/ R\u00e9gion 2 D\u00e9tails de la pelouse Type de gazon Type de projet Nouvelle pelouse Sursemis \/ R\u00e9paration 3 Dimensions de la surface Unit\u00e9 de surface Imp\u00e9rial M\u00e9trique Pieds carr\u00e9s (sq ft)M\u00e8tres carr\u00e9s (sq m)AcresHectares (ha) Unit\u00e9 de poids [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"aiper_reading_time":1,"aiper_last_reviewed":"","aiper_reviewer":0,"aiper_related_ids":[],"aiper_layout":"","footnotes":""},"class_list":["post-2327","page","type-page","status-publish","hentry"],"lang":"fr","translations":{"fr":2327,"es":2330,"en":2316,"de":2324},"_links":{"self":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2327","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=2327"}],"version-history":[{"count":3,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2327\/revisions"}],"predecessor-version":[{"id":4351,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2327\/revisions\/4351"}],"wp:attachment":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/media?parent=2327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}