{"id":2330,"date":"2026-06-04T06:56:31","date_gmt":"2026-06-04T06:56:31","guid":{"rendered":"https:\/\/aiper.com\/blogs\/?page_id=2330"},"modified":"2026-06-24T04:25:44","modified_gmt":"2026-06-24T04:25:44","slug":"calculadora-semillas-cesped","status":"publish","type":"page","link":"https:\/\/aiper.com\/blogs\/es\/calculadora-semillas-cesped\/","title":{"rendered":"Calculadora de semillas de c\u00e9sped"},"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\">Calcule la cantidad perfecta de semillas para su c\u00e9sped<\/p>\n        <\/div>\n\n        <div class=\"grass-calc-step\">\n            <div class=\"grass-calc-step-label\"><span class=\"step-num\">1<\/span> Ubicaci\u00f3n y clima<\/div>\n            <div class=\"grass-calc-row\">\n                <div class=\"grass-calc-field\">\n                    <label for=\"countrySelect\">Pa\u00eds<\/label>\n                    <select id=\"countrySelect\">\n                        <option value=\"USA\">Estados Unidos<\/option>\n                        <option value=\"Australia\">Australia<\/option>\n                        <option value=\"Germany\">Alemania<\/option>\n                        <option value=\"France\">Francia<\/option>\n                        <option value=\"Spain\">Espa\u00f1a<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"grass-calc-field\">\n                    <label for=\"citySelect\">Ciudad \/ Regi\u00f3n<\/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> Detalles del c\u00e9sped<\/div>\n            <div class=\"grass-calc-row\">\n                <div class=\"grass-calc-field\">\n                    <label for=\"grassTypeSelect\">Tipo de c\u00e9sped<\/label>\n                    <select id=\"grassTypeSelect\"><\/select>\n                <\/div>\n            <\/div>\n            <div style=\"margin-top: 12px;\">\n                <label style=\"margin-bottom: 6px;\">Tipo de proyecto<\/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\">C\u00e9sped nuevo<\/label>\n                    <\/div>\n                    <div class=\"grass-calc-radio-chip\">\n                        <input type=\"radio\" name=\"projectType\" id=\"projectOverseeding\" value=\"overseeding\">\n                        <label for=\"projectOverseeding\">Resiembra \/ Reparaci\u00f3n<\/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> Dimensiones del \u00e1rea<\/div>\n            <div class=\"grass-calc-row\">\n                <div class=\"grass-calc-field-sm\">\n                    <label for=\"areaUnitSelect\">Unidad de \u00e1rea\n                        <span class=\"grass-calc-unit-toggle-group\">\n                            <button type=\"button\" class=\"grass-calc-unit-toggle-btn active\" data-system=\"imperial\">Imperial<\/button>\n                            <button type=\"button\" class=\"grass-calc-unit-toggle-btn\" data-system=\"metric\">M\u00e9trico<\/button>\n                        <\/span>\n                    <\/label>\n                    <select id=\"areaUnitSelect\">\n                        <option value=\"sqft\">Pies cuadrados (sq ft)<\/option>\n                        <option value=\"sqm\">Metros cuadrados (sq m)<\/option>\n                        <option value=\"acres\">Acres<\/option>\n                        <option value=\"hectares\">Hect\u00e1reas<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"grass-calc-field-sm\">\n                    <label for=\"weightUnitSelect\">Unidad de peso de semillas<\/label>\n                    <select id=\"weightUnitSelect\">\n                        <option value=\"lbs\">Libras (lbs)<\/option>\n                        <option value=\"oz\">Onzas (oz)<\/option>\n                        <option value=\"kg\">Kilogramos (kg)<\/option>\n                        <option value=\"g\">Gramos (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\">Largo<\/label>\n                    <input type=\"number\" id=\"lengthInput\" placeholder=\"ej. 30\" min=\"0\" step=\"any\">\n                <\/div>\n                <div class=\"grass-calc-field\">\n                    <label for=\"widthInput\" id=\"widthLabel\">Ancho<\/label>\n                    <input type=\"number\" id=\"widthInput\" placeholder=\"ej. 50\" min=\"0\" step=\"any\">\n                <\/div>\n            <\/div>\n            <div class=\"grass-calc-or-divider\">o<\/div>\n            <div class=\"grass-calc-row\">\n                <div class=\"grass-calc-field\">\n                    <label for=\"totalAreaInput\" id=\"totalAreaLabel\">\u00c1rea total <span class=\"label-hint\">(anula largo y ancho)<\/span><\/label>\n                    <input type=\"number\" id=\"totalAreaInput\" placeholder=\"Ingrese el \u00e1rea total directamente\" 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\">Calcular<\/button>\n            <button class=\"grass-calc-btn grass-calc-btn-outline\" id=\"resetBtn\">Restablecer<\/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>Resultados de semillas de c\u00e9sped<\/h3>\n            <div class=\"grass-calc-result-item\">\n                <div class=\"grass-calc-result-label\">\u00c1rea total del c\u00e9sped<\/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\">Total de semillas necesarias<\/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: ['Berl\u00edn', 'Hamburgo', 'M\u00fanich', 'Frankfurt'],\n                France: ['Par\u00eds', 'Marsella', 'Lyon', 'Toulouse'],\n                Spain: ['Madrid', 'Barcelona', 'Valencia', 'Sevilla']\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                'Berl\u00edn':'cool','Hamburgo':'cool','M\u00fanich':'cool','Frankfurt':'cool',\n                'Par\u00eds':'cool','Marsella':'cool','Lyon':'cool','Toulouse':'cool',\n                'Madrid':'warm','Barcelona':'warm','Valencia':'warm','Sevilla':'warm'\n            };\n            const hotDryCities = new Set(['Phoenix', 'Madrid', 'Sevilla', 'Perth']);\n            const allGrassTypes = [\n                { name: 'Pasto azul de Kentucky', season: 'cool' },\n                { name: 'Ballico perenne', season: 'cool' },\n                { name: 'Festuca fina', season: 'cool' },\n                { name: 'Bermuda', season: 'warm' },\n                { name: 'Zoysia', season: 'warm' },\n                { name: 'Pasto b\u00fafalo', 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:'pies', sqm:'m', acres:'acres', hectares:'ha' }[unit] || '';\n                lengthLabel.textContent = `Largo (${abbr})`;\n                widthLabel.textContent = `Ancho (${abbr})`;\n                totalAreaLabel.innerHTML = `\u00c1rea total <span class=\"label-hint\">(anula largo y ancho, ${abbr})<\/span>`;\n                lengthInput.placeholder = `ej. 30 ${abbr}`;\n                widthInput.placeholder = `ej. 50 ${abbr}`;\n                totalAreaInput.placeholder = `Ingrese el \u00e1rea total 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'?' (temporada fr\u00eda)':' (temporada c\u00e1lida)');\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:'pies cuadrados',sqm:'metros cuadrados',acres:'acres',hectares:'hect\u00e1reas'}[u]||u; }\n            function fmtWeightUnit(u) { return {lbs:'libras',oz:'onzas',kg:'kilogramos',g:'gramos'}[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'?'principios de oto\u00f1o (septiembre a octubre) o principios de primavera (marzo a abril)':'principios de oto\u00f1o o principios de primavera'):\n                    (proj==='newLawn'?'finales de primavera a principios de verano (mayo a junio)':'finales de primavera a principios de verano'));\n                const note = {\n                    'Phoenix':'Debido al calor extremo del desierto en Phoenix, siembre a principios de primavera (febrero-marzo) o principios de oto\u00f1o (octubre).',\n                    'Madrid':'Madrid tiene veranos calurosos y secos. Las mejores ventanas de siembra son principios de primavera (marzo-abril) o principios de oto\u00f1o (septiembre-octubre).',\n                    'Sevilla':'Sevilla tiene veranos muy calurosos. Siembre a principios de primavera (febrero-marzo) o en oto\u00f1o (octubre).',\n                    'Perth':'Perth tiene un clima mediterr\u00e1neo con veranos calurosos y secos. Oto\u00f1o (abril-mayo) o primavera (septiembre-octubre) son ideales.',\n                    'Miami':'En el clima subtropical de Miami, los c\u00e9spedes de temporada c\u00e1lida prosperan. Siembre a finales de primavera (abril-mayo).',\n                    'Houston':'El clima subtropical h\u00famedo de Houston es ideal para c\u00e9spedes de temporada c\u00e1lida. Finales de primavera (abril-mayo) es lo mejor.',\n                    'Los Angeles':'El clima mediterr\u00e1neo suave de Los \u00c1ngeles permite una siembra flexible desde primavera hasta principios de oto\u00f1o.',\n                    'New York':'El clima de cuatro estaciones de Nueva York favorece los c\u00e9spedes de temporada fr\u00eda. Principios de oto\u00f1o (septiembre) es ideal.',\n                    'Chicago':'Los inviernos fr\u00edos de Chicago hacen que principios de oto\u00f1o (finales de agosto-septiembre) sea \u00f3ptimo.',\n                    'Berl\u00edn':'El clima templado de Berl\u00edn se adapta a c\u00e9spedes de temporada fr\u00eda. Siembre a principios de oto\u00f1o (septiembre) o primavera (abril).',\n                    'Hamburgo':'El clima mar\u00edtimo de Hamburgo es excelente para c\u00e9spedes de temporada fr\u00eda. Se recomienda siembra en oto\u00f1o (septiembre-octubre).',\n                    'M\u00fanich':'M\u00fanich tiene inviernos m\u00e1s fr\u00edos. La siembra a principios de oto\u00f1o (septiembre) permite el establecimiento antes de las heladas.',\n                    'Frankfurt':'El clima continental suave de Frankfurt favorece los c\u00e9spedes de temporada fr\u00eda. Siembre en septiembre o abril.',\n                    'Par\u00eds':'El clima templado de Par\u00eds es ideal para c\u00e9spedes de temporada fr\u00eda. Principios de oto\u00f1o o primavera funcionan bien.',\n                    'Marsella':'El clima mediterr\u00e1neo de Marsella con veranos calurosos requiere siembra en primavera u oto\u00f1o.',\n                    'Lyon':'El clima semicontinental de Lyon se adapta a c\u00e9spedes de temporada fr\u00eda. Oto\u00f1o (septiembre) o primavera (abril).',\n                    'Toulouse':'Toulouse tiene un clima suave. La siembra de oto\u00f1o (septiembre-octubre) es ideal.',\n                    'Sydney':'El clima templado de Sydney es excelente para c\u00e9spedes de temporada c\u00e1lida. Siembre en primavera (septiembre-noviembre).',\n                    'Melbourne':'El clima variable de Melbourne hace que la primavera (octubre-noviembre) o principios de oto\u00f1o (marzo) sean adecuados.',\n                    'Brisbane':'El clima subtropical de Brisbane es perfecto para c\u00e9spedes de temporada c\u00e1lida. Siembre en primavera (septiembre-octubre).',\n                    'Adelaide':'El clima mediterr\u00e1neo de Adelaida significa oto\u00f1o (abril-mayo) o primavera (septiembre-octubre).',\n                    'Barcelona':'El clima mediterr\u00e1neo de Barcelona favorece los c\u00e9spedes de temporada c\u00e1lida. Siembre en primavera (abril-mayo) o principios de oto\u00f1o.',\n                    'Valencia':'El clima c\u00e1lido de Valencia es ideal para c\u00e9spedes de temporada c\u00e1lida. Se recomienda siembra en primavera (abril-mayo).'\n                }[city] || '';\n                let rec = climate==='warm'?\n                    `Para el clima c\u00e1lido en <strong>${city}<\/strong>, recomendamos sembrar <strong>${grass}<\/strong> durante ${window}. ` :\n                    `Para el clima templado en <strong>${city}<\/strong>, recomendamos sembrar <strong>${grass}<\/strong> durante ${window}. `;\n                rec += proj==='newLawn'?\n                    'Prepare bien el suelo, mantenga el lecho de siembra h\u00famedo durante 7-21 d\u00edas.' :\n                    'Corte el c\u00e9sped existente al ras, rastrille y riegue ligeramente hasta que las nuevas pl\u00e1ntulas se establezcan.';\n                if (note) rec += `<br><br><strong>Nota local:<\/strong> ${note}`;\n                if (hotDryCities.has(city)) rec += '<br><br><strong>Consejo:<\/strong> La cantidad de semilla se ha ajustado +12% para este clima c\u00e1lido\/seco.';\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('El \u00e1rea no puede ser negativa.'); totalAreaInput.classList.add('has-error'); err=true; }\n                    else if (tv===0) { showValidation('El \u00e1rea debe ser mayor que 0.'); totalAreaInput.classList.add('has-error'); err=true; }\n                    else areaInUnit = tv;\n                } else if (hasL && hasW) {\n                    if (lv<0||wv<0) { showValidation('Las dimensiones no pueden ser negativas.'); 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('Las dimensiones deben ser mayores que 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('Por favor ingrese el ancho.'); widthInput.classList.add('has-error'); err=true; }\n                else if (!hasL && hasW) { showValidation('Por favor ingrese el largo.'); lengthInput.classList.add('has-error'); err=true; }\n                else { showValidation('Ingrese las dimensiones o el \u00e1rea total.'); 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            \/\/ Inicializaci\u00f3n\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\">M\u00e1s herramientas<\/div>\n    <div class=\"aiper-tl-tags\">\n      <a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-cercas\/\" class=\"aiper-tl-tag\">Calculadora de materiales para cercas<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-de-adoquines\/\" class=\"aiper-tl-tag\">Calculadora de Adoquines<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-de-terrazas\/\" class=\"aiper-tl-tag\">Calculadora de Terrazas<\/a>\n    <\/div>\n  <\/div>\n  <div class=\"aiper-tl-section\">\n    <div class=\"aiper-tl-heading\">Art\u00edculos relacionados<\/div>\n    <div class=\"aiper-tl-tags\">\n      <a href=\"https:\/\/aiper.com\/blogs\/es\/ahuyentar-gansos-canadienses-cesped\/\" class=\"aiper-tl-tag\">C\u00f3mo ahuyentar los gansos canadienses del c\u00e9sped<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/es\/como-eliminar-setas-del-cesped\/\" class=\"aiper-tl-tag\">C\u00f3mo eliminar las setas del c\u00e9sped<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/es\/escarificar-cesped-detectar-eliminar-fieltro\/\" class=\"aiper-tl-tag\">Escarificar el c\u00e9sped: c\u00f3mo detectar y eliminar el fieltro<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/es\/como-eliminar-hiedra-terrestre-cesped\/\" class=\"aiper-tl-tag\">C\u00f3mo eliminar la hiedra terrestre del c\u00e9sped<\/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>Calcule la cantidad perfecta de semillas para su c\u00e9sped 1 Ubicaci\u00f3n y clima Pa\u00eds Estados UnidosAustraliaAlemaniaFranciaEspa\u00f1a Ciudad \/ Regi\u00f3n 2 Detalles del c\u00e9sped Tipo de c\u00e9sped Tipo de proyecto C\u00e9sped nuevo Resiembra \/ Reparaci\u00f3n 3 Dimensiones del \u00e1rea Unidad de \u00e1rea Imperial M\u00e9trico Pies cuadrados (sq ft)Metros cuadrados (sq m)AcresHect\u00e1reas Unidad de peso de semillas [&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-2330","page","type-page","status-publish","hentry"],"lang":"es","translations":{"es":2330,"en":2316,"de":2324,"fr":2327},"_links":{"self":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2330","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=2330"}],"version-history":[{"count":3,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2330\/revisions"}],"predecessor-version":[{"id":4384,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2330\/revisions\/4384"}],"wp:attachment":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/media?parent=2330"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}