{"id":7570,"date":"2026-08-13T14:24:40","date_gmt":"2026-08-13T12:24:40","guid":{"rendered":"https:\/\/trypool.com\/?page_id=7570"},"modified":"2026-08-14T08:29:44","modified_gmt":"2026-08-14T06:29:44","slug":"calculadora-seccion-cable-tira-led","status":"publish","type":"page","link":"https:\/\/trypool.com\/en\/calculadora-seccion-cable-tira-led\/","title":{"rendered":"CALCULADORA TIRAS LED"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"7570\" class=\"elementor elementor-7570\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-992508c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"992508c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c4e12c3\" data-id=\"c4e12c3\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-413b942 elementor-widget elementor-widget-heading\" data-id=\"413b942\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-heading-title elementor-size-default\">HERRAMIENTA PROFESIONAL GRATUITA <\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1f511db elementor-widget elementor-widget-heading\" data-id=\"1f511db\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Calculadora de secci\u00f3n de cable para tiras LED <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0a48964 elementor-widget elementor-widget-text-editor\" data-id=\"0a48964\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Calcula la secci\u00f3n de cable recomendada para instalar tiras LED, comprueba la ca\u00edda de tensi\u00f3n y compara la alimentaci\u00f3n por uno o por los dos extremos.<\/p><p>Introduce la potencia, la longitud de la tira, la distancia hasta la fuente de alimentaci\u00f3n y las caracter\u00edsticas del cable. La herramienta realizar\u00e1 los c\u00e1lculos y te indicar\u00e1 la secci\u00f3n comercial recomendada para el proyecto.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e885cb9 elementor-drop-cap-yes elementor-drop-cap-view-default elementor-widget elementor-widget-text-editor\" data-id=\"e885cb9\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;drop_cap&quot;:&quot;yes&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h4><strong data-start=\"2601\" data-end=\"2643\">\u00bfNecesitas saber qu\u00e9 datos introducir?<\/strong><\/h4>\n<div>Consulta nuestra gu\u00eda para calcular el cable de una tira LED \u2192<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1021a63 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1021a63\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ab5c26e\" data-id=\"ab5c26e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1fcde75 elementor-widget elementor-widget-html\" data-id=\"1fcde75\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"calculadora\" data-widget_type=\"html.default\">\n\t\t\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, viewport-fit=cover\">\n<title>Calculadora de cable para tiras LED<\/title>\n<style>\n:root{\n  color-scheme: light;\n  --page:#f9f9f7; --surface:#fcfcfb; --surface-2:#f2f1ed;\n  --ink:#0b0b0b; --ink-2:#52514e; --muted:#898781;\n  --grid:#e1e0d9; --baseline:#c3c2b7; --border:rgba(11,11,11,0.10);\n  --good:#0ca30c; --warning:#fab219; --critical:#d03b3b;\n  --good-soft:rgba(12,163,12,0.10); --critical-soft:rgba(208,59,59,0.10); --warning-soft:rgba(250,178,25,0.16);\n  --accent:#2a78d6; --accent-soft:rgba(42,120,214,0.10);\n  --extB:#eb6834; --extB-soft:rgba(235,104,52,0.10);\n  --input-bg:#ffffff;\n  --shadow:0 1px 2px rgba(11,11,11,.05), 0 8px 24px -12px rgba(11,11,11,.18);\n  --r:14px;\n}\n@media (prefers-color-scheme: dark){\n  :root:not([data-theme=\"light\"]){\n    color-scheme: dark;\n    --page:#0d0d0d; --surface:#1a1a19; --surface-2:#232322;\n    --ink:#ffffff; --ink-2:#c3c2b7; --muted:#898781;\n    --grid:#2c2c2a; --baseline:#383835; --border:rgba(255,255,255,0.10);\n    --good-soft:rgba(12,163,12,0.16); --critical-soft:rgba(208,59,59,0.18); --warning-soft:rgba(250,178,25,0.16);\n    --accent:#3987e5; --accent-soft:rgba(57,135,229,0.16);\n    --extB:#d95926; --extB-soft:rgba(217,89,38,0.18);\n    --input-bg:#111110;\n    --shadow:0 1px 2px rgba(0,0,0,.4), 0 8px 24px -12px rgba(0,0,0,.7);\n  }\n}\n:root[data-theme=\"dark\"]{\n  color-scheme: dark;\n  --page:#0d0d0d; --surface:#1a1a19; --surface-2:#232322;\n  --ink:#ffffff; --ink-2:#c3c2b7; --muted:#898781;\n  --grid:#2c2c2a; --baseline:#383835; --border:rgba(255,255,255,0.10);\n  --good-soft:rgba(12,163,12,0.16); --critical-soft:rgba(208,59,59,0.18); --warning-soft:rgba(250,178,25,0.16);\n  --accent:#3987e5; --accent-soft:rgba(57,135,229,0.16);\n  --extB:#d95926; --extB-soft:rgba(217,89,38,0.18);\n  --input-bg:#111110;\n  --shadow:0 1px 2px rgba(0,0,0,.4), 0 8px 24px -12px rgba(0,0,0,.7);\n}\n\n*{box-sizing:border-box}\nhtml,body{margin:0;padding:0}\nbody{\n  background:var(--page); color:var(--ink);\n  font:15px\/1.5 system-ui,-apple-system,\"Segoe UI\",sans-serif;\n  -webkit-font-smoothing:antialiased;\n  padding-bottom:env(safe-area-inset-bottom);\n}\nh1,h2,h3{margin:0;font-weight:650;letter-spacing:-.01em}\nbutton{font:inherit;color:inherit}\n\n.wrap{max-width:1340px;margin:0 auto;padding:20px 18px 64px}\nheader.top{\n  display:flex;align-items:center;gap:14px;flex-wrap:wrap;\n  padding:16px 18px;margin-bottom:18px;\n  background:var(--surface);border:1px solid var(--border);border-radius:var(--r);box-shadow:var(--shadow);\n}\n.brand{display:flex;align-items:center;gap:12px;margin-right:auto;min-width:0}\n.brand .logo{width:40px;height:40px;border-radius:11px;flex:none;\n  background:linear-gradient(140deg,var(--accent),#7b3aa7);display:grid;place-items:center;color:#fff}\n.brand h1{font-size:17px;line-height:1.2}\n.brand p{margin:2px 0 0;font-size:12.5px;color:var(--muted)}\n.tools{display:flex;gap:8px;flex-wrap:wrap}\n\n.btn{display:inline-flex;align-items:center;gap:7px;background:var(--surface-2);border:1px solid var(--border);\n  border-radius:10px;padding:8px 12px;font-size:13.5px;font-weight:550;cursor:pointer;\n  transition:background .15s,border-color .15s,transform .06s;white-space:nowrap}\n.btn:hover{background:var(--accent-soft);border-color:var(--accent)}\n.btn:active{transform:translateY(1px)}\n.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}\n.btn.primary:hover{filter:brightness(1.08)}\n.btn svg{width:15px;height:15px;flex:none}\n\n.grid{display:grid;grid-template-columns:minmax(330px,380px) 1fr;gap:18px;align-items:start}\n@media (max-width:1000px){.grid{grid-template-columns:1fr}}\n\n.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--r);\n  box-shadow:var(--shadow);padding:18px;margin-bottom:18px}\n.card > h2{font-size:12px;text-transform:uppercase;letter-spacing:.09em;color:var(--muted);\n  font-weight:650;margin-bottom:14px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.card > h2 .h-note{margin-left:auto;text-transform:none;letter-spacing:0;font-weight:500;font-size:12px}\n\n.sec-title{font-size:11.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--accent);\n  font-weight:700;margin:20px 0 10px;padding-bottom:6px;border-bottom:1px solid var(--border)}\n.sec-title:first-of-type{margin-top:0}\n.field{margin-bottom:13px}\n.field > label{display:flex;align-items:baseline;gap:6px;font-size:13.5px;font-weight:550;margin-bottom:5px}\n.field .unit{color:var(--muted);font-weight:450;font-size:12px}\n.field .help{margin-left:auto;color:var(--muted);font-size:11.5px;cursor:help}\n.field.off{opacity:.45}\n.field.off input{pointer-events:none}\ninput[type=number],select{width:100%;background:var(--input-bg);color:var(--ink);\n  border:1px solid var(--border);border-radius:9px;padding:9px 11px;font:inherit;\n  font-variant-numeric:tabular-nums;transition:border-color .15s,box-shadow .15s}\ninput[type=number]:focus,select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}\ninput[type=number].bad{border-color:var(--critical);box-shadow:0 0 0 3px var(--critical-soft)}\nselect{appearance:none;cursor:pointer;\n  background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%);\n  background-position:calc(100% - 17px) 50%,calc(100% - 12px) 50%;\n  background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:34px}\n.seg{display:flex;border:1px solid var(--border);border-radius:9px;overflow:hidden;background:var(--input-bg)}\n.seg button{flex:1;background:none;border:none;padding:9px 6px;font-size:13px;font-weight:550;\n  cursor:pointer;color:var(--ink-2);transition:background .15s,color .15s}\n.seg button + button{border-left:1px solid var(--border)}\n.seg button[aria-pressed=true]{background:var(--accent);color:#fff}\n.seg-note{margin:7px 0 0;font-size:11.5px;line-height:1.45;color:var(--muted)}\n.chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:7px}\n.chip{background:var(--surface-2);border:1px solid var(--border);border-radius:7px;padding:5px 9px;\n  font-size:12px;font-variant-numeric:tabular-nums;cursor:pointer;transition:background .12s,border-color .12s}\n.chip:hover{background:var(--accent-soft);border-color:var(--accent)}\n.chip[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}\n.warn-inline{display:none;margin-top:10px;padding:9px 11px;border-radius:9px;font-size:12.5px;\n  background:var(--critical-soft);color:var(--ink);border:1px solid var(--critical)}\n.warn-inline.on{display:block}\n\n\/* verdicto + recomendaci\u00f3n *\/\n.banner{display:flex;align-items:center;gap:14px;padding:15px 18px;border-radius:var(--r);\n  border:1px solid var(--border);margin-bottom:14px;background:var(--surface);box-shadow:var(--shadow)}\n.banner .icon{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;flex:none}\n.banner .icon svg{width:23px;height:23px}\n.banner .txt{min-width:0}\n.banner .txt strong{display:block;font-size:16px;letter-spacing:-.01em}\n.banner .txt span{font-size:13px;color:var(--ink-2)}\n.banner .rec{margin-left:auto;text-align:right;flex:none}\n.banner .rec small{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:650}\n.banner .rec b{font-size:19px;font-variant-numeric:tabular-nums;letter-spacing:-.02em}\n.banner.slim{padding:12px 16px}\n.banner.slim .icon{width:34px;height:34px;border-radius:10px}\n.banner.slim .icon svg{width:19px;height:19px}\n.banner.slim .txt strong{font-size:14px}\n.banner.slim .txt span{font-size:12.5px}\n.v-ok{background:var(--good-soft);color:var(--good)}\n.v-no{background:var(--critical-soft);color:var(--critical)}\n.v-wa{background:var(--warning-soft);color:#8a6000}\n.v-in{background:var(--accent-soft);color:var(--accent)}\n:root[data-theme=\"dark\"] .v-wa{color:var(--warning)}\n@media (prefers-color-scheme: dark){:root:not([data-theme=\"light\"]) .v-wa{color:var(--warning)}}\n@media (max-width:640px){\n  .banner{flex-wrap:wrap}\n  .banner .rec{margin-left:56px;text-align:left}\n}\n\n.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:10px}\n.kpi{background:var(--surface-2);border:1px solid var(--border);border-radius:11px;padding:12px 13px}\n.kpi small{display:block;font-size:11px;color:var(--muted);font-weight:600;letter-spacing:.03em;margin-bottom:5px;line-height:1.3}\n.kpi b{font-size:21px;font-weight:650;letter-spacing:-.02em;font-variant-numeric:tabular-nums;display:block;line-height:1.15}\n.kpi b .u{font-size:12.5px;font-weight:500;color:var(--muted);margin-left:2px}\n.kpi.hero{background:var(--accent-soft);border-color:var(--accent)}\n.kpi.hero b{color:var(--accent)}\n\n.meter-wrap{margin-top:16px}\n.meter-head{display:flex;align-items:baseline;gap:8px;font-size:12.5px;color:var(--ink-2);margin-bottom:7px;flex-wrap:wrap}\n.meter-head b{font-size:15px;font-variant-numeric:tabular-nums;color:var(--ink)}\n.meter-head .lim{margin-left:auto;color:var(--muted);font-size:12px}\n.meter{position:relative;height:12px;background:var(--surface-2);border:1px solid var(--border);border-radius:99px;overflow:hidden}\n.meter .fill{position:absolute;inset:0 auto 0 0;border-radius:99px;transition:width .3s cubic-bezier(.3,.8,.4,1),background .2s}\n.meter .lim-mark{position:absolute;top:-3px;bottom:-3px;width:2px;background:var(--ink);border-radius:2px}\n\n\/* tablas *\/\n.tbl-scroll{overflow-x:auto;margin:0 -4px;padding:0 4px}\ntable{border-collapse:collapse;width:100%;font-size:13px;font-variant-numeric:tabular-nums}\nth,td{padding:8px 10px;text-align:right;white-space:nowrap}\nth{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);\n  font-weight:650;border-bottom:1px solid var(--baseline);text-align:right}\nth:first-child,td:first-child{text-align:left}\ntbody tr{border-bottom:1px solid var(--grid)}\ntbody tr:last-child{border-bottom:none}\ntbody tr.sel{background:var(--accent-soft)}\ntbody tr.sel td:first-child{box-shadow:inset 3px 0 0 var(--accent)}\ntbody tr.pick td{font-weight:650}\ntd.st{text-align:center}\ntable.res td:first-child{color:var(--ink-2);font-weight:500}\ntable.res tbody tr.hl{background:var(--surface-2)}\ntable.res tbody tr.hl td{font-weight:700}\nth.cA{color:var(--accent)}\nth.cB{color:var(--extB)}\nth.cH{color:var(--ink)}\ntd.cH{font-weight:650}\n.dash{color:var(--muted)}\n.badge{display:inline-flex;align-items:center;gap:5px;padding:3px 8px;border-radius:7px;\n  font-size:11.5px;font-weight:700;letter-spacing:.02em}\n.badge svg{width:12px;height:12px}\n.b-ok{background:var(--good-soft);color:var(--good)}\n.b-no{background:var(--critical-soft);color:var(--critical)}\n.tag{font-size:10px;font-weight:700;letter-spacing:.05em;padding:2px 6px;border-radius:5px;\n  background:var(--accent);color:#fff;margin-left:6px;vertical-align:1px}\n.note{font-size:12px;color:var(--muted);line-height:1.6;margin-top:14px}\n\n\/* esquema *\/\n.schem{width:100%;height:auto;display:block;overflow:visible}\n.schem text{font:11px system-ui,-apple-system,\"Segoe UI\",sans-serif;fill:var(--ink-2)}\n.schem .lbl-strong{font-size:11.5px;font-weight:650;fill:var(--ink)}\n.schem .lbl-mut{font-size:10px;fill:var(--muted)}\n.rutas{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:9px;margin-top:14px}\n.ruta{border:1px solid var(--border);border-left:3px solid var(--muted);border-radius:9px;\n  padding:9px 11px;background:var(--surface-2);font-size:12.5px}\n.ruta.a{border-left-color:var(--accent)}\n.ruta.b{border-left-color:var(--extB)}\n.ruta.l{border-left-color:var(--warning)}\n.ruta b{display:block;font-size:12px;margin-bottom:3px}\n.ruta.a b{color:var(--accent)} .ruta.b b{color:var(--extB)}\n.ruta span{color:var(--ink-2);font-variant-numeric:tabular-nums}\n\n\/* gr\u00e1fica *\/\n.chart{width:100%;height:auto;display:block;font-variant-numeric:tabular-nums}\n.chart text{font:11px system-ui,-apple-system,\"Segoe UI\",sans-serif}\n.chart .tick{fill:var(--muted);font-size:10.5px}\n.chart .cat{fill:var(--ink-2);font-size:11.5px;font-weight:550}\n.chart .cat.sel{fill:var(--accent);font-weight:700}\n.chart .val{fill:var(--ink-2);font-size:10.5px;font-weight:600}\n.chart .val.out,.chart .lim-lbl{paint-order:stroke;stroke:var(--surface);stroke-width:3px;stroke-linejoin:round}\n.chart .gridline{stroke:var(--grid);stroke-width:1}\n.chart .axis{stroke:var(--baseline);stroke-width:1}\n.chart .bar{transition:opacity .12s}\n.chart .bar.hov{opacity:.78}\n.legend{display:flex;flex-wrap:wrap;gap:14px;margin-top:12px;font-size:12.5px;color:var(--ink-2)}\n.legend span{display:inline-flex;align-items:center;gap:6px}\n.legend i{width:12px;height:12px;border-radius:3px;display:inline-block;flex:none}\n.legend .dashline{width:16px;height:0;border-top:2px dashed var(--ink);border-radius:0}\n\n#tip{position:fixed;z-index:60;pointer-events:none;opacity:0;transition:opacity .12s;\n  background:var(--surface);border:1px solid var(--border);border-radius:10px;\n  box-shadow:0 6px 24px -6px rgba(0,0,0,.35);padding:9px 11px;font-size:12.5px;min-width:170px}\n#tip.on{opacity:1}\n#tip .t-h{font-weight:700;margin-bottom:5px;font-size:13px}\n#tip .t-r{display:flex;gap:12px;justify-content:space-between;color:var(--ink-2)}\n#tip .t-r b{font-variant-numeric:tabular-nums;color:var(--ink);font-weight:600}\n\ndialog{border:1px solid var(--border);border-radius:var(--r);background:var(--surface);color:var(--ink);\n  padding:0;max-width:440px;width:calc(100% - 32px);box-shadow:0 20px 60px -20px rgba(0,0,0,.5)}\ndialog::backdrop{background:rgba(0,0,0,.45)}\n.dlg-h{padding:16px 18px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:10px}\n.dlg-h h3{font-size:15px;margin-right:auto}\n.dlg-b{padding:16px 18px;max-height:60vh;overflow:auto}\n.dlg-f{padding:12px 18px;border-top:1px solid var(--border);display:flex;gap:8px;justify-content:flex-end}\n.proj{display:flex;align-items:center;gap:10px;padding:10px 11px;border:1px solid var(--border);\n  border-radius:10px;margin-bottom:8px;background:var(--surface-2)}\n.proj .pi{min-width:0;margin-right:auto}\n.proj .pi b{display:block;font-size:13.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis}\n.proj .pi small{color:var(--muted);font-size:11.5px}\n.icon-btn{background:none;border:1px solid var(--border);border-radius:8px;padding:6px 8px;cursor:pointer;\n  display:grid;place-items:center;transition:background .12s,border-color .12s}\n.icon-btn:hover{background:var(--accent-soft);border-color:var(--accent)}\n.icon-btn.danger:hover{background:var(--critical-soft);border-color:var(--critical);color:var(--critical)}\n.icon-btn svg{width:15px;height:15px}\n.empty{text-align:center;color:var(--muted);font-size:13px;padding:24px 8px}\ninput[type=text]{width:100%;background:var(--input-bg);color:var(--ink);border:1px solid var(--border);\n  border-radius:9px;padding:9px 11px;font:inherit}\ninput[type=text]:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}\n\n.toast{position:fixed;left:50%;bottom:24px;transform:translate(-50%,14px);z-index:80;\n  background:var(--ink);color:var(--page);padding:10px 16px;border-radius:10px;font-size:13.5px;font-weight:550;\n  opacity:0;transition:opacity .2s,transform .2s;pointer-events:none;box-shadow:0 8px 24px -8px rgba(0,0,0,.5)}\n.toast.on{opacity:1;transform:translate(-50%,0)}\n.print-only{display:none}\n\n@media print{\n  @page{size:A4 portrait;margin:12mm}\n  :root{--page:#fff;--surface:#fff;--surface-2:#f5f5f3;--ink:#000;--ink-2:#333;--border:#ccc;--shadow:none}\n  body{background:#fff}\n  .tools,.no-print,dialog,.toast,#tip{display:none !important}\n  .print-only{display:block}\n  .wrap{max-width:none;padding:0}\n  .grid{display:block}\n  .grid > section{display:block}\n  .card{break-inside:avoid;box-shadow:none;border:1px solid #ccc;margin-bottom:10px;padding:12px}\n  .card > h2{margin-bottom:10px}\n  #cardEntradas .sec-title{grid-column:1\/-1;margin:8px 0 4px}\n  #cardEntradas .inputs{display:grid;grid-template-columns:repeat(2,1fr);gap:5px 20px}\n  #cardEntradas .field{margin-bottom:2px;display:flex;align-items:baseline;gap:6px;\n    border-bottom:1px dotted #ddd;padding-bottom:3px}\n  #cardEntradas .field > label{margin-bottom:0;font-size:11px;font-weight:500;color:#444}\n  #cardEntradas .field .help{display:none}\n  #cardEntradas input[type=number],#cardEntradas select{\n    width:auto;border:none;background:none;padding:0;font-size:11.5px;font-weight:700;\n    margin-left:auto;text-align:right;appearance:none;background-image:none}\n  #cardEntradas .chips,#cardEntradas .warn-inline,#cardEntradas .seg-note{display:none}\n  #cardEntradas .seg{border:none;background:none;margin-left:auto}\n  #cardEntradas .seg button{display:none;padding:0;font-size:11.5px;font-weight:700}\n  #cardEntradas .seg button[aria-pressed=true]{display:block;background:none;color:#000}\n  .banner{border:1px solid #999;page-break-after:avoid;box-shadow:none}\n  \/* las tablas deben caber a lo ancho de un A4, sin scroll horizontal *\/\n  .tbl-scroll{overflow:visible;margin:0;padding:0}\n  table{font-size:9.5px;table-layout:auto;width:100%}\n  th,td{padding:4px 4px;white-space:normal}\n  th{font-size:8.5px;letter-spacing:.02em}\n  .badge{padding:2px 5px;font-size:9px;gap:3px}\n  .badge svg{width:9px;height:9px}\n  .tag{font-size:8px;padding:1px 4px;margin-left:4px}\n  .kpi b{font-size:17px}\n  .rutas{grid-template-columns:repeat(3,1fr);gap:6px}\n  .ruta{padding:6px 8px;font-size:10px}\n}\n<\/style>\n<\/head>\n<body>\n<div class=\"wrap\">\n\n<header class=\"top\">\n  <div class=\"brand\">\n    <div class=\"logo\" aria-hidden=\"true\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"22\" height=\"22\"><path d=\"M13 2 3 14h9l-1 8 10-12h-9l1-8z\"\/><\/svg>\n    <\/div>\n    <div>\n      <h1>Calculadora de cable para tiras LED<\/h1>\n      <p>Alimentaci\u00f3n por uno o dos extremos \u00b7 ca\u00edda de tensi\u00f3n \u00b7 secci\u00f3n recomendada<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"tools\">\n    <button class=\"btn\" id=\"btnTheme\" title=\"Cambiar tema\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"4\"\/><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"\/><\/svg><span>Tema<\/span>\n    <\/button>\n    <button class=\"btn\" id=\"btnReset\" title=\"Volver a los valores por defecto\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\"\/><path d=\"M3 3v5h5\"\/><\/svg><span>Reiniciar<\/span>\n    <\/button>\n    <button class=\"btn\" id=\"btnOpen\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"\/><\/svg><span>Proyectos<\/span>\n    <\/button>\n    <button class=\"btn\" id=\"btnSave\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"\/><path d=\"M17 21v-8H7v8M7 3v5h8\"\/><\/svg><span>Guardar<\/span>\n    <\/button>\n    <button class=\"btn primary\" id=\"btnPdf\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9V2h12v7M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\"\/><path d=\"M6 14h12v8H6z\"\/><\/svg><span>Exportar PDF<\/span>\n    <\/button>\n  <\/div>\n<\/header>\n\n<p class=\"print-only note\" id=\"printMeta\" style=\"margin:0 0 10px\"><\/p>\n\n<div class=\"grid\">\n\n  <!-- ===================== ENTRADAS ===================== -->\n  <section>\n    <div class=\"card\" id=\"cardEntradas\">\n      <h2>Datos de la instalaci\u00f3n <span class=\"h-note\" id=\"projName\"><\/span><\/h2>\n      <div class=\"inputs\">\n\n      <div class=\"sec-title\">Tira LED<\/div>\n\n      <div class=\"field\">\n        <label for=\"V\">Tensi\u00f3n de alimentaci\u00f3n <span class=\"unit\">V<\/span><\/label>\n        <input type=\"number\" id=\"V\" step=\"0.1\" min=\"0.1\" value=\"12\">\n        <div class=\"chips\" id=\"chipsV\">\n          <button class=\"chip\" data-v=\"12\">12 V<\/button>\n          <button class=\"chip\" data-v=\"24\">24 V<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"field\">\n        <label>Tipo de tira<\/label>\n        <div class=\"seg\" id=\"segHilos\" role=\"group\">\n          <button type=\"button\" data-v=\"2\" aria-pressed=\"true\">Blanco<\/button>\n          <button type=\"button\" data-v=\"4\" aria-pressed=\"false\">RGB<\/button>\n        <\/div>\n        <p class=\"seg-note\" id=\"hiloNote\"><\/p>\n      <\/div>\n\n      <div class=\"field\">\n        <label for=\"W\">Potencia de la tira <span class=\"unit\">W\/m<\/span>\n          <span class=\"help\" title=\"Al elegir el tipo de tira se carga su potencia t\u00edpica (Blanco 10 W\/m \u00b7 RGB 11 W\/m). Puedes cambiarla por el dato real del fabricante.\">?<\/span><\/label>\n        <input type=\"number\" id=\"W\" step=\"0.1\" min=\"0\" value=\"10\">\n      <\/div>\n\n      <div class=\"field\">\n        <label for=\"L\">Longitud de cada tira <span class=\"unit\">m<\/span><\/label>\n        <input type=\"number\" id=\"L\" step=\"0.1\" min=\"0\" value=\"3.5\">\n      <\/div>\n\n      <div class=\"field\">\n        <label for=\"N\">N\u00famero de tiras <span class=\"unit\">uds<\/span><\/label>\n        <input type=\"number\" id=\"N\" step=\"1\" min=\"1\" value=\"2\">\n      <\/div>\n\n      <div class=\"sec-title\">Alimentaci\u00f3n<\/div>\n\n      <div class=\"field\">\n        <label>Alimentaci\u00f3n de la tira<\/label>\n        <div class=\"seg\" id=\"segAlim\" role=\"group\">\n          <button type=\"button\" data-v=\"uno\" aria-pressed=\"true\">Un extremo<\/button>\n          <button type=\"button\" data-v=\"dos\" aria-pressed=\"false\">Dos extremos<\/button>\n        <\/div>\n        <p class=\"seg-note\" id=\"alimNote\"><\/p>\n      <\/div>\n\n      <div class=\"field\">\n        <label for=\"U\">Umbral de aviso de doble alimentaci\u00f3n <span class=\"unit\">m<\/span>\n          <span class=\"help\" title=\"Longitud de tira a partir de la cual se recomienda alimentar por los dos extremos.\">?<\/span><\/label>\n        <input type=\"number\" id=\"U\" step=\"0.5\" min=\"0\" value=\"8\">\n      <\/div>\n\n      <div class=\"sec-title\">Cableado<\/div>\n\n      <div class=\"field\">\n        <label>Configuraci\u00f3n del cable largo<\/label>\n        <div class=\"seg\" id=\"segCfg\" role=\"group\">\n          <button type=\"button\" data-v=\"comun\" aria-pressed=\"true\">Com\u00fan para todas<\/button>\n          <button type=\"button\" data-v=\"indep\" aria-pressed=\"false\">Independiente<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"field\">\n        <label for=\"DA\">Distancia fuente \u2192 extremo A <span class=\"unit\">m (solo ida)<\/span><\/label>\n        <input type=\"number\" id=\"DA\" step=\"0.5\" min=\"0\" value=\"20\">\n      <\/div>\n\n      <div class=\"field\" id=\"fieldDB\">\n        <label for=\"DB\">Distancia fuente \u2192 extremo B <span class=\"unit\">m (solo ida)<\/span><\/label>\n        <input type=\"number\" id=\"DB\" step=\"0.5\" min=\"0\" value=\"20\">\n      <\/div>\n\n      <div class=\"field\">\n        <label for=\"S\">Secci\u00f3n de cable que quieres comprobar <span class=\"unit\">mm\u00b2<\/span><\/label>\n        <input type=\"number\" id=\"S\" step=\"0.01\" min=\"0.01\" value=\"10\">\n        <div class=\"chips\" id=\"chipsS\"><\/div>\n      <\/div>\n\n      <div class=\"field\">\n        <label for=\"Ls\">Longitud del cable soldado en cada extremo <span class=\"unit\">m<\/span><\/label>\n        <input type=\"number\" id=\"Ls\" step=\"0.05\" min=\"0\" value=\"0.2\">\n      <\/div>\n\n      <div class=\"field\">\n        <label for=\"Ss\">Secci\u00f3n del cable soldado <span class=\"unit\">mm\u00b2<\/span><\/label>\n        <input type=\"number\" id=\"Ss\" step=\"0.01\" min=\"0.01\" value=\"0.34\">\n      <\/div>\n\n      <div class=\"sec-title\">Criterio de c\u00e1lculo<\/div>\n\n      <div class=\"field\">\n        <label for=\"Pmax\">Ca\u00edda m\u00e1xima admisible <span class=\"unit\">%<\/span><\/label>\n        <input type=\"number\" id=\"Pmax\" step=\"0.5\" min=\"0.1\" value=\"3\">\n        <div class=\"chips\" id=\"chipsP\">\n          <button class=\"chip\" data-v=\"3\">3 %<\/button>\n          <button class=\"chip\" data-v=\"5\">5 %<\/button>\n          <button class=\"chip\" data-v=\"10\">10 %<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"field\">\n        <label for=\"Rho\">Resistividad del conductor <span class=\"unit\">\u03a9\u00b7mm\u00b2\/m<\/span><\/label>\n        <select id=\"Rho\">\n          <option value=\"0.0175\" selected>Cobre \u2014 0,0175<\/option>\n          <option value=\"0.0182\">Cobre a 50 \u00b0C \u2014 0,0182<\/option>\n          <option value=\"0.0286\">Aluminio \u2014 0,0286<\/option>\n        <\/select>\n      <\/div>\n\n      <\/div>\n      <div class=\"warn-inline\" id=\"warnBox\"><\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ===================== RESULTADOS ===================== -->\n  <section>\n\n    <div class=\"banner\" id=\"verdict\">\n      <div class=\"icon v-ok\" id=\"vIcon\"><\/div>\n      <div class=\"txt\"><strong id=\"vTitle\">\u2014<\/strong><span id=\"vSub\">\u2014<\/span><\/div>\n      <div class=\"rec\"><small>Manguera recomendada<\/small><b id=\"vRec\">\u2014<\/b><\/div>\n    <\/div>\n\n    <div class=\"banner slim\" id=\"recoBox\" style=\"margin-bottom:18px\">\n      <div class=\"icon v-ok\" id=\"rIcon\"><\/div>\n      <div class=\"txt\"><strong id=\"rTitle\">\u2014<\/strong><span id=\"rSub\">\u2014<\/span><\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <h2>Resultados <span class=\"h-note\" id=\"resNote\"><\/span><\/h2>\n\n      <div class=\"kpis\">\n        <div class=\"kpi\"><small>Potencia total instalada<\/small><b id=\"kP\">\u2014<span class=\"u\">W<\/span><\/b><\/div>\n        <div class=\"kpi\"><small>Corriente total por tira<\/small><b id=\"kIt\">\u2014<span class=\"u\">A<\/span><\/b><\/div>\n        <div class=\"kpi\"><small>Factor el\u00e9ctrico<\/small><b id=\"kK\">\u2014<\/b><\/div>\n        <div class=\"kpi\"><small>Ca\u00edda m\u00e1xima permitida<\/small><b id=\"kDp\">\u2014<span class=\"u\">V<\/span><\/b><\/div>\n        <div class=\"kpi\"><small>Secci\u00f3n m\u00ednima calculada<\/small><b id=\"kSm\">\u2014<span class=\"u\">mm\u00b2<\/span><\/b><\/div>\n        <div class=\"kpi hero\"><small>Secci\u00f3n comercial recomendada<\/small><b id=\"kSc\">\u2014<span class=\"u\">mm\u00b2<\/span><\/b><\/div>\n      <\/div>\n\n      <div class=\"tbl-scroll\" style=\"margin-top:16px\">\n        <table class=\"res\">\n          <thead><tr>\n            <th>Resultado por recorrido<\/th>\n            <th class=\"cA\">Extremo A<\/th>\n            <th class=\"cB colB\">Extremo B<\/th>\n            <th class=\"cH colH\">Peor caso<\/th>\n          <\/tr><\/thead>\n          <tbody id=\"resBody\"><\/tbody>\n        <\/table>\n      <\/div>\n\n      <div class=\"meter-wrap\">\n        <div class=\"meter-head\">\n          Peor ca\u00edda total <b id=\"mVal\">\u2014<\/b>\n          <span class=\"lim\" id=\"mLim\">\u2014<\/span>\n        <\/div>\n        <div class=\"meter\"><div class=\"fill\" id=\"mFill\" style=\"width:0\"><\/div><div class=\"lim-mark\" id=\"mMark\" style=\"left:0\"><\/div><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <h2>Esquema de la instalaci\u00f3n <span class=\"h-note\" id=\"schemNote\"><\/span><\/h2>\n      <svg class=\"schem\" id=\"schem\" viewBox=\"0 0 700 240\" role=\"img\" aria-label=\"Esquema de la instalaci\u00f3n\"><\/svg>\n      <div class=\"rutas\" id=\"rutas\"><\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <h2>Ca\u00edda total por secci\u00f3n comercial\n        <span class=\"h-note\" id=\"chartNote\">Peor recorrido \u00b7 barras por debajo de la l\u00ednea = v\u00e1lidas<\/span>\n      <\/h2>\n      <svg class=\"chart\" id=\"chart\" viewBox=\"0 0 700 400\" role=\"img\" aria-label=\"Gr\u00e1fica de ca\u00edda de tensi\u00f3n por secci\u00f3n\"><\/svg>\n      <div class=\"legend\">\n        <span><i style=\"background:var(--good)\"><\/i> Cumple el l\u00edmite<\/span>\n        <span><i style=\"background:var(--critical)\"><\/i> Supera el l\u00edmite<\/span>\n        <span><i class=\"dashline\"><\/i> Ca\u00edda m\u00e1xima admisible<\/span>\n        <span><i style=\"background:var(--accent)\"><\/i> Secci\u00f3n comprobada<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <h2>Comparativa de secciones comerciales <span class=\"h-note\" id=\"tblNote\"><\/span><\/h2>\n      <div class=\"tbl-scroll\">\n        <table>\n          <thead><tr id=\"tblHead\"><\/tr><\/thead>\n          <tbody id=\"tbody\"><\/tbody>\n        <\/table>\n      <\/div>\n      <p class=\"note\">\n        <b>Doble alimentaci\u00f3n:<\/b> al seleccionar \u00abDos extremos\u00bb se supone un reparto aproximado del 50 % de la\n        corriente desde cada extremo. Es una aproximaci\u00f3n adecuada cuando ambos recorridos tienen resistencias\n        parecidas. La resistencia interna de las pistas de la tira no se conoce solo con los W\/m.<br>\n        <b>RGB (4 hilos):<\/b> se asume positivo com\u00fan y retornos R\/G\/B aproximadamente equilibrados; el c\u00e1lculo usa\n        el positivo com\u00fan m\u00e1s el retorno del canal de color.<br>\n        <b>Importante:<\/b> la ca\u00edda nunca es exactamente cero. Esta herramienta dimensiona el cable para no superar\n        el porcentaje m\u00e1ximo indicado. Es orientativa: debe comprobarse adem\u00e1s la intensidad admisible, las\n        protecciones, la temperatura, el tipo de instalaci\u00f3n, la normativa aplicable y las especificaciones del\n        fabricante. El aviso de doble alimentaci\u00f3n es configurable: la longitud m\u00e1xima real depende de la\n        construcci\u00f3n y la secci\u00f3n de las pistas de cobre de cada tira.\n      <\/p>\n    <\/div>\n\n  <\/section>\n<\/div>\n<\/div>\n\n<div id=\"tip\" role=\"tooltip\"><\/div>\n<div class=\"toast\" id=\"toast\"><\/div>\n\n<dialog id=\"dlgSave\">\n  <form method=\"dialog\">\n    <div class=\"dlg-h\"><h3>Guardar proyecto<\/h3><\/div>\n    <div class=\"dlg-b\">\n      <label for=\"projInput\" style=\"display:block;font-size:13px;font-weight:600;margin-bottom:7px\">Nombre del proyecto<\/label>\n      <input type=\"text\" id=\"projInput\" placeholder=\"Ej. Cocina \u2014 bajo mueble\" maxlength=\"60\">\n    <\/div>\n    <div class=\"dlg-f\">\n      <button class=\"btn\" value=\"cancel\">Cancelar<\/button>\n      <button class=\"btn primary\" value=\"ok\" id=\"doSave\">Guardar<\/button>\n    <\/div>\n  <\/form>\n<\/dialog>\n\n<dialog id=\"dlgOpen\">\n  <div class=\"dlg-h\"><h3>Proyectos guardados<\/h3><\/div>\n  <div class=\"dlg-b\" id=\"projList\"><\/div>\n  <div class=\"dlg-f\"><button class=\"btn\" id=\"closeOpen\">Cerrar<\/button><\/div>\n<\/dialog>\n\n<script>\n\"use strict\";\n\n\/* ==================================================================\n   1. MOTOR DE C\u00c1LCULO \u2014 r\u00e9plica de la hoja v3 (F6:H21 y A25:H34)\n   ================================================================== *\/\n\nconst SECCIONES = [0.5, 0.75, 1, 1.5, 2.5, 4, 6, 10, 16, 25];\n\nconst TIPO = {\n  2: { nombre:\"Blanco\", corto:\"Blanco (2 hilos)\", conductores:2, W:10,\n       nota:\"2 hilos: positivo + negativo. Potencia t\u00edpica 10 W\/m, editable.\" },\n  4: { nombre:\"RGB\",    corto:\"RGB (4 hilos)\",    conductores:4, W:11,\n       nota:\"4 hilos: + com\u00fan, R, G y B. Potencia t\u00edpica 11 W\/m, editable.\" }\n};\n\n\/\/ Escalera de secciones comerciales (F18\/G18\/H18 del Excel)\nfunction seccionComercial(sMin){\n  if (sMin === 0) return { s:null, txt:\"Revisar latiguillo\" };\n  const hit = SECCIONES.find(x => sMin <= x);\n  if (hit === undefined) return { s:null, txt:\"> 25 mm\u00b2\" };\n  return { s:hit, txt:fmt(hit,2) + \" mm\u00b2\" };\n}\n\/\/ Manguera recomendada (F19\/G19\/H19)\nfunction manguera(sc, hilos, cfg){\n  if (sc.s === null) return sc.txt;\n  return TIPO[hilos].conductores + \" \u00d7 \" + fmt(sc.s,2) + \" mm\u00b2\" + (cfg === \"indep\" ? \" por tira\" : \"\");\n}\n\nfunction calcular(e){\n  const { V, W, L, N, DA, DB, S, Ls, Ss, rho, pmax, umbral } = e;\n  const dos = e.alim === \"dos\";\n\n  \/\/ F6  potencia total instalada\n  const pTotal = W * L * N;\n  \/\/ F7  corriente total por tira\n  const iTotalTira = (W * L) \/ V;\n  \/\/ F8\/G8  corriente por alimentaci\u00f3n de cada tira (reparto 50\/50 con dos extremos)\n  const iAlimA = iTotalTira \/ (dos ? 2 : 1);\n  const iAlimB = dos ? iAlimA : 0;\n  \/\/ F9\/G9  corriente en cada cable largo\n  const iCableA = iAlimA * (e.cfg === \"comun\" ? N : 1);\n  const iCableB = dos ? iCableA : 0;\n  \/\/ F10 factor el\u00e9ctrico seg\u00fan n\u00ba de hilos\n  const k = e.hilos === 2 ? 2 : 4 \/ 3;\n  \/\/ F11\/G11  ca\u00edda del cable soldado por extremo\n  const dSoldA = k * iAlimA * rho * Ls \/ Ss;\n  const dSoldB = dos ? dSoldA : 0;\n  \/\/ F12\/G12  ca\u00edda del cable largo con la secci\u00f3n comprobada\n  const dLargoA = k * iCableA * rho * DA \/ S;\n  const dLargoB = dos ? k * iCableB * rho * DB \/ S : 0;\n  \/\/ F13\/G13\/H13  ca\u00edda total por recorrido y peor caso\n  const dTotA = dSoldA + dLargoA;\n  const dTotB = dos ? dSoldB + dLargoB : 0;\n  const dTotH = dos ? Math.max(dTotA, dTotB) : dTotA;\n  \/\/ F14\/G14\/H14  % de ca\u00edda (fracci\u00f3n)\n  const pctA = dTotA \/ V, pctB = dos ? dTotB \/ V : 0, pctH = dTotH \/ V;\n  \/\/ F15\/G15\/H15  tensi\u00f3n estimada en el extremo\n  const vA = V - dTotA, vB = dos ? V - dTotB : 0;\n  const vH = dos ? Math.min(vA, vB) : vA;\n  \/\/ F16  ca\u00edda m\u00e1xima permitida\n  const dPerm = V * pmax \/ 100;\n  \/\/ F17\/G17\/H17  secci\u00f3n m\u00ednima calculada\n  const sMinA = dPerm <= dSoldA ? 0 : k * iCableA * rho * DA \/ (dPerm - dSoldA);\n  const sMinB = dos ? (dPerm <= dSoldB ? 0 : k * iCableB * rho * DB \/ (dPerm - dSoldB)) : 0;\n  const sMinH = Math.max(sMinA, sMinB);\n  \/\/ F18\/G18\/H18 + F19\/G19\/H19\n  const scA = seccionComercial(sMinA), scB = seccionComercial(sMinB), scH = seccionComercial(sMinH);\n  const mgA = manguera(scA, e.hilos, e.cfg);\n  const mgB = dos ? manguera(scB, e.hilos, e.cfg) : \"\u2014\";\n  const mgH = manguera(scH, e.hilos, e.cfg);\n  \/\/ F20\/G20\/H20  veredicto\n  const okA = dTotA <= dPerm;\n  const okB = dos ? dTotB <= dPerm : null;\n  const okH = dos ? (okA && okB) : okA;\n  \/\/ H21  recomendaci\u00f3n de alimentaci\u00f3n\n  let reco;\n  if (L > umbral && !dos)      reco = \"ALIMENTAR POR LOS DOS EXTREMOS\";\n  else if (L <= umbral && dos) reco = \"DOBLE ALIMENTACI\u00d3N OPCIONAL\";\n  else                          reco = \"CONFIGURACI\u00d3N ADECUADA\";\n\n  \/\/ Tabla comparativa A25:H34 (peor recorrido)\n  const tabla = SECCIONES.map(s => {\n    const cA = k * iCableA * rho * DA \/ s + dSoldA;\n    const cB = dos ? k * iCableB * rho * DB \/ s + dSoldB : 0;\n    const peor = dos ? Math.max(cA, cB) : cA;\n    return { s, cA, cB, peor, pct: peor \/ V, vMin: V - peor, ok: peor <= dPerm };\n  });\n\n  return { dos, pTotal, iTotalTira, iAlimA, iAlimB, iCableA, iCableB, k,\n           dSoldA, dSoldB, dLargoA, dLargoB, dTotA, dTotB, dTotH,\n           pctA, pctB, pctH, vA, vB, vH, dPerm,\n           sMinA, sMinB, sMinH, scA, scB, scH, mgA, mgB, mgH,\n           okA, okB, okH, reco, tabla };\n}\n\n\/* ==================================================================\n   2. FORMATO\n   ================================================================== *\/\n\nconst nf = d => new Intl.NumberFormat(\"es-ES\",{minimumFractionDigits:d,maximumFractionDigits:d});\nfunction fmt(x, d = 2){\n  if (!isFinite(x)) return \"\u2014\";\n  let s = nf(d).format(x);\n  if (s.includes(\",\")) s = s.replace(\/0+$\/, \"\").replace(\/,$\/, \"\");\n  return s;\n}\nconst fx = (x, d = 2) => isFinite(x) ? nf(d).format(x) : \"\u2014\";\n\n\/* ==================================================================\n   3. ESTADO \/ ENTRADAS\n   ================================================================== *\/\n\nconst DEFAULTS = { V:12, W:10, L:3.5, N:2, DA:20, DB:20, S:10, Ls:0.2, Ss:0.34,\n                   pmax:3, umbral:8, rho:0.0175, hilos:2, cfg:\"comun\", alim:\"uno\" };\nconst $ = id => document.getElementById(id);\nlet state = { ...DEFAULTS };\nlet currentProject = null;\nlet R = null;\n\nfunction leer(){\n  const num = (id, min, fallback) => {\n    const el = $(id);\n    const v = parseFloat(String(el.value).replace(\",\", \".\"));\n    const bad = !isFinite(v) || v < min;\n    el.classList.toggle(\"bad\", el.value !== \"\" && bad);\n    return bad ? fallback : v;\n  };\n  state.V      = num(\"V\",    0.0001, DEFAULTS.V);\n  state.W      = num(\"W\",    0,      DEFAULTS.W);\n  state.L      = num(\"L\",    0,      DEFAULTS.L);\n  state.N      = Math.max(1, Math.round(num(\"N\", 1, DEFAULTS.N)));\n  state.DA     = num(\"DA\",   0,      DEFAULTS.DA);\n  state.DB     = num(\"DB\",   0,      DEFAULTS.DB);\n  state.S      = num(\"S\",    0.0001, DEFAULTS.S);\n  state.Ls     = num(\"Ls\",   0,      DEFAULTS.Ls);\n  state.Ss     = num(\"Ss\",   0.0001, DEFAULTS.Ss);\n  state.pmax   = num(\"Pmax\", 0.0001, DEFAULTS.pmax);\n  state.umbral = num(\"U\",    0,      DEFAULTS.umbral);\n  state.rho    = parseFloat($(\"Rho\").value);\n  return state;\n}\n\nfunction pintarEntradas(){\n  $(\"V\").value = state.V;   $(\"W\").value = state.W;   $(\"L\").value = state.L;\n  $(\"N\").value = state.N;   $(\"DA\").value = state.DA; $(\"DB\").value = state.DB;\n  $(\"S\").value = state.S;   $(\"Ls\").value = state.Ls; $(\"Ss\").value = state.Ss;\n  $(\"Pmax\").value = state.pmax; $(\"U\").value = state.umbral;\n  $(\"Rho\").value = String(state.rho);\n  segSet(\"segHilos\", String(state.hilos));\n  segSet(\"segCfg\", state.cfg);\n  segSet(\"segAlim\", state.alim);\n}\nfunction segSet(id, val){\n  [...$(id).children].forEach(b => b.setAttribute(\"aria-pressed\", String(b.dataset.v === val)));\n}\n\n\/* ==================================================================\n   4. RENDER\n   ================================================================== *\/\n\nconst I_OK = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"\/><\/svg>';\nconst I_NO = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 8v5M12 17h.01\"\/><path d=\"M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z\"\/><\/svg>';\nconst I_WA = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 8v5M12 16h.01\"\/><\/svg>';\nconst I_2E = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 8 3 12l4 4M17 8l4 4-4 4M3 12h18\"\/><\/svg>';\nconst I_IN = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 16v-5M12 8h.01\"\/><\/svg>';\nconst TICK  = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"\/><\/svg>';\nconst CROSS = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"\/><\/svg>';\n\nfunction render(){\n  const e = leer();\n  const r = calcular(e);\n  R = r;\n  const dos = r.dos;\n\n  document.querySelectorAll(\".colB,.colH\").forEach(el => el.style.display = dos ? \"\" : \"none\");\n  $(\"fieldDB\").classList.toggle(\"off\", !dos);\n  $(\"DB\").disabled = !dos;\n  $(\"hiloNote\").textContent = TIPO[e.hilos].nota;\n  $(\"alimNote\").textContent = dos\n    ? \"Ambos extremos salen de la misma fuente. Se supone un reparto \u224850 % de la corriente por cada lado.\"\n    : \"Toda la corriente de cada tira entra por un solo extremo.\";\n  $(\"resNote\").textContent = dos ? \"Se dimensiona por el peor recorrido\" : \"Alimentaci\u00f3n por un extremo\";\n  $(\"chartNote\").textContent = dos\n    ? \"Peor recorrido \u00b7 barras por debajo de la l\u00ednea = v\u00e1lidas\"\n    : \"Barras por debajo de la l\u00ednea = v\u00e1lidas\";\n  $(\"tblNote\").textContent = dos ? \"Peor recorrido A\/B\" : \"\";\n\n  \/* --- veredicto --- *\/\n  const revisar = (r.sMinH === 0);\n  const ic = $(\"vIcon\");\n  if (revisar){\n    ic.className = \"icon v-wa\"; ic.innerHTML = I_WA;\n    $(\"vTitle\").textContent = \"Revisar el cable soldado\";\n    $(\"vSub\").textContent = \"El latiguillo por s\u00ed solo ya consume toda la ca\u00edda admisible (\"\n      + fx(Math.max(r.dSoldA, r.dSoldB),3) + \" V \u2265 \" + fx(r.dPerm,3)\n      + \" V). Aumenta su secci\u00f3n o acorta su longitud.\";\n  } else if (r.okH){\n    ic.className = \"icon v-ok\"; ic.innerHTML = I_OK;\n    $(\"vTitle\").textContent = \"Secci\u00f3n V\u00c1LIDA\";\n    $(\"vSub\").textContent = \"Con \" + fmt(e.S,2) + \" mm\u00b2 la peor ca\u00edda es de \" + fx(r.dTotH,3)\n      + \" V (\" + fx(r.pctH*100,2) + \" %), por debajo del l\u00edmite de \" + fx(r.dPerm,3) + \" V.\";\n  } else {\n    ic.className = \"icon v-no\"; ic.innerHTML = I_NO;\n    $(\"vTitle\").textContent = \"Secci\u00f3n INSUFICIENTE\";\n    $(\"vSub\").textContent = \"Con \" + fmt(e.S,2) + \" mm\u00b2 la peor ca\u00edda es de \" + fx(r.dTotH,3)\n      + \" V (\" + fx(r.pctH*100,2) + \" %), por encima del l\u00edmite de \" + fx(r.dPerm,3) + \" V.\";\n  }\n  $(\"vRec\").textContent = r.mgH;\n\n  \/* --- recomendaci\u00f3n de alimentaci\u00f3n --- *\/\n  const ri = $(\"rIcon\");\n  if (r.reco === \"ALIMENTAR POR LOS DOS EXTREMOS\"){\n    ri.className = \"icon v-wa\"; ri.innerHTML = I_2E;\n    $(\"rTitle\").textContent = \"Alimentar por los dos extremos\";\n    $(\"rSub\").textContent = \"La tira mide \" + fmt(e.L,2) + \" m y supera el umbral de aviso (\"\n      + fmt(e.umbral,2) + \" m). Alimentarla por ambos extremos reduce la ca\u00edda interna de la propia tira.\";\n  } else if (r.reco === \"DOBLE ALIMENTACI\u00d3N OPCIONAL\"){\n    ri.className = \"icon v-in\"; ri.innerHTML = I_IN;\n    $(\"rTitle\").textContent = \"Doble alimentaci\u00f3n opcional\";\n    $(\"rSub\").textContent = \"La tira mide \" + fmt(e.L,2) + \" m y no llega al umbral de aviso (\"\n      + fmt(e.umbral,2) + \" m). Alimentar por los dos extremos ayuda, pero no es imprescindible.\";\n  } else {\n    ri.className = \"icon v-ok\"; ri.innerHTML = I_OK;\n    $(\"rTitle\").textContent = \"Configuraci\u00f3n de alimentaci\u00f3n adecuada\";\n    $(\"rSub\").textContent = dos\n      ? \"Tira de \" + fmt(e.L,2) + \" m alimentada por los dos extremos.\"\n      : \"Tira de \" + fmt(e.L,2) + \" m alimentada por un extremo, dentro del umbral de \"\n        + fmt(e.umbral,2) + \" m.\";\n  }\n\n  \/* --- KPIs comunes --- *\/\n  const setK = (id, v, d, u) => {\n    $(id).innerHTML = (typeof v === \"string\" ? v : fx(v,d)) + (u ? '<span class=\"u\">'+u+'<\/span>' : \"\");\n  };\n  setK(\"kP\",  r.pTotal, 1, \"W\");\n  setK(\"kIt\", r.iTotalTira, 2, \"A\");\n  setK(\"kK\",  r.k === 2 ? \"2\" : \"4\/3\", 0, \"\");\n  setK(\"kDp\", r.dPerm, 3, \"V\");\n  setK(\"kSm\", r.sMinH === 0 ? \"\u2014\" : r.sMinH, 2, r.sMinH === 0 ? \"\" : \"mm\u00b2\");\n  setK(\"kSc\", r.scH.txt, 2, \"\");\n\n  \/* --- tabla de resultados por recorrido --- *\/\n  const fila = (nombre, a, b, h, cls) => {\n    const cel = v => typeof v === \"string\" ? v : fx(v.n, v.d) + (v.u ? \" \" + v.u : \"\");\n    return `<tr class=\"${cls||\"\"}\"><td>${nombre}<\/td>\n      <td>${cel(a)}<\/td>\n      <td class=\"colB\" ${dos?\"\":'style=\"display:none\"'}>${dos ? cel(b) : '<span class=\"dash\">\u2014<\/span>'}<\/td>\n      <td class=\"cH colH\" ${dos?\"\":'style=\"display:none\"'}>${dos ? cel(h) : '<span class=\"dash\">\u2014<\/span>'}<\/td><\/tr>`;\n  };\n  const V3 = (n,d,u) => ({n,d,u});\n  const badge = ok => `<span class=\"badge ${ok?\"b-ok\":\"b-no\"}\">${ok?TICK:CROSS}${ok?\"V\u00c1LIDA\":\"INSUFICIENTE\"}<\/span>`;\n  $(\"resBody\").innerHTML =\n      fila(\"Corriente por alimentaci\u00f3n de cada tira\", V3(r.iAlimA,2,\"A\"),  V3(r.iAlimB,2,\"A\"),  V3(r.iAlimA,2,\"A\"))\n    + fila(\"Corriente en cada cable largo\",           V3(r.iCableA,2,\"A\"), V3(r.iCableB,2,\"A\"), V3(Math.max(r.iCableA,r.iCableB),2,\"A\"))\n    + fila(\"Ca\u00edda del cable soldado\",                 V3(r.dSoldA,3,\"V\"),  V3(r.dSoldB,3,\"V\"),  V3(Math.max(r.dSoldA,r.dSoldB),3,\"V\"))\n    + fila(\"Ca\u00edda del cable largo\",                   V3(r.dLargoA,3,\"V\"), V3(r.dLargoB,3,\"V\"), V3(Math.max(r.dLargoA,r.dLargoB),3,\"V\"))\n    + fila(\"Ca\u00edda total por recorrido\",               V3(r.dTotA,3,\"V\"),   V3(r.dTotB,3,\"V\"),   V3(r.dTotH,3,\"V\"), \"hl\")\n    + fila(\"% de ca\u00edda\",                              V3(r.pctA*100,2,\"%\"),V3(r.pctB*100,2,\"%\"),V3(r.pctH*100,2,\"%\"))\n    + fila(\"Tensi\u00f3n estimada en el extremo\",          V3(r.vA,2,\"V\"),      V3(r.vB,2,\"V\"),      V3(r.vH,2,\"V\"))\n    + fila(\"Secci\u00f3n m\u00ednima calculada\",\n        r.sMinA===0 ? \"\u2014\" : V3(r.sMinA,2,\"mm\u00b2\"),\n        r.sMinB===0 ? \"\u2014\" : V3(r.sMinB,2,\"mm\u00b2\"),\n        r.sMinH===0 ? \"\u2014\" : V3(r.sMinH,2,\"mm\u00b2\"))\n    + fila(\"Secci\u00f3n comercial recomendada\", r.scA.txt, r.scB.txt, r.scH.txt)\n    + fila(\"Manguera recomendada\",          r.mgA,     r.mgB,     r.mgH)\n    + fila(\"Veredicto de la secci\u00f3n comprobada\", badge(r.okA), dos?badge(r.okB):\"\u2014\", dos?badge(r.okH):\"\u2014\");\n\n  \/* --- medidor --- *\/\n  const ratio = r.dTotH \/ r.dPerm;\n  const scale = Math.max(1.25, Math.min(ratio * 1.15, 3));\n  $(\"mVal\").textContent = fx(r.dTotH,3) + \" V  \u00b7  \" + fx(r.pctH*100,2) + \" %\";\n  $(\"mLim\").textContent = \"l\u00edmite \" + fx(r.dPerm,3) + \" V (\" + fmt(e.pmax,1) + \" %)\";\n  const f = $(\"mFill\");\n  f.style.width = Math.min(100, (ratio \/ scale) * 100) + \"%\";\n  f.style.background = r.okH ? \"var(--good)\" : \"var(--critical)\";\n  $(\"mMark\").style.left = (100 \/ scale) + \"%\";\n\n  \/* --- avisos --- *\/\n  const warns = [];\n  if (r.vH <= 0) warns.push(\"La ca\u00edda calculada supera la tensi\u00f3n de alimentaci\u00f3n: revisa distancias y secciones.\");\n  if (e.S > 25)  warns.push(\"La secci\u00f3n introducida (\" + fmt(e.S,2) + \" mm\u00b2) est\u00e1 fuera de la tabla comercial habitual.\");\n  if (r.scH.s === null && !revisar)\n    warns.push(\"La secci\u00f3n m\u00ednima necesaria supera 25 mm\u00b2. Considera acercar la fuente, alimentar por los dos extremos, subir a 24 V o repartir en varios circuitos.\");\n  if (dos && Math.abs(e.DA - e.DB) > 0.5 * Math.max(e.DA, e.DB))\n    warns.push(\"Los dos recorridos son muy desiguales (\" + fmt(e.DA,1) + \" m y \" + fmt(e.DB,1)\n      + \" m). El reparto 50\/50 de corriente deja de ser una buena aproximaci\u00f3n.\");\n  const wb = $(\"warnBox\");\n  wb.classList.toggle(\"on\", warns.length > 0);\n  wb.innerHTML = warns.map(w => \"\u26a0 \" + w).join(\"<br>\");\n\n  $(\"schemNote\").textContent = (dos ? \"Dos extremos\" : \"Un extremo\") + \" \u00b7 \"\n    + (e.cfg === \"comun\" ? \"l\u00ednea com\u00fan\" : \"l\u00ednea independiente por tira\") + \" \u00b7 \" + TIPO[e.hilos].corto;\n\n  dibujarEsquema(e, r);\n  dibujarGrafica(e, r);\n  dibujarTabla(e, r);\n  marcarChips();\n  printMeta();\n}\n\n\/* ---------- tabla comparativa ---------- *\/\nfunction dibujarTabla(e, r){\n  const dos = r.dos;\n  $(\"tblHead\").innerHTML = dos\n    ? `<th>Secci\u00f3n<\/th><th class=\"cA\">Ca\u00edda A<\/th><th class=\"cB\">Ca\u00edda B<\/th><th>Peor ca\u00edda<\/th>\n       <th>% peor<\/th><th>Tensi\u00f3n m\u00ednima<\/th><th style=\"text-align:center\">Estado<\/th>`\n    : `<th>Secci\u00f3n<\/th><th>Ca\u00edda total<\/th><th>% ca\u00edda<\/th><th>Tensi\u00f3n en el extremo<\/th>\n       <th style=\"text-align:center\">Estado<\/th>`;\n  $(\"tbody\").innerHTML = r.tabla.map(row => {\n    const isSel  = Math.abs(row.s - e.S) < 1e-9;\n    const isPick = r.scH.s !== null && row.s === r.scH.s;\n    const cls = [isSel ? \"sel\" : \"\", isPick ? \"pick\" : \"\"].filter(Boolean).join(\" \");\n    const est = `<td class=\"st\"><span class=\"badge ${row.ok?\"b-ok\":\"b-no\"}\">${row.ok?TICK:CROSS}${row.ok?\"OK\":\"NO\"}<\/span><\/td>`;\n    const sec = `<td><b>${fmt(row.s,2)}<\/b> mm\u00b2${isPick ? '<span class=\"tag\">RECOMENDADA<\/span>' : \"\"}<\/td>`;\n    return `<tr class=\"${cls}\">${sec}` + (dos\n      ? `<td>${fx(row.cA,3)} V<\/td><td>${fx(row.cB,3)} V<\/td><td><b>${fx(row.peor,3)} V<\/b><\/td>\n         <td>${fx(row.pct*100,2)} %<\/td><td>${fx(row.vMin,2)} V<\/td>`\n      : `<td>${fx(row.peor,3)} V<\/td><td>${fx(row.pct*100,2)} %<\/td><td>${fx(row.vMin,2)} V<\/td>`)\n      + est + `<\/tr>`;\n  }).join(\"\");\n}\n\n\/* ---------- gr\u00e1fica ---------- *\/\nfunction dibujarGrafica(e, r){\n  const svg = $(\"chart\");\n  const W = 700, padL = 74, padR = 72, padT = 30, padB = 40;\n  const rows = r.tabla, rowH = 30, gap = 8;\n  const plotH = rows.length * rowH;\n  const H = padT + plotH + padB;\n  svg.setAttribute(\"viewBox\", `0 0 ${W} ${H}`);\n  const plotW = W - padL - padR;\n\n  const maxV = Math.max(...rows.map(d => d.peor), r.dPerm) * 1.02;\n  const x = v => padL + (maxV > 0 && isFinite(maxV) ? (v \/ maxV) * plotW : 0);\n\n  const step = niceStep(maxV, 5);\n  let g = \"\";\n  for (let t = 0; t <= maxV + 1e-9; t += step){\n    g += `<line class=\"gridline\" x1=\"${x(t).toFixed(1)}\" y1=\"${padT}\" x2=\"${x(t).toFixed(1)}\" y2=\"${padT+plotH}\"\/>`;\n    g += `<text class=\"tick\" x=\"${x(t).toFixed(1)}\" y=\"${padT+plotH+16}\" text-anchor=\"middle\">${fx(t, step<1?2:1)}<\/text>`;\n  }\n  g += `<text class=\"tick\" x=\"${padL+plotW\/2}\" y=\"${padT+plotH+33}\" text-anchor=\"middle\">${\n        r.dos ? \"Peor ca\u00edda total de tensi\u00f3n (V)\" : \"Ca\u00edda total de tensi\u00f3n (V)\"}<\/text>`;\n\n  const xl = x(r.dPerm);\n  const limVisible = isFinite(xl) && xl >= padL && xl <= padL + plotW;\n  if (limVisible){\n    g += `<line x1=\"${xl.toFixed(1)}\" y1=\"${padT-6}\" x2=\"${xl.toFixed(1)}\" y2=\"${padT+plotH+4}\"\n             stroke=\"var(--ink)\" stroke-width=\"2\" stroke-dasharray=\"5 4\"\/>`;\n    const anchor = xl > padL + plotW * 0.7 ? \"end\" : \"start\";\n    g += `<text class=\"val lim-lbl\" x=\"${(xl + (anchor===\"end\"?-7:7)).toFixed(1)}\" y=\"${padT-12}\"\n             text-anchor=\"${anchor}\" fill=\"var(--ink)\">l\u00edmite ${fx(r.dPerm,3)} V<\/text>`;\n  }\n\n  rows.forEach((d, i) => {\n    const y = padT + i * rowH + gap\/2, h = rowH - gap;\n    const w = Math.max(2, x(d.peor) - padL);\n    const sel = Math.abs(d.s - e.S) < 1e-9;\n    const col = d.ok ? \"var(--good)\" : \"var(--critical)\";\n    g += `<text class=\"cat ${sel?\"sel\":\"\"}\" x=\"${padL-12}\" y=\"${y+h\/2+4}\" text-anchor=\"end\">${fmt(d.s,2)} mm\u00b2<\/text>`;\n    g += `<path class=\"bar\" d=\"${roundedRight(padL, y, w, h, 4)}\" fill=\"${col}\" data-i=\"${i}\"\/>`;\n    if (sel) g += `<rect x=\"${padL-0.5}\" y=\"${y-2.5}\" width=\"${w+3}\" height=\"${h+5}\" rx=\"6\"\n                      fill=\"none\" stroke=\"var(--accent)\" stroke-width=\"2\"\/>`;\n    const inside = w > 62;\n    let xLbl = padL + w + 8;\n    if (!inside && limVisible && xLbl < xl + 10) xLbl = xl + 10;\n    g += `<text class=\"val ${inside?\"\":\"out\"}\" x=\"${inside ? padL + w - 8 : xLbl}\" y=\"${y+h\/2+4}\"\n             text-anchor=\"${inside?\"end\":\"start\"}\" ${inside?'fill=\"#fff\"':\"\"}>${fx(d.peor,3)} V<\/text>`;\n    g += `<rect class=\"hit\" x=\"0\" y=\"${padT+i*rowH}\" width=\"${W}\" height=\"${rowH}\" fill=\"transparent\" data-i=\"${i}\"\/>`;\n  });\n\n  g += `<line class=\"axis\" x1=\"${padL}\" y1=\"${padT}\" x2=\"${padL}\" y2=\"${padT+plotH}\"\/>`;\n  svg.innerHTML = g;\n\n  svg.querySelectorAll(\".hit\").forEach(el => {\n    el.style.cursor = \"pointer\";\n    el.addEventListener(\"mousemove\", ev => {\n      const d = rows[+el.dataset.i];\n      svg.querySelectorAll(\".bar\").forEach(b => b.classList.remove(\"hov\"));\n      const bar = svg.querySelector(`.bar[data-i=\"${el.dataset.i}\"]`);\n      if (bar) bar.classList.add(\"hov\");\n      mostrarTip(ev, `<div class=\"t-h\">${fmt(d.s,2)} mm\u00b2<\/div>`\n        + (r.dos\n            ? `<div class=\"t-r\"><span>Ca\u00edda extremo A<\/span><b>${fx(d.cA,3)} V<\/b><\/div>\n               <div class=\"t-r\"><span>Ca\u00edda extremo B<\/span><b>${fx(d.cB,3)} V<\/b><\/div>\n               <div class=\"t-r\"><span>Peor ca\u00edda<\/span><b>${fx(d.peor,3)} V<\/b><\/div>`\n            : `<div class=\"t-r\"><span>Ca\u00edda total<\/span><b>${fx(d.peor,3)} V<\/b><\/div>`)\n        + `<div class=\"t-r\"><span>% de ca\u00edda<\/span><b>${fx(d.pct*100,2)} %<\/b><\/div>\n           <div class=\"t-r\"><span>Tensi\u00f3n m\u00ednima<\/span><b>${fx(d.vMin,2)} V<\/b><\/div>\n           <div class=\"t-r\"><span>Estado<\/span><b style=\"color:${d.ok?\"var(--good)\":\"var(--critical)\"}\">${d.ok?\"OK\":\"NO\"}<\/b><\/div>`);\n    });\n    el.addEventListener(\"mouseleave\", () => {\n      ocultarTip();\n      svg.querySelectorAll(\".bar\").forEach(b => b.classList.remove(\"hov\"));\n    });\n    el.addEventListener(\"click\", () => { $(\"S\").value = rows[+el.dataset.i].s; render(); });\n  });\n}\n\nfunction roundedRight(x, y, w, h, r){\n  r = Math.min(r, w, h\/2);\n  return `M${x},${y} H${x+w-r} A${r},${r} 0 0 1 ${x+w},${y+r} V${y+h-r} A${r},${r} 0 0 1 ${x+w-r},${y+h} H${x} Z`;\n}\nfunction niceStep(max, target){\n  if (!isFinite(max) || max <= 0) return 1;\n  const raw = max \/ target;\n  const mag = Math.pow(10, Math.floor(Math.log10(raw)));\n  const n = raw \/ mag;\n  return (n <= 1 ? 1 : n <= 2 ? 2 : n <= 5 ? 5 : 10) * mag;\n}\n\n\/* ---------- esquema ---------- *\/\nfunction dibujarEsquema(e, r){\n  const svg = $(\"schem\");\n  const dos = r.dos;\n  const W = 700;\n  const nShow = Math.min(e.N, 4), extra = e.N - nShow;\n\n  const xF = 14, wF = 98, hF = 58, yF = 30;\n  const yBus = yF + hF\/2;\n  const xOut = xF + wF;\n  const xNodeA = 196;\n  const xStrip = 276;\n  const wStrip = dos ? 262 : 384;\n  const xEnd   = xStrip + wStrip;\n  const xNodeB = xEnd + 66;\n  const yTop = 92, rowH = 46, hStrip = 28;\n  const stripY = i => yTop + i * rowH;\n  const yExtra = extra > 0 ? 34 : 0;\n  const H = stripY(nShow - 1) + hStrip + yExtra + (dos ? 34 : 16);\n  const yBot = H - 10;\n  svg.setAttribute(\"viewBox\", `0 0 ${W} ${H}`);\n\n  const colA = r.okA ? \"var(--good)\" : \"var(--critical)\";\n  const colB = !dos ? colA : (r.okB ? \"var(--good)\" : \"var(--critical)\");\n  let g = \"\";\n\n  \/\/ fuente\n  g += `<rect x=\"${xF}\" y=\"${yF}\" width=\"${wF}\" height=\"${hF}\" rx=\"10\" fill=\"var(--surface-2)\" stroke=\"var(--border)\"\/>`;\n  g += `<text class=\"lbl-strong\" x=\"${xF+wF\/2}\" y=\"${yF+23}\" text-anchor=\"middle\">Fuente<\/text>`;\n  g += `<text x=\"${xF+wF\/2}\" y=\"${yF+42}\" text-anchor=\"middle\" font-size=\"16\" font-weight=\"700\" fill=\"var(--accent)\">${fx(e.V,1)} V<\/text>`;\n  g += `<text class=\"lbl-mut\" x=\"${xF}\" y=\"${yF-9}\">${fx(r.pTotal,0)} W \u00b7 ${fx(r.iTotalTira*e.N,2)} A en total<\/text>`;\n\n  const yLast = stripY(nShow-1) + hStrip\/2;\n\n  \/\/ ---- recorrido A (izquierda) ----\n  g += `<path d=\"M${xOut},${yBus} H${xNodeA}\" stroke=\"${colA}\" stroke-width=\"5\" fill=\"none\" stroke-linecap=\"round\"\/>`;\n  g += `<text class=\"lbl-strong\" x=\"${(xOut+xNodeA)\/2}\" y=\"${yBus-11}\" text-anchor=\"middle\" fill=\"var(--accent)\">A<\/text>`;\n  g += `<path d=\"M${xNodeA},${yBus} V${yLast}\" stroke=\"var(--ink-2)\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\"\/>`;\n  g += `<circle cx=\"${xNodeA}\" cy=\"${yBus}\" r=\"5\" fill=\"var(--surface)\" stroke=\"var(--ink-2)\" stroke-width=\"2\"\/>`;\n\n  \/\/ ---- recorrido B (rodea por abajo hasta la derecha) ----\n  if (dos){\n    const xDrop = xOut;   \/\/ B sale del mismo borne que A\n    g += `<path d=\"M${xDrop},${yBus} V${yBot} H${xNodeB} V${stripY(0)+hStrip\/2}\"\n             stroke=\"${colB}\" stroke-width=\"5\" fill=\"none\" stroke-linejoin=\"round\" stroke-linecap=\"round\"\/>`;\n    g += `<path d=\"M${xNodeB},${stripY(0)+hStrip\/2} V${yLast}\" stroke=\"var(--ink-2)\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\"\/>`;\n    g += `<text class=\"lbl-strong\" x=\"${(xDrop+xNodeB)\/2}\" y=\"${yBot-8}\" text-anchor=\"middle\" fill=\"var(--extB)\">B<\/text>`;\n  }\n\n  \/\/ ---- tiras ----\n  for (let i = 0; i < nShow; i++){\n    const y = stripY(i), yc = y + hStrip\/2;\n    \/\/ latiguillos\n    g += `<path d=\"M${xNodeA},${yc} H${xStrip}\" stroke=\"var(--warning)\" stroke-width=\"4\" fill=\"none\" stroke-linecap=\"round\"\/>`;\n    if (dos) g += `<path d=\"M${xEnd},${yc} H${xNodeB}\" stroke=\"var(--warning)\" stroke-width=\"4\" fill=\"none\" stroke-linecap=\"round\"\/>`;\n\n    const mal = (dos ? !r.okH : !r.okA) || r.vH <= 0;\n    const col = mal ? \"var(--critical)\" : \"var(--good)\";\n    g += `<rect x=\"${xStrip}\" y=\"${y}\" width=\"${wStrip}\" height=\"${hStrip}\" rx=\"7\"\n             fill=\"var(--surface-2)\" stroke=\"${col}\" stroke-width=\"1.6\"\/>`;\n    const nLed = dos ? 6 : 9;\n    const x0 = xStrip + 54, x1 = xEnd - (dos ? 54 : 16);\n    for (let kk = 0; kk < nLed; kk++){\n      const cx = x0 + kk * ((x1 - x0) \/ (nLed - 1));\n      g += `<rect x=\"${cx-4}\" y=\"${yc-4}\" width=\"8\" height=\"8\" rx=\"2\" fill=\"${col}\" opacity=\"${mal?0.45:0.85}\"\/>`;\n    }\n    \/\/ tensi\u00f3n en cada extremo alimentado\n    g += `<text x=\"${xStrip+7}\" y=\"${yc+4}\" font-size=\"11\" font-weight=\"700\" fill=\"var(--accent)\">${fx(r.vA,2)}<\/text>`;\n    if (dos) g += `<text x=\"${xEnd-7}\" y=\"${yc+4}\" text-anchor=\"end\" font-size=\"11\" font-weight=\"700\" fill=\"var(--extB)\">${fx(r.vB,2)}<\/text>`;\n    g += `<text class=\"lbl-mut\" x=\"${xStrip}\" y=\"${y-5}\">Tira ${i+1} \u00b7 ${fmt(e.L,2)} m \u00b7 ${fmt(e.W,1)} W\/m<\/text>`;\n  }\n  if (extra > 0)\n    g += `<text class=\"lbl-mut\" x=\"${xStrip}\" y=\"${stripY(nShow)+12}\">+ ${extra} tira${extra>1?\"s\":\"\"} m\u00e1s igual${extra>1?\"es\":\"\"}<\/text>`;\n\n  svg.innerHTML = g;\n\n  \/\/ fichas de recorrido bajo el esquema\n  const ruta = (cls, tit, txt) => `<div class=\"ruta ${cls}\"><b>${tit}<\/b><span>${txt}<\/span><\/div>`;\n  let html = ruta(\"a\", \"Recorrido A\",\n    `${fmt(e.DA,2)} m \u00b7 ${fmt(e.S,2)} mm\u00b2 \u00b7 ${fx(r.iCableA,2)} A \u2192 \u2212${fx(r.dLargoA,3)} V`);\n  if (dos) html += ruta(\"b\", \"Recorrido B\",\n    `${fmt(e.DB,2)} m \u00b7 ${fmt(e.S,2)} mm\u00b2 \u00b7 ${fx(r.iCableB,2)} A \u2192 \u2212${fx(r.dLargoB,3)} V`);\n  html += ruta(\"l\", dos ? \"Latiguillo en cada extremo\" : \"Cable soldado\",\n    `${fmt(e.Ls,2)} m \u00b7 ${fmt(e.Ss,2)} mm\u00b2 \u2192 \u2212${fx(r.dSoldA,3)} V`);\n  $(\"rutas\").innerHTML = html;\n}\n\n\/* ---------- tooltip ---------- *\/\nconst tip = $(\"tip\");\nfunction mostrarTip(ev, html){\n  tip.innerHTML = html; tip.classList.add(\"on\");\n  const b = tip.getBoundingClientRect();\n  let x = ev.clientX + 16, y = ev.clientY + 16;\n  if (x + b.width > innerWidth - 10) x = ev.clientX - b.width - 16;\n  if (y + b.height > innerHeight - 10) y = innerHeight - b.height - 10;\n  tip.style.left = Math.max(8,x) + \"px\"; tip.style.top = Math.max(8,y) + \"px\";\n}\nfunction ocultarTip(){ tip.classList.remove(\"on\"); }\n\n\/* ==================================================================\n   5. PROYECTOS + PDF + TEMA\n   ================================================================== *\/\n\nconst KEY = \"calc_led_cable_proyectos_v1\";\nconst leerProys = () => { try { return JSON.parse(localStorage.getItem(KEY)) || {}; } catch { return {}; } };\nconst guardarProys = p => localStorage.setItem(KEY, JSON.stringify(p));\n\n\/\/ Proyectos guardados con la versi\u00f3n anterior (una sola distancia \"D\", sin extremos)\nfunction migrar(d){\n  const o = { ...DEFAULTS, ...d };\n  if (d && d.D !== undefined && d.DA === undefined){ o.DA = d.D; o.DB = d.D; }\n  if (!o.alim) o.alim = \"uno\";\n  if (o.umbral === undefined) o.umbral = DEFAULTS.umbral;\n  delete o.D;\n  return o;\n}\n\nfunction toast(msg){\n  const t = $(\"toast\"); t.textContent = msg; t.classList.add(\"on\");\n  clearTimeout(t._t); t._t = setTimeout(() => t.classList.remove(\"on\"), 2200);\n}\n\n$(\"btnSave\").onclick = () => {\n  $(\"projInput\").value = currentProject || \"\";\n  $(\"dlgSave\").showModal();\n  setTimeout(() => $(\"projInput\").focus(), 40);\n};\n$(\"dlgSave\").addEventListener(\"close\", () => {\n  if ($(\"dlgSave\").returnValue !== \"ok\") return;\n  const name = $(\"projInput\").value.trim();\n  if (!name){ toast(\"Escribe un nombre para el proyecto\"); return; }\n  const p = leerProys();\n  p[name] = { ...leer(), hilos:state.hilos, cfg:state.cfg, alim:state.alim, ts:Date.now() };\n  guardarProys(p);\n  currentProject = name; $(\"projName\").textContent = \"\u00b7 \" + name;\n  toast('Proyecto \"' + name + '\" guardado');\n});\n\n$(\"btnOpen\").onclick = () => { listarProys(); $(\"dlgOpen\").showModal(); };\n$(\"closeOpen\").onclick = () => $(\"dlgOpen\").close();\n\nfunction listarProys(){\n  const p = leerProys();\n  const names = Object.keys(p).sort((a,b) => (p[b].ts||0) - (p[a].ts||0));\n  const box = $(\"projList\");\n  if (!names.length){\n    box.innerHTML = '<div class=\"empty\">Todav\u00eda no hay proyectos guardados.<br>Pulsa <b>Guardar<\/b> para crear el primero.<\/div>';\n    return;\n  }\n  box.innerHTML = names.map(n => {\n    const d = migrar(p[n]);\n    const f = p[n].ts ? new Date(p[n].ts).toLocaleDateString(\"es-ES\",{day:\"2-digit\",month:\"short\",year:\"numeric\"}) : \"\";\n    return `<div class=\"proj\">\n      <div class=\"pi\"><b>${esc(n)}<\/b><small>${fmt(d.V,1)} V \u00b7 ${fmt(d.W,1)} W\/m \u00b7 ${fmt(d.L,2)} m \u00d7 ${d.N} \u00b7 ${\n        d.alim===\"dos\" ? \"2 extremos (\"+fmt(d.DA,1)+\"\/\"+fmt(d.DB,1)+\" m)\" : \"1 extremo (\"+fmt(d.DA,1)+\" m)\"\n      } \u00b7 ${fmt(d.S,2)} mm\u00b2${f?\" \u2014 \"+f:\"\"}<\/small><\/div>\n      <button class=\"icon-btn\" data-load=\"${esc(n)}\" title=\"Cargar\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"\/><path d=\"M7 10l5 5 5-5M12 15V3\"\/><\/svg>\n      <\/button>\n      <button class=\"icon-btn danger\" data-del=\"${esc(n)}\" title=\"Borrar\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"\/><\/svg>\n      <\/button>\n    <\/div>`;\n  }).join(\"\");\n  box.querySelectorAll(\"[data-load]\").forEach(b => b.onclick = () => {\n    const n = b.dataset.load;\n    state = migrar(leerProys()[n]);\n    pintarEntradas(); render();\n    currentProject = n; $(\"projName\").textContent = \"\u00b7 \" + n;\n    $(\"dlgOpen\").close(); toast('Proyecto \"' + n + '\" cargado');\n  });\n  box.querySelectorAll(\"[data-del]\").forEach(b => b.onclick = () => {\n    const n = b.dataset.del;\n    if (!confirm('\u00bfBorrar el proyecto \"' + n + '\"?')) return;\n    const p2 = leerProys(); delete p2[n]; guardarProys(p2);\n    if (currentProject === n){ currentProject = null; $(\"projName\").textContent = \"\"; }\n    listarProys(); toast(\"Proyecto borrado\");\n  });\n}\nconst esc = s => String(s).replace(\/[&<>\"']\/g, c => ({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}[c]));\n\n$(\"btnPdf\").onclick = () => { printMeta(); window.print(); };\nfunction printMeta(){\n  const d = new Date().toLocaleDateString(\"es-ES\",{day:\"2-digit\",month:\"long\",year:\"numeric\"});\n  $(\"printMeta\").textContent = (currentProject ? \"Proyecto: \" + currentProject + \"  \u00b7  \" : \"\") + \"Informe generado el \" + d;\n}\n\n$(\"btnReset\").onclick = () => {\n  if (!confirm(\"\u00bfVolver a los valores por defecto?\")) return;\n  state = { ...DEFAULTS }; currentProject = null; $(\"projName\").textContent = \"\";\n  pintarEntradas(); render(); toast(\"Valores reiniciados\");\n};\n\nconst TKEY = \"calc_led_tema\";\nfunction aplicarTema(t){\n  if (t) document.documentElement.setAttribute(\"data-theme\", t);\n  else document.documentElement.removeAttribute(\"data-theme\");\n}\naplicarTema(localStorage.getItem(TKEY));\n$(\"btnTheme\").onclick = () => {\n  const cur = document.documentElement.getAttribute(\"data-theme\");\n  const sysDark = matchMedia(\"(prefers-color-scheme: dark)\").matches;\n  const next = cur ? (cur === \"dark\" ? \"light\" : \"dark\") : (sysDark ? \"light\" : \"dark\");\n  aplicarTema(next); localStorage.setItem(TKEY, next); render();\n};\n\n\/* ==================================================================\n   6. EVENTOS\n   ================================================================== *\/\n\n[\"V\",\"W\",\"L\",\"N\",\"DA\",\"DB\",\"S\",\"Ls\",\"Ss\",\"Pmax\",\"U\"].forEach(id => $(id).addEventListener(\"input\", render));\n$(\"Rho\").addEventListener(\"change\", render);\n\n$(\"segHilos\").addEventListener(\"click\", ev => {\n  const b = ev.target.closest(\"button\"); if (!b) return;\n  state.hilos = +b.dataset.v;\n  segSet(\"segHilos\", b.dataset.v);\n  \/\/ al cambiar de tipo se carga su potencia t\u00edpica (Blanco 10 W\/m \u00b7 RGB 11 W\/m); sigue siendo editable\n  $(\"W\").value = TIPO[state.hilos].W;\n  render();\n});\n$(\"segCfg\").addEventListener(\"click\", ev => {\n  const b = ev.target.closest(\"button\"); if (!b) return;\n  state.cfg = b.dataset.v; segSet(\"segCfg\", b.dataset.v); render();\n});\n$(\"segAlim\").addEventListener(\"click\", ev => {\n  const b = ev.target.closest(\"button\"); if (!b) return;\n  state.alim = b.dataset.v; segSet(\"segAlim\", b.dataset.v); render();\n});\n\n$(\"chipsS\").innerHTML = SECCIONES.map(s => `<button class=\"chip\" data-v=\"${s}\">${fmt(s,2)}<\/button>`).join(\"\");\nfunction bindChips(boxId, targetId){\n  $(boxId).addEventListener(\"click\", ev => {\n    const b = ev.target.closest(\".chip\"); if (!b) return;\n    $(targetId).value = b.dataset.v; render();\n  });\n}\nbindChips(\"chipsS\",\"S\"); bindChips(\"chipsV\",\"V\"); bindChips(\"chipsP\",\"Pmax\");\n\nfunction marcarChips(){\n  const mark = (boxId, targetId) => {\n    const v = parseFloat(String($(targetId).value).replace(\",\",\".\"));\n    $(boxId).querySelectorAll(\".chip\").forEach(c =>\n      c.setAttribute(\"aria-pressed\", String(Math.abs(+c.dataset.v - v) < 1e-9)));\n  };\n  mark(\"chipsS\",\"S\"); mark(\"chipsV\",\"V\"); mark(\"chipsP\",\"Pmax\");\n}\n\naddEventListener(\"keydown\", ev => {\n  if ((ev.ctrlKey || ev.metaKey) && ev.key.toLowerCase() === \"s\"){ ev.preventDefault(); $(\"btnSave\").click(); }\n  if ((ev.ctrlKey || ev.metaKey) && ev.key.toLowerCase() === \"p\"){ ev.preventDefault(); $(\"btnPdf\").click(); }\n});\n\npintarEntradas();\nrender();\n<\/script>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-53d9f03 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"53d9f03\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e583618\" data-id=\"e583618\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2941b81 elementor-widget elementor-widget-text-editor\" data-id=\"2941b81\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2>C\u00f3mo utilizar la calculadora de secci\u00f3n de cable para tira LED<\/h2><p>La secci\u00f3n adecuada del cable depende del consumo de la tira LED, la tensi\u00f3n de alimentaci\u00f3n, la longitud instalada y la distancia existente entre la fuente de alimentaci\u00f3n y la tira.<\/p><p>Para realizar el c\u00e1lculo:<\/p><ol><li><p>Selecciona la tensi\u00f3n de alimentaci\u00f3n: 12 V o 24 V.<\/p><\/li><li><p>Indica si la tira LED es blanca de dos hilos o RGB de cuatro hilos.<\/p><\/li><li><p>Introduce la potencia consumida por cada metro de tira.<\/p><\/li><li><p>Escribe la longitud de cada tira LED.<\/p><\/li><li><p>Indica el n\u00famero de tiras que se instalar\u00e1n.<\/p><\/li><li><p>Introduce la longitud y la secci\u00f3n del cable que viene soldado a la tira.<\/p><\/li><li><p>A\u00f1ade la distancia entre la fuente de alimentaci\u00f3n y el inicio de la tira.<\/p><\/li><li><p>Selecciona si la tira se alimentar\u00e1 por un extremo o por los dos extremos.<\/p><\/li><li><p>Comprueba la ca\u00edda de tensi\u00f3n y la secci\u00f3n comercial recomendada.<\/p><\/li><\/ol><p>La calculadora selecciona la secci\u00f3n comercial inmediatamente superior a la secci\u00f3n m\u00ednima calculada. Si ninguna de las secciones introducidas cumple el l\u00edmite establecido, mostrar\u00e1 un aviso de secci\u00f3n insuficiente.<\/p><h2>\u00bfQu\u00e9 resultados proporciona?<\/h2><p>La herramienta calcula autom\u00e1ticamente:<\/p><ul><li><p>La potencia total instalada.<\/p><\/li><li><p>La corriente aproximada de cada tira.<\/p><\/li><li><p>La ca\u00edda m\u00e1xima de tensi\u00f3n permitida.<\/p><\/li><li><p>La secci\u00f3n m\u00ednima calculada.<\/p><\/li><li><p>La secci\u00f3n comercial recomendada.<\/p><\/li><li><p>La ca\u00edda de tensi\u00f3n de cada recorrido.<\/p><\/li><li><p>La diferencia entre alimentar la tira por uno o por los dos extremos.<\/p><\/li><li><p>La configuraci\u00f3n de alimentaci\u00f3n m\u00e1s adecuada seg\u00fan la longitud.<\/p><\/li><\/ul><h2>Alimentaci\u00f3n por uno o por los dos extremos<\/h2><p>En una tira corta puede ser suficiente alimentar desde un solo extremo. Cuando la tira es m\u00e1s larga, alimentar los dos extremos desde la misma fuente ayuda a repartir la corriente y reduce la ca\u00edda de tensi\u00f3n dentro de la propia tira.<\/p><p>La alimentaci\u00f3n por los dos extremos no duplica la potencia. La misma fuente alimenta ambos extremos de la tira mediante dos recorridos de cable correctamente dimensionados.<\/p><p>En tiras estancas que no pueden recibir una alimentaci\u00f3n intermedia, esta configuraci\u00f3n puede resultar especialmente \u00fatil.<\/p><h2>Importante antes de realizar la instalaci\u00f3n<\/h2><p>El resultado de la calculadora es una orientaci\u00f3n t\u00e9cnica para preparar el proyecto. Antes de instalar deben comprobarse tambi\u00e9n las instrucciones del fabricante, la tensi\u00f3n real de la fuente, la temperatura, la longitud m\u00e1xima admitida, las conexiones, el sistema de sellado y las condiciones particulares de la instalaci\u00f3n.<\/p><p>En instalaciones de piscina, utiliza componentes adecuados para el entorno, conexiones correctamente protegidas y equipos instalados fuera de las zonas no permitidas.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>HERRAMIENTA PROFESIONAL GRATUITA Calculadora de secci\u00f3n de cable para tiras LED Calcula la secci\u00f3n de cable recomendada para instalar tiras LED, comprueba la ca\u00edda de tensi\u00f3n y compara la alimentaci\u00f3n por uno o por los dos extremos. Introduce la potencia, la longitud de la tira, la distancia hasta la fuente de alimentaci\u00f3n y las caracter\u00edsticas [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-7570","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>CALCULADORA SECCION CABLE TIRA LED<\/title>\n<meta name=\"description\" content=\"Calcula la secci\u00f3n de cable para tira LED de 12V y 24V seg\u00fan potencia, longitud, distancia y ca\u00edda de tensi\u00f3n. Herramienta gratuita TRYLED.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/trypool.com\/en\/calculadora-seccion-cable-tira-led\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CALCULADORA SECCION CABLE TIRA LED\" \/>\n<meta property=\"og:description\" content=\"Calcula la secci\u00f3n de cable para tira LED de 12V y 24V seg\u00fan potencia, longitud, distancia y ca\u00edda de tensi\u00f3n. Herramienta gratuita TRYLED.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/trypool.com\/en\/calculadora-seccion-cable-tira-led\/\" \/>\n<meta property=\"og:site_name\" content=\"Trypool\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-14T06:29:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/trypool.com\/wp-content\/uploads\/2023\/08\/logo.png\" \/>\n\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t<meta property=\"og:image:height\" content=\"67\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/trypool.com\\\/calculadora-seccion-cable-tira-led\\\/\",\"url\":\"https:\\\/\\\/trypool.com\\\/calculadora-seccion-cable-tira-led\\\/\",\"name\":\"CALCULADORA SECCION CABLE TIRA LED\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/trypool.com\\\/#website\"},\"datePublished\":\"2026-08-13T12:24:40+00:00\",\"dateModified\":\"2026-08-14T06:29:44+00:00\",\"description\":\"Calcula la secci\u00f3n de cable para tira LED de 12V y 24V seg\u00fan potencia, longitud, distancia y ca\u00edda de tensi\u00f3n. Herramienta gratuita TRYLED.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/trypool.com\\\/calculadora-seccion-cable-tira-led\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/trypool.com\\\/calculadora-seccion-cable-tira-led\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/trypool.com\\\/calculadora-seccion-cable-tira-led\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/trypool.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CALCULADORA TIRAS LED\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/trypool.com\\\/#website\",\"url\":\"https:\\\/\\\/trypool.com\\\/\",\"name\":\"Trypool\",\"description\":\"Trypool ofrece soluciones profesionales para piscinas, con productos de iluminaci\u00f3n, filtraci\u00f3n, tratamiento del agua, limpieza, climatizaci\u00f3n y accesorios t\u00e9cnicos pensados para constructores, instaladores, mantenedores y distribuidores.\",\"publisher\":{\"@id\":\"https:\\\/\\\/trypool.com\\\/#organization\"},\"alternateName\":\"Tienda de material para piscinas\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/trypool.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/trypool.com\\\/#organization\",\"name\":\"Trypool\",\"alternateName\":\"Tienda de material para piscinas\",\"url\":\"https:\\\/\\\/trypool.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/trypool.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/trypool.com\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/logo.png\",\"contentUrl\":\"https:\\\/\\\/trypool.com\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/logo.png\",\"width\":350,\"height\":67,\"caption\":\"Trypool\"},\"image\":{\"@id\":\"https:\\\/\\\/trypool.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CALCULADORA SECCION CABLE TIRA LED","description":"Calcula la secci\u00f3n de cable para tira LED de 12V y 24V seg\u00fan potencia, longitud, distancia y ca\u00edda de tensi\u00f3n. Herramienta gratuita TRYLED.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/trypool.com\/en\/calculadora-seccion-cable-tira-led\/","og_locale":"en_GB","og_type":"article","og_title":"CALCULADORA SECCION CABLE TIRA LED","og_description":"Calcula la secci\u00f3n de cable para tira LED de 12V y 24V seg\u00fan potencia, longitud, distancia y ca\u00edda de tensi\u00f3n. Herramienta gratuita TRYLED.","og_url":"https:\/\/trypool.com\/en\/calculadora-seccion-cable-tira-led\/","og_site_name":"Trypool","article_modified_time":"2026-08-14T06:29:44+00:00","og_image":[{"width":350,"height":67,"url":"https:\/\/trypool.com\/wp-content\/uploads\/2023\/08\/logo.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/trypool.com\/calculadora-seccion-cable-tira-led\/","url":"https:\/\/trypool.com\/calculadora-seccion-cable-tira-led\/","name":"CALCULADORA SECCION CABLE TIRA LED","isPartOf":{"@id":"https:\/\/trypool.com\/#website"},"datePublished":"2026-08-13T12:24:40+00:00","dateModified":"2026-08-14T06:29:44+00:00","description":"Calcula la secci\u00f3n de cable para tira LED de 12V y 24V seg\u00fan potencia, longitud, distancia y ca\u00edda de tensi\u00f3n. Herramienta gratuita TRYLED.","breadcrumb":{"@id":"https:\/\/trypool.com\/calculadora-seccion-cable-tira-led\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/trypool.com\/calculadora-seccion-cable-tira-led\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/trypool.com\/calculadora-seccion-cable-tira-led\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/trypool.com\/"},{"@type":"ListItem","position":2,"name":"CALCULADORA TIRAS LED"}]},{"@type":"WebSite","@id":"https:\/\/trypool.com\/#website","url":"https:\/\/trypool.com\/","name":"Trypool","description":"Trypool offers professional solutions for swimming pools, including lighting, filtration, water treatment, cleaning, heating and cooling, and technical accessories designed for builders, installers, maintenance contractors and distributors.","publisher":{"@id":"https:\/\/trypool.com\/#organization"},"alternateName":"Tienda de material para piscinas","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/trypool.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/trypool.com\/#organization","name":"Trypool","alternateName":"Tienda de material para piscinas","url":"https:\/\/trypool.com\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/trypool.com\/#\/schema\/logo\/image\/","url":"https:\/\/trypool.com\/wp-content\/uploads\/2023\/08\/logo.png","contentUrl":"https:\/\/trypool.com\/wp-content\/uploads\/2023\/08\/logo.png","width":350,"height":67,"caption":"Trypool"},"image":{"@id":"https:\/\/trypool.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/trypool.com\/en\/wp-json\/wp\/v2\/pages\/7570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trypool.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/trypool.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/trypool.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trypool.com\/en\/wp-json\/wp\/v2\/comments?post=7570"}],"version-history":[{"count":14,"href":"https:\/\/trypool.com\/en\/wp-json\/wp\/v2\/pages\/7570\/revisions"}],"predecessor-version":[{"id":7591,"href":"https:\/\/trypool.com\/en\/wp-json\/wp\/v2\/pages\/7570\/revisions\/7591"}],"wp:attachment":[{"href":"https:\/\/trypool.com\/en\/wp-json\/wp\/v2\/media?parent=7570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}