{"id":5574,"date":"2016-12-03T15:44:41","date_gmt":"2016-12-03T15:44:41","guid":{"rendered":"https:\/\/test3.nigal.net\/index.php\/work\/"},"modified":"2026-03-03T07:40:51","modified_gmt":"2026-03-03T07:40:51","slug":"work","status":"publish","type":"page","link":"https:\/\/www.lugomadera.com\/index.php\/work\/","title":{"rendered":"Directorio empresarial"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"5574\" class=\"elementor elementor-5574\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5cb2a28 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5cb2a28\" data-element_type=\"section\" data-e-type=\"section\" id=\"aprovechamientos\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\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-50 elementor-top-column elementor-element elementor-element-f393b46\" data-id=\"f393b46\" 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-4945e1c elementor-widget elementor-widget-spacer\" data-id=\"4945e1c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-919ff05 elementor-widget elementor-widget-heading\" data-id=\"919ff05\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">DIRECTORIO EMPRESARIAL<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-50492f1 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"50492f1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\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<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-d22c1e2 elementor-hidden-mobile\" data-id=\"d22c1e2\" 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-cae10c9 elementor-widget elementor-widget-image\" data-id=\"cae10c9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"300\" height=\"248\" src=\"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-300x248.png\" class=\"attachment-medium size-medium wp-image-8178\" alt=\"Logotipo LugoMadera blanco recortado\" srcset=\"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-300x248.png 300w, https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-1024x848.png 1024w, https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-768x636.png 768w, https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-1536x1271.png 1536w, https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-2048x1695.png 2048w, https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-2000x1655.png 2000w, https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-1000x828.png 1000w, https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-1800x1490.png 1800w, https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-677x560.png 677w, https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-600x497.png 600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\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<div class=\"elementor-element elementor-element-f22e791 e-flex e-con-boxed e-con e-parent\" data-id=\"f22e791\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2f33cf6 elementor-widget elementor-widget-html\" data-id=\"2f33cf6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\"\/>\r\n\r\n<div id=\"lm-wrapper\">\r\n  <!-- ===== ASOCIADOS (COMPACT DESKTOP) ===== -->\r\n  <div class=\"lm-toolbar\">\r\n    <input type=\"search\" id=\"lmSearch\" class=\"lm-input\" placeholder=\"Buscar por nombre, direcci\u00f3n, actividad, ciudad, email o tel\u00e9fono\u2026\" aria-label=\"Buscar\" autocomplete=\"off\" \/>\r\n\r\n    <!-- Fila con 2 columnas: Filtros + Mapa -->\r\n    <div class=\"lm-row-filters-map\">\r\n      <!-- Columna izquierda: Filtros -->\r\n      <div class=\"lm-col-filters\">\r\n        <!-- Acorde\u00f3n filtros -->\r\n        <details class=\"lm-accordion\">\r\n      <summary class=\"lm-accordion__summary\" aria-controls=\"lmFilters\">\r\n        <div class=\"lm-accordion__title\">\r\n          <span class=\"lm-accordion__chev\" aria-hidden=\"true\">\u25be<\/span>\r\n          <span>Filtros<\/span>\r\n        <\/div>\r\n        <div class=\"lm-accordion__meta\">\r\n          <span id=\"lmCount\">0 resultados<\/span>\r\n          <button id=\"lmClearAll\" class=\"lm-btn lm-btn--ghost\" type=\"button\" title=\"Limpiar filtros\">Limpiar<\/button>\r\n        <\/div>\r\n      <\/summary>\r\n\r\n      <div id=\"lmFilters\" class=\"lm-filters\">\r\n        <!-- Actividad -->\r\n        <section class=\"lm-filter\" aria-labelledby=\"lblAct\">\r\n          <header class=\"lm-filter__header\">\r\n            <h4 id=\"lblAct\" class=\"lm-filter__title\">Actividad<\/h4>\r\n            <button id=\"lmClearAct\" class=\"lm-chip lm-chip--clear\" type=\"button\" title=\"Limpiar\">Limpiar<\/button>\r\n          <\/header>\r\n          <div id=\"lmActList\" class=\"lm-checklist\" role=\"group\" aria-label=\"Filtrar por actividad\"><\/div>\r\n          <div id=\"lmActBadges\" class=\"lm-badges\" aria-live=\"polite\"><\/div>\r\n        <\/section>\r\n\r\n        <!-- Ciudad -->\r\n        <section class=\"lm-filter\" aria-labelledby=\"lblCiu\">\r\n          <header class=\"lm-filter__header\">\r\n            <h4 id=\"lblCiu\" class=\"lm-filter__title\">Ayuntamiento<\/h4>\r\n            <button id=\"lmClearCity\" class=\"lm-chip lm-chip--clear\" type=\"button\" title=\"Limpiar\">Limpiar<\/button>\r\n          <\/header>\r\n          <div id=\"lmCityList\" class=\"lm-checklist\" role=\"group\" aria-label=\"Filtrar por ciudad\"><\/div>\r\n          <div id=\"lmCityBadges\" class=\"lm-badges\" aria-live=\"polite\"><\/div>\r\n        <\/section>\r\n\r\n        <!-- Opciones -->\r\n        <section class=\"lm-filter lm-filter--options\" aria-labelledby=\"lblOpt\">\r\n          <header class=\"lm-filter__header\">\r\n            <h4 id=\"lblOpt\" class=\"lm-filter__title\">Opciones<\/h4>\r\n          <\/header>\r\n          <label class=\"lm-selectwrap\">\r\n            <span class=\"lm-selectwrap__label\">Ordenar por<\/span>\r\n            <select id=\"lmSort\" aria-label=\"Ordenar por\">\r\n              <option value=\"actividad,nombre\">Actividad \u2192 Nombre<\/option>\r\n              <option value=\"nombre\" selected>Nombre<\/option>\r\n            <\/select>\r\n          <\/label>\r\n          <div class=\"lm-actions\">\r\n            <button id=\"lmExport\" class=\"lm-btn lm-btn--primary\" type=\"button\">Descargar Excel<\/button>\r\n          <\/div>\r\n        <\/section>\r\n      <\/div>\r\n    <\/details>\r\n      <\/div>\r\n\r\n      <!-- Columna derecha: Mapa -->\r\n      <div class=\"lm-col-map\">\r\n        <div id=\"map\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- Encabezado + Grid -->\r\n  <div class=\"container\">\r\n    <div id=\"lmState\" class=\"lm-state\" aria-live=\"polite\" hidden>\r\n      <div class=\"lm-skeleton\">\r\n        <div class=\"lm-skel-card\"><\/div>\r\n        <div class=\"lm-skel-card\"><\/div>\r\n        <div class=\"lm-skel-card\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div id=\"lmGrid\" class=\"lm-grid\" aria-live=\"polite\"><\/div>\r\n\r\n    <div id=\"lmEmpty\" class=\"lm-empty\" hidden>\r\n      <p>No hay resultados con los filtros actuales.<\/p>\r\n      <button id=\"lmEmptyReset\" class=\"lm-btn lm-btn--ghost\" type=\"button\">Quitar filtros<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- Modal -->\r\n  <div id=\"lmModal\" class=\"lm-modal\" aria-hidden=\"true\" role=\"dialog\" aria-labelledby=\"lmModalTitle\" aria-modal=\"true\">\r\n    <div class=\"lm-modal__backdrop\" data-close-modal><\/div>\r\n    <div class=\"lm-modal__dialog\" role=\"document\">\r\n      <button class=\"lm-modal__close\" type=\"button\" title=\"Cerrar\" aria-label=\"Cerrar\" data-close-modal>&times;<\/button>\r\n      <div id=\"lmModalContent\"><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n  \/* ===== scope TOTAL ===== *\/\r\n  #lm-wrapper {\r\n    --lm-primary: #E47C37;\r\n    --lm-primary-dark: #c76424;\r\n    --lm-primary-light: #fff5ed;\r\n    --lm-text: #1f2937;\r\n    --lm-secondary: #6b7280;\r\n    --lm-border: #e5e7eb;\r\n    --lm-bg: #fff;\r\n    --lm-surface: #f9fafb;\r\n    --lm-muted: #9ca3af;\r\n    --lm-chip-bg: #f3f4f6;\r\n    --lm-chip-br: #e5e7eb;\r\n    --lm-radius: 12px;\r\n    --lm-shadow-sm: 0 1px 2px 0 rgba(0,0,0,.05);\r\n    --lm-shadow-md: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -1px rgba(0,0,0,.06);\r\n    --lm-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,.05);\r\n    --lm-shadow-xl: 0 20px 25px -5px rgba(0,0,0,.1), 0 10px 10px -5px rgba(0,0,0,.04);\r\n    --lm-font-text: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\r\n    --lm-font-head: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\r\n    --lm-fw-head: 700;\r\n    position: relative;\r\n  }\r\n\r\n  #lm-wrapper .lm-toolbar,\r\n  #lm-wrapper .lm-grid,\r\n  #lm-wrapper .lm-modal__dialog,\r\n  #lm-wrapper .lm-card {\r\n    font-family: var(--lm-font-text);\r\n    color: var(--lm-text);\r\n    font-size: 16px !important;\r\n  }\r\n\r\n  #lm-wrapper .lm-h {\r\n    font-family: var(--lm-font-head);\r\n    font-weight: var(--lm-fw-head);\r\n    margin: 8px 0 24px;\r\n    color: var(--lm-text);\r\n    font-size: 32px !important;\r\n  }\r\n\r\n  \/* Entrada b\u00fasqueda *\/\r\n  #lm-wrapper .lm-input {\r\n    padding: 14px 16px;\r\n    width: 100%;\r\n    font-size: 17px !important;\r\n    background: var(--lm-bg);\r\n    color: var(--lm-text);\r\n    border: 2px solid var(--lm-border);\r\n    border-radius: var(--lm-radius);\r\n    box-shadow: none;\r\n    margin-bottom: 16px;\r\n    transition: all .2s ease;\r\n  }\r\n  #lm-wrapper .lm-input:hover {\r\n    border-color: color-mix(in srgb, var(--lm-primary) 30%, var(--lm-border));\r\n  }\r\n  #lm-wrapper .lm-input:focus {\r\n    outline: none;\r\n    border-color: var(--lm-primary);\r\n    box-shadow: 0 0 0 3px color-mix(in srgb, var(--lm-primary) 15%, transparent), var(--lm-shadow-sm);\r\n  }\r\n\r\n  \/* Acorde\u00f3n *\/\r\n  #lm-wrapper .lm-accordion {\r\n    border: 2px solid var(--lm-border);\r\n    border-radius: var(--lm-radius);\r\n    background: var(--lm-bg);\r\n    overflow: hidden;\r\n    box-shadow: none;\r\n    transition: box-shadow .2s ease;\r\n    margin-bottom: 24px;\r\n  }\r\n  #lm-wrapper .lm-accordion:hover {\r\n    box-shadow: var(--lm-shadow-md);\r\n  }\r\n  #lm-wrapper .lm-accordion__summary {\r\n    list-style: none;\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    gap: 16px;\r\n    padding: 16px 18px;\r\n    cursor: pointer;\r\n    font-weight: 600;\r\n    font-size: 18px !important;\r\n    color: var(--lm-text);\r\n    background: var(--lm-bg);\r\n    border-bottom: 2px solid var(--lm-border);\r\n    transition: background .2s ease;\r\n  }\r\n  #lm-wrapper .lm-accordion__summary:hover {\r\n    background: var(--lm-surface);\r\n  }\r\n  #lm-wrapper .lm-accordion__summary::-webkit-details-marker {\r\n    display: none;\r\n  }\r\n  #lm-wrapper .lm-accordion__title {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n  }\r\n  #lm-wrapper .lm-accordion__chev {\r\n    display: inline-block;\r\n    transform: rotate(-90deg);\r\n    transition: transform .25s ease;\r\n    color: var(--lm-primary);\r\n    font-size: 20px !important;\r\n  }\r\n  #lm-wrapper .lm-accordion[open] .lm-accordion__chev {\r\n    transform: rotate(0deg);\r\n  }\r\n  #lm-wrapper .lm-accordion__meta {\r\n    display: flex;\r\n    gap: 14px;\r\n    align-items: center;\r\n    font-size: 16px !important;\r\n  }\r\n  #lm-wrapper #lmCount {\r\n    color: var(--lm-secondary);\r\n    font-weight: 500;\r\n  }\r\n\r\n  \/* Panel filtros *\/\r\n  #lm-wrapper .lm-filters {\r\n    display: grid;\r\n    gap: 16px;\r\n    padding: 20px;\r\n    grid-template-columns: 1fr;\r\n    background: var(--lm-surface);\r\n  }\r\n  #lm-wrapper .lm-filter {\r\n    background: var(--lm-bg);\r\n    border: 1px solid var(--lm-border);\r\n    border-radius: 12px;\r\n    padding: 16px;\r\n    box-shadow: none;\r\n    transition: box-shadow .2s ease;\r\n  }\r\n  #lm-wrapper .lm-filter:hover {\r\n    box-shadow: var(--lm-shadow-md);\r\n  }\r\n  #lm-wrapper .lm-filter__header {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    margin-bottom: 12px;\r\n    padding-bottom: 10px;\r\n    border-bottom: 1px solid var(--lm-surface);\r\n  }\r\n  #lm-wrapper .lm-filter__title {\r\n    margin: 0;\r\n    font-weight: 700;\r\n    color: var(--lm-text);\r\n    font-size: 18px !important;\r\n    letter-spacing: -.01em;\r\n  }\r\n\r\n  \/* Opciones *\/\r\n  #lm-wrapper .lm-filter--options {\r\n    max-width: 360px;\r\n    background: linear-gradient(135deg, var(--lm-bg) 0%, var(--lm-surface) 100%);\r\n    border: 2px solid var(--lm-border);\r\n    border-radius: 16px;\r\n    padding: 20px;\r\n    box-shadow: var(--lm-shadow-lg);\r\n    transition: all .3s ease;\r\n  }\r\n\r\n  #lm-wrapper .lm-selectwrap {\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 8px;\r\n    margin-bottom: 12px;\r\n  }\r\n  #lm-wrapper .lm-selectwrap__label {\r\n    font-size: 15px !important;\r\n    font-weight: 600;\r\n    color: var(--lm-secondary);\r\n  }\r\n  #lm-wrapper .lm-selectwrap select {\r\n    padding: 14px 16px;\r\n    border: 2px solid var(--lm-border);\r\n    border-radius: 12px;\r\n    background: var(--lm-bg);\r\n    font-size: 16px !important;\r\n    cursor: pointer;\r\n    transition: all .2s ease;\r\n    box-shadow: none;\r\n    position: relative;\r\n  }\r\n\r\n  #lm-wrapper .lm-actions {\r\n    display: flex;\r\n    gap: 12px;\r\n    margin-top: 16px;\r\n    justify-content: center;\r\n  }\r\n  #lm-wrapper .lm-actions .lm-btn--primary {\r\n    background: linear-gradient(135deg, var(--lm-primary) 0%, var(--lm-primary-dark) 100%);\r\n    border: 2px solid var(--lm-primary);\r\n    font-weight: 700;\r\n    letter-spacing: 0.5px;\r\n    text-transform: uppercase;\r\n    font-size: 15px !important;\r\n    padding: 12px 20px;\r\n    min-width: 160px;\r\n    transition: all .3s ease;\r\n  }\r\n\r\n  \/* Checklist *\/\r\n  #lm-wrapper .lm-checklist {\r\n    display: grid;\r\n    gap: 4px;\r\n    grid-template-columns: 1fr;\r\n    max-height: 300px;\r\n    overflow-y: auto;\r\n    overflow-x: hidden;\r\n    padding-right: 8px;\r\n  }\r\n  #lm-wrapper .lm-checklist::-webkit-scrollbar { width: 8px; }\r\n  #lm-wrapper .lm-checklist::-webkit-scrollbar-track { background: var(--lm-surface); border-radius: 4px; }\r\n  #lm-wrapper .lm-checklist::-webkit-scrollbar-thumb { background: var(--lm-chip-br); border-radius: 4px; }\r\n\r\n  #lm-wrapper .lm-check {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 10px;\r\n    padding: 8px 10px;\r\n    border-radius: 8px;\r\n    cursor: pointer;\r\n    transition: background .15s ease;\r\n    outline: none;\r\n  }\r\n  #lm-wrapper .lm-check:hover { background: var(--lm-surface); }\r\n  #lm-wrapper .lm-check:focus { outline: none; }\r\n  #lm-wrapper .lm-check input {\r\n    width: 18px;\r\n    height: 18px;\r\n    cursor: pointer;\r\n    accent-color: var(--lm-primary);\r\n  }\r\n  #lm-wrapper .lm-check__icon {\r\n    flex-shrink: 0;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    width: 24px;\r\n    height: 24px;\r\n  }\r\n  #lm-wrapper .lm-check__icon img {\r\n    width: 20px;\r\n    height: auto;\r\n    object-fit: contain;\r\n    outline: none;\r\n    border: none;\r\n    box-shadow: none;\r\n  }\r\n  #lm-wrapper .lm-check__label {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    width: 100%;\r\n    gap: 12px;\r\n    font-size: 16px !important;\r\n    line-height: 1.4;\r\n  }\r\n  #lm-wrapper .lm-check__count {\r\n    color: var(--lm-muted);\r\n    font-size: 14px !important;\r\n    font-weight: 600;\r\n    background: var(--lm-surface);\r\n    padding: 2px 8px;\r\n    border-radius: 12px;\r\n  }\r\n\r\n  \/* Chips *\/\r\n  #lm-wrapper .lm-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }\r\n  #lm-wrapper .lm-chip {\r\n    font-size: 15px !important;\r\n    padding: 7px 12px;\r\n    border-radius: 999px;\r\n    background: var(--lm-primary-light);\r\n    border: 1px solid color-mix(in srgb, var(--lm-primary) 20%, transparent);\r\n    color: var(--lm-primary-dark);\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n    font-weight: 500;\r\n    transition: all .15s ease;\r\n  }\r\n  #lm-wrapper .lm-chip--clear {\r\n    background: var(--lm-bg);\r\n    border: 2px dashed var(--lm-border);\r\n    padding: 6px 12px;\r\n    color: var(--lm-secondary);\r\n    font-weight: 600;\r\n  }\r\n\r\n  \/* Botones *\/\r\n  #lm-wrapper .lm-btn {\r\n    padding: 10px 16px;\r\n    border-radius: 10px;\r\n    border: 2px solid var(--lm-border);\r\n    background: var(--lm-bg);\r\n    cursor: pointer;\r\n    font-weight: 600;\r\n    font-size: 16px !important;\r\n    transition: all .2s ease;\r\n    box-shadow: none;\r\n  }\r\n  #lm-wrapper .lm-btn--primary {\r\n    background: var(--lm-primary);\r\n    border-color: var(--lm-primary);\r\n    color: #fff;\r\n    box-shadow: none;\r\n  }\r\n  #lm-wrapper .lm-btn--ghost {\r\n    background: var(--lm-bg);\r\n    color: var(--lm-text);\r\n  }\r\n\r\n  \/* Grid *\/\r\n  #lm-wrapper .lm-grid {\r\n    display: grid;\r\n    gap: 16px;\r\n    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\r\n  }\r\n  #lm-wrapper .lm-card {\r\n    border: 1px solid var(--lm-border);\r\n    border-radius: 12px;\r\n    padding: 16px;\r\n    background: var(--lm-bg);\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    box-shadow: none;\r\n    transition: all .3s ease;\r\n    position: relative;\r\n    overflow: hidden;\r\n  }\r\n  #lm-wrapper .lm-card::before {\r\n    content: '';\r\n    position: absolute;\r\n    top: 0; left: 0; right: 0;\r\n    height: 3px;\r\n    background: var(--lm-primary);\r\n    transform: scaleX(0);\r\n    transition: transform .3s ease;\r\n  }\r\n  #lm-wrapper .lm-card:hover { transform: translateY(-4px); }\r\n  #lm-wrapper .lm-card:hover::before { transform: scaleX(1); }\r\n\r\n  #lm-wrapper .lm-card__img {\r\n    width: 100%;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    padding: 8px 0 12px;\r\n    min-height: 90px;\r\n  }\r\n  #lm-wrapper .lm-card__img img {\r\n    max-width: 180px;\r\n    height: 80px;\r\n    object-fit: contain;\r\n    transition: transform .3s ease;\r\n    outline: none;\r\n    border: none;\r\n    box-shadow: none;\r\n  }\r\n  #lm-wrapper .lm-card:hover .lm-card__img img { transform: scale(1.05); }\r\n\r\n  #lm-wrapper .lm-card__body {\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    width: 100%;\r\n    flex: 1 1 auto;\r\n  }\r\n\r\n  #lm-wrapper .lm-card__title {\r\n    font-weight: 700;\r\n    text-align: center;\r\n    margin: 8px 0 4px;\r\n    font-family: var(--lm-font-head);\r\n    font-size: 18px !important;\r\n    color: var(--lm-text);\r\n    line-height: 1.3;\r\n  }\r\n  #lm-wrapper .lm-card__addr {\r\n    text-align: center;\r\n    margin: 0;\r\n    min-height: 32px;\r\n    color: var(--lm-secondary);\r\n    font-size: 15px !important;\r\n    line-height: 1.4;\r\n  }\r\n  #lm-wrapper .lm-card__tags {\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: 6px;\r\n    justify-content: center;\r\n    margin-top: 10px;\r\n  }\r\n  #lm-wrapper .lm-tag {\r\n    font-size: 13px !important;\r\n    padding: 6px 10px;\r\n    border-radius: 999px;\r\n    background: var(--lm-primary-light);\r\n    border: 1px solid color-mix(in srgb, var(--lm-primary) 20%, transparent);\r\n    color: var(--lm-primary-dark);\r\n    font-weight: 600;\r\n  }\r\n\r\n  #lm-wrapper .nectar-button {\r\n    margin-top: auto; \/* siempre abajo *\/\r\n    background: var(--lm-primary) !important;\r\n    color: #fff !important;\r\n    text-decoration: none;\r\n    display: inline-block;\r\n    padding: 10px 20px;\r\n    border-radius: 999px;\r\n    transition: all .2s ease;\r\n    align-self: center;\r\n    font-weight: 600;\r\n    font-size: 15px !important;\r\n    box-shadow: none;\r\n    border: 2px solid var(--lm-primary);\r\n  }\r\n\r\n  \/* ===== MODAL ARREGLADO ===== *\/\r\n  #lm-wrapper .lm-modal {\r\n    position: fixed;\r\n    inset: 0;\r\n    display: none;\r\n    z-index: 999999;\r\n  }\r\n  #lm-wrapper .lm-modal[aria-hidden=\"false\"] {\r\n    display: block;\r\n    animation: lmFadeIn .2s ease;\r\n  }\r\n  #lm-wrapper .lm-modal__backdrop {\r\n    position: absolute;\r\n    inset: 0;\r\n    background: rgba(0,0,0,.45);\r\n    backdrop-filter: blur(2px);\r\n  }\r\n  #lm-wrapper .lm-modal__dialog {\r\n    position: fixed;\r\n    left: 50%;\r\n    width: min(94vw, 800px);\r\n    max-width: 800px;\r\n    max-height: calc(100vh - 80px);\r\n    overflow: auto;\r\n    background: var(--lm-bg);\r\n    border-radius: 16px;\r\n    padding: 0;\r\n    box-shadow: none;\r\n    z-index: 1;\r\n    animation: lmSlideUp .25s ease;\r\n    transform: translateX(-50%);\r\n  }\r\n\r\n  \/* bot\u00f3n cerrar *\/\r\n  #lm-wrapper .lm-modal__close {\r\n    position: sticky;\r\n    top: 10px;\r\n    float: right;\r\n    margin: 10px 14px 0 0;\r\n    width: 34px;\r\n    height: 34px;\r\n    border: 0;\r\n    background: #fff;\r\n    border-radius: 999px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    font-size: 22px;\r\n    color: var(--lm-text);\r\n    box-shadow: none;\r\n    cursor: pointer;\r\n  }\r\n\r\n  \/* cabecera modal NUEVA (compacta) *\/\r\n  #lm-wrapper .lm-modal__header {\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    gap: 12px;\r\n    padding: 16px 20px 12px;\r\n    border-bottom: 1px solid var(--lm-surface);\r\n  }\r\n  #lm-wrapper .lm-modal__logo {\r\n    background: none;\r\n    border: 0;\r\n    width: auto;\r\n    padding: 0;\r\n  }\r\n  #lm-wrapper .lm-modal__logo img {\r\n    height: 56px;\r\n    max-width: 200px;\r\n    object-fit: contain;\r\n    outline: none;\r\n    border: none;\r\n    box-shadow: none;\r\n  }\r\n  #lm-wrapper .lm-modal__header h3 {\r\n    margin: 0;\r\n    font-size: 22px !important;\r\n    text-align: center;\r\n  }\r\n\r\n  #lm-wrapper #lmModalContent {\r\n    padding: 0 20px 20px;\r\n  }\r\n\r\n  #lm-wrapper .lm-detail {\r\n    display: grid;\r\n    grid-template-columns: 110px 1fr;\r\n    gap: 12px;\r\n    padding: 14px 0;\r\n    border-bottom: 1px solid var(--lm-surface);\r\n  }\r\n  #lm-wrapper .lm-detail:last-of-type {\r\n    border-bottom: none;\r\n  }\r\n  #lm-wrapper .lm-detail .k {\r\n    font-weight: 600;\r\n    color: var(--lm-secondary);\r\n  }\r\n  #lm-wrapper .lm-detail .v a {\r\n    color: var(--lm-primary);\r\n    text-decoration: none;\r\n    font-weight: 600;\r\n  }\r\n\r\n  #lm-wrapper .lm-badges--modal {\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: 6px;\r\n    justify-content: center;\r\n  }\r\n  #lm-wrapper .lm-badge {\r\n    padding: 4px 10px;\r\n    background: var(--lm-primary-light);\r\n    border: 1px solid color-mix(in srgb, var(--lm-primary) 20%, transparent);\r\n    border-radius: 999px;\r\n    font-size: 12px !important;\r\n    color: var(--lm-primary-dark);\r\n  }\r\n\r\n  @keyframes lmFadeIn{\r\n    from{ opacity: 0; }\r\n    to{ opacity: 1; }\r\n  }\r\n  @keyframes lmSlideUp{\r\n    from{ opacity: 0; transform: translateX(-50%) translateY(16px); }\r\n    to{ opacity: 1; transform: translateX(-50%) translateY(0); }\r\n  }\r\n\r\n  \/* Empty \/ Skeleton *\/\r\n  #lm-wrapper .lm-empty {\r\n    text-align: center;\r\n    color: var(--lm-secondary);\r\n    margin: 40px 0;\r\n    padding: 40px 20px;\r\n  }\r\n\r\n  @media (max-width: 767px){\r\n    #lm-wrapper .lm-modal__dialog{\r\n      width: 96vw;\r\n      max-height: calc(100vh - 40px);\r\n      border-radius: 12px;\r\n    }\r\n    #lm-wrapper .lm-detail{\r\n      grid-template-columns: 95px 1fr;\r\n    }\r\n  }\r\n\r\n  @media (min-width: 992px) {\r\n    #lm-wrapper .lm-grid { grid-template-columns: repeat(5, 1fr) !important; }\r\n  }\r\n\r\n  \/* ===== LAYOUT FILTROS + MAPA ===== *\/\r\n  #lm-wrapper .lm-row-filters-map {\r\n    display: grid;\r\n    grid-template-columns: 1fr;\r\n    gap: 20px;\r\n    margin-bottom: 24px;\r\n    margin-right: 0;\r\n  }\r\n\r\n  @media (min-width: 992px) {\r\n    #lm-wrapper .lm-row-filters-map {\r\n      grid-template-columns: 380px 1fr;\r\n      padding-right: 10px;\r\n    }\r\n  }\r\n\r\n  #lm-wrapper .lm-col-filters {\r\n    display: flex;\r\n    flex-direction: column;\r\n  }\r\n\r\n  #lm-wrapper .lm-col-map {\r\n    display: flex;\r\n    align-items: flex-start;\r\n    min-height: 600px;\r\n    width: 100%;\r\n  }\r\n\r\n  \/* ===== ESTILOS DEL MAPA ===== *\/\r\n  #lm-wrapper #map {\r\n    width: 100%;\r\n    height: 600px;\r\n    border-radius: 15px;\r\n    box-shadow: none;\r\n    position: relative;\r\n    z-index: 1;\r\n    background: #f0f0f0;\r\n    border: 2px solid var(--lm-border);\r\n  }\r\n\r\n  \/* ===== SOLUCI\u00d3N EQUILIBRADA: Eliminar l\u00edneas blancas sin romper tiles ===== *\/\r\n  \/* Enfoque multi-navegador para WordPress *\/\r\n  .leaflet-tile-container {\r\n    pointer-events: none;\r\n  }\r\n\r\n  .leaflet-tile {\r\n    pointer-events: none !important;\r\n    border: 0 !important;\r\n    outline: 0 !important;\r\n    box-shadow: none !important;\r\n    display: block !important;\r\n  }\r\n\r\n  \/* Diferentes enfoques seg\u00fan el navegador *\/\r\n  @supports (-webkit-appearance: none) {\r\n    \/* Chrome, Safari, Edge *\/\r\n    .leaflet-tile {\r\n      margin: -0.5px !important;\r\n    }\r\n  }\r\n\r\n  @supports not (-webkit-appearance: none) {\r\n    \/* Firefox *\/\r\n    .leaflet-tile {\r\n      margin: -0.2px !important;\r\n    }\r\n  }\r\n\r\n  .leaflet-tile-container img {\r\n    display: block !important;\r\n    padding: 0 !important;\r\n    border: 0 !important;\r\n    outline: 0 !important;\r\n    max-width: none !important;\r\n    pointer-events: none !important;\r\n  }\r\n\r\n  \/* Asegurar que los controles y marcadores s\u00ed sean interactivos *\/\r\n  .leaflet-control,\r\n  .leaflet-marker-icon,\r\n  .leaflet-popup {\r\n    pointer-events: auto !important;\r\n  }\r\n\r\n  \/* Estilos para botones en popups del mapa *\/\r\n  .leaflet-popup-content .nectar-button {\r\n    margin-top: 5px;\r\n    margin-bottom: 5px;\r\n    padding: 5px 8px;\r\n    font-size: 11px !important;\r\n  }\r\n\r\n  .leaflet-popup-content .nectar-button:hover {\r\n    background: var(--lm-primary-dark) !important;\r\n    transform: translateY(-2px);\r\n    box-shadow: none;\r\n  }\r\n\r\n  \/* Estilos adicionales para popups de Leaflet *\/\r\n  .leaflet-popup-content-wrapper {\r\n    border-radius: 12px;\r\n    padding: 1px;\r\n  }\r\n\r\n  .leaflet-popup-content {\r\n    margin: 13px 19px;\r\n    line-height: 1.4;\r\n    letter-spacing: normal;\r\n  }\r\n\r\n  .leaflet-popup-content * {\r\n    letter-spacing: normal;\r\n  }\r\n\r\n  .leaflet-popup-content b {\r\n    display: block;\r\n    margin-bottom: 8px;\r\n  }\r\n\r\n  \/* Icono personalizado del mapa *\/\r\n  .custom-marker-icon {\r\n    background: none !important;\r\n    border: none !important;\r\n    pointer-events: auto !important;\r\n    cursor: pointer !important;\r\n    display: flex !important;\r\n    align-items: center !important;\r\n    justify-content: center !important;\r\n  }\r\n\r\n  .custom-marker-icon img {\r\n    pointer-events: none !important;\r\n    cursor: pointer !important;\r\n  }\r\n\r\n  \/* Eliminar sombra de los marcadores *\/\r\n  .leaflet-marker-icon,\r\n  .leaflet-marker-icon img {\r\n    box-shadow: none !important;\r\n    filter: none !important;\r\n    -webkit-filter: none !important;\r\n    pointer-events: auto !important;\r\n  }\r\n\r\n  .leaflet-shadow-pane {\r\n    display: none !important;\r\n  }\r\n\r\n  \/* Asegurar que la capa de marcadores reciba eventos de clic *\/\r\n  .leaflet-marker-pane {\r\n    pointer-events: auto !important;\r\n  }\r\n\r\n  \/* Asegurar que toda la estructura del marcador sea clickeable *\/\r\n  .leaflet-marker-icon {\r\n    cursor: pointer !important;\r\n  }\r\n\r\n  \/* SOLUCI\u00d3N: Deshabilitar smooth scroll de WordPress para evitar conflictos con el mapa *\/\r\n  html, body {\r\n    scroll-behavior: auto !important;\r\n  }\r\n  \r\n  \/* Evitar que el mapa cause scroll cuando recibe focus *\/\r\n  #lm-wrapper #map,\r\n  #lm-wrapper #map * {\r\n    scroll-margin: 0 !important;\r\n  }\r\n<\/style>\r\n\r\n<!-- LIBS Excel -->\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/exceljs\/dist\/exceljs.min.js\"><\/script>\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/file-saver@2.0.5\/dist\/FileSaver.min.js\"><\/script>\r\n\r\n<script>\r\n(function(){\r\n  const root = document.getElementById('lm-wrapper');\r\n  if (!root) return;\r\n\r\n  const JSON_URL    = 'https:\/\/www.lugomadera.com\/wp-content\/uploads\/asociados.json';\r\n  const IMG_FALLBACK= 'https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/cropped-cropped-lugo.png';\r\n  let   EXCEL_PRIMARY = 'FFE47C37';\r\n\r\n  const $  = sel => root.querySelector(sel);\r\n  const $$ = sel => Array.from(root.querySelectorAll(sel));\r\n\r\n  const noNull = v => (v ?? '').toString().trim();\r\n  const norm   = v => noNull(v).toLowerCase();\r\n\r\n  function titleCaseEs(str=''){\r\n    const small = new Set(['de','del','la','las','el','los','y','e','o','u','da','do','das','dos','a','en','por','para','al']);\r\n    return str.toLowerCase().split(\/(\\s+|-)\/).map((tok,i,arr)=>{\r\n      if(\/^\\s+$|-$\/.test(tok)) return tok;\r\n      const prev = arr[i-1] || '';\r\n      const isStart = i===0 || \/^\\s+$|-$\/.test(prev);\r\n      if(!isStart && small.has(tok)) return tok;\r\n      return tok.charAt(0).toUpperCase()+tok.slice(1);\r\n    }).join('');\r\n  }\r\n\r\n  const splitActivities = raw => noNull(raw).split(\/[;|,]\/).map(s=>s.trim()).filter(s=>s && s.toLowerCase()!=='null');\r\n  const normalizeActivityLabel = s => s.toUpperCase();\r\n\r\n  \/\/ Mapeo de actividades a iconos del mapa (URLs)\r\n  const activityIconURLs = {\r\n    'ASERRADERO': 'https:\/\/www.lugomadera.com\/wp-content\/uploads\/2026\/03\/aserradero3.png',\r\n    'SERVICIOS FORESTALES': 'https:\/\/www.lugomadera.com\/wp-content\/uploads\/2026\/02\/servicios_forestales2.png',\r\n    'BIOMASA': 'https:\/\/www.lugomadera.com\/wp-content\/uploads\/2026\/03\/biomasa3.png',\r\n    'REMATANTE': 'https:\/\/www.lugomadera.com\/wp-content\/uploads\/2026\/03\/rematante3.png',\r\n    'F\u00c1BRICA': 'https:\/\/www.lugomadera.com\/wp-content\/uploads\/2026\/03\/fabrica3.png',\r\n    'FABRICA': 'https:\/\/www.lugomadera.com\/wp-content\/uploads\/2026\/03\/fabrica3.png'\r\n  };\r\n  const defaultActivityIconURL = 'https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/wood.png';\r\n\r\n  \/\/ Obtener URL del icono para una actividad\r\n  function getActivityIcon(activity) {\r\n    const norm = normalizeActivityLabel(activity);\r\n    \/\/ Buscar coincidencia directa primero\r\n    if (activityIconURLs[norm]) return activityIconURLs[norm];\r\n    \/\/ Buscar coincidencia parcial (si la actividad contiene alguno de los t\u00e9rminos)\r\n    for (const [key, url] of Object.entries(activityIconURLs)) {\r\n      if (norm.includes(key)) return url;\r\n    }\r\n    return defaultActivityIconURL;\r\n  }\r\n\r\n  function cssColorToARGB(colorStr, fallback='FFE47C37'){\r\n    if(!colorStr) return fallback;\r\n    colorStr = colorStr.trim();\r\n    if(colorStr.startsWith('#')){\r\n      let hex = colorStr.slice(1);\r\n      if(hex.length===3) hex = hex.split('').map(c=>c+c).join('');\r\n      if(hex.length===6) return 'FF'+hex.toUpperCase();\r\n    }\r\n    const m = colorStr.match(\/rgba?\\(([^)]+)\\)\/i);\r\n    if(m){\r\n      const p = m[1].split(',').map(s=>s.trim());\r\n      const r = +p[0], g = +p[1], b = +p[2], a = p[3]!==undefined? Math.round(parseFloat(p[3])*255) : 255;\r\n      const h = n => ('0'+(n|0).toString(16)).slice(-2).toUpperCase();\r\n      return h(a)+h(r)+h(g)+h(b);\r\n    }\r\n    return fallback;\r\n  }\r\n\r\n  function capturePrimaryForExcel(){\r\n    const s = getComputedStyle(document.documentElement).getPropertyValue('--e-global-color-primary').trim() || '#E47C37';\r\n    EXCEL_PRIMARY = cssColorToARGB(s, 'FFE47C37');\r\n  }\r\n\r\n  function headerOffset(){\r\n    const fixed = [];\r\n    ['#wpadminbar','header','.site-header','.header-wrapper','.main-navigation','#masthead','.elementor-location-header']\r\n      .forEach(sel => document.querySelectorAll(sel).forEach(el => {\r\n        const cs = getComputedStyle(el);\r\n        const rect = el.getBoundingClientRect();\r\n        const fixedish = cs.position==='fixed' || cs.position==='sticky';\r\n        if(fixedish && Math.round(rect.top) <= 0 && rect.height>0) fixed.push(rect.height);\r\n      }));\r\n    const margin = 20, sum = fixed.reduce((a,b)=>a+b,0);\r\n    return Math.min(Math.max(sum + margin, 72), 240);\r\n  }\r\n\r\n  function positionModal(){\r\n    const modal = $('#lmModal'); if(!modal || modal.getAttribute('aria-hidden')==='true') return;\r\n    const dlg = modal.querySelector('.lm-modal__dialog'); if(!dlg) return;\r\n    requestAnimationFrame(()=>{\r\n      const top = Math.max(headerOffset(), Math.max(24, (innerHeight - dlg.getBoundingClientRect().height)\/2));\r\n      dlg.style.top = `${Math.round(top)}px`;\r\n    });\r\n  }\r\n\r\n  function equalizeHeights(){\r\n    const cards = $$('.lm-card'); if(!cards.length) return;\r\n    cards.forEach(c => c.style.minHeight = '');\r\n    requestAnimationFrame(()=>{\r\n      const maxH = Math.max(...cards.map(c => c.getBoundingClientRect().height));\r\n      cards.forEach(c => c.style.minHeight = Math.ceil(maxH)+'px');\r\n    });\r\n  }\r\n\r\n  let RAW = [];\r\n  let FILTERED = [];\r\n\r\n  function buildChecklist(container, items){\r\n    container.innerHTML = '';\r\n    items.forEach(({value, count})=>{\r\n      const id = container.id + '_' + value.replace(\/\\s+\/g,'_').replace(\/[^\\w-]\/g,'');\r\n      const iconURL = getActivityIcon(value);\r\n      const wrap = document.createElement('label');\r\n      wrap.className = 'lm-check';\r\n      wrap.innerHTML = `\r\n        <input type=\"checkbox\" id=\"${id}\" value=\"${value}\">\r\n        <span class=\"lm-check__icon\"><img decoding=\"async\" src=\"${iconURL}\" alt=\"${value}\" style=\"width:20px; height:auto;\" \/><\/span>\r\n        <span class=\"lm-check__label\"><span>${value}<\/span><span class=\"lm-check__count\">${count}<\/span><\/span>\r\n      `;\r\n      container.appendChild(wrap);\r\n    });\r\n  }\r\n  const checkedValues = c => Array.from(c.querySelectorAll('input[type=\"checkbox\"]:checked')).map(i => i.value);\r\n  const uncheckAll = c => c.querySelectorAll('input[type=\"checkbox\"]').forEach(i=> i.checked = false);\r\n\r\n  function renderChecklistBadges(container, badgesEl){\r\n    const selected = checkedValues(container);\r\n    badgesEl.innerHTML = '';\r\n    selected.forEach(val=>{\r\n      const chip = document.createElement('span');\r\n      chip.className = 'lm-chip';\r\n      chip.innerHTML = `${val} <button title=\"Quitar\" aria-label=\"Quitar ${val}\">\u00d7<\/button>`;\r\n      chip.querySelector('button').addEventListener('click', ()=>{\r\n        const input = container.querySelector(`input[value=\"${CSS?.escape ? CSS.escape(val) : val}\"]`);\r\n        if(input) input.checked = false;\r\n        applyFilters();\r\n        renderChecklistBadges(container, badgesEl);\r\n      });\r\n      badgesEl.appendChild(chip);\r\n    });\r\n  }\r\n\r\n  function renderCards(list){\r\n    const grid = $('#lmGrid');\r\n    const empty = $('#lmEmpty');\r\n    grid.innerHTML = '';\r\n\r\n    if(!list.length){\r\n      empty.hidden = false;\r\n      equalizeHeights();\r\n      return;\r\n    }\r\n    empty.hidden = true;\r\n\r\n    const frag = document.createDocumentFragment();\r\n    list.forEach((e, idx) => {\r\n      const nombre    = noNull(e.nombre);\r\n      const domicilio = noNull(e.domicilio);\r\n      const ciudad    = noNull(e.ciudadNorm);\r\n      const logo      = noNull(e.logo || e.logo_url) || IMG_FALLBACK;\r\n      const tags      = (e._acts || []).map(a => `<span class=\"lm-tag\" title=\"Actividad\">${a}<\/span>`).join('');\r\n\r\n      const card = document.createElement('div');\r\n      card.className = 'lm-card';\r\n      card.innerHTML = `\r\n        <div class=\"lm-card__img\">\r\n          <img src=\"${logo}\" alt=\"Logo de ${nombre}\" loading=\"lazy\" decoding=\"async\" onerror=\"this.src='${IMG_FALLBACK}'\" \/>\r\n        <\/div>\r\n        <div class=\"lm-card__body\">\r\n          <p class=\"lm-card__title\">${nombre}<\/p>\r\n          <p class=\"lm-card__addr\">${domicilio || ciudad || ''}<\/p>\r\n          ${tags ? `<div class=\"lm-card__tags\" aria-label=\"Actividades\">${tags}<\/div>` : ''}\r\n        <\/div>\r\n        <a href=\"javascript:void(0)\" class=\"nectar-button\" data-idx=\"${idx}\"><span>VER FICHA<\/span><\/a>\r\n      `;\r\n      card.querySelector('.nectar-button').addEventListener('click', () => openModal(e, card.querySelector('.nectar-button')));\r\n      frag.appendChild(card);\r\n    });\r\n    grid.appendChild(frag);\r\n    equalizeHeights();\r\n  }\r\n\r\n  let lastFocus = null;\r\n  function openModal(entry, triggerEl){\r\n    lastFocus = triggerEl || document.activeElement;\r\n\r\n    const nombre    = noNull(entry.nombre);\r\n    const domicilio = noNull(entry.domicilio);\r\n    const ciudad    = noNull(entry.ciudadNorm);\r\n    const correo    = noNull(entry.correo);\r\n    const telefono  = noNull(entry.telefono);\r\n    const web       = noNull(entry.web || entry.url || '');\r\n    const como_llegar = noNull(entry.como_llegar || '');\r\n    const logo      = noNull(entry.logo || entry.logo_url) || IMG_FALLBACK;\r\n\r\n    const details = [];\r\n    if (domicilio) details.push(`<div class=\"lm-detail\"><div class=\"k\">Direcci\u00f3n<\/div><div class=\"v\">${domicilio}<\/div><\/div>`);\r\n    if (ciudad)    details.push(`<div class=\"lm-detail\"><div class=\"k\">Ciudad<\/div><div class=\"v\">${ciudad}<\/div><\/div>`);\r\n    if (correo)    details.push(`<div class=\"lm-detail\"><div class=\"k\">Correo<\/div><div class=\"v\"><a href=\"mailto:${correo}\">${correo}<\/a><\/div><\/div>`);\r\n    if (telefono)  details.push(`<div class=\"lm-detail\"><div class=\"k\">Tel\u00e9fono<\/div><div class=\"v\"><a href=\"tel:${telefono.replace(\/[^+\\d]\/g,'')}\">${telefono}<\/a><\/div><\/div>`);\r\n    if (web)       details.push(`<div class=\"lm-detail\"><div class=\"k\">Web<\/div><div class=\"v\"><a href=\"${web}\" target=\"_blank\" rel=\"noopener\">Abrir web<\/a><\/div><\/div>`);\r\n    if (como_llegar) details.push(`<div class=\"lm-detail\"><div class=\"k\">C\u00f3mo llegar<\/div><div class=\"v\"><a href=\"${como_llegar}\" target=\"_blank\" rel=\"noopener\">Ver ubicaci\u00f3n<\/a><\/div><\/div>`);\r\n\r\n    const actBadges = (entry._acts || []).map(a=>`<span class=\"lm-badge\">${a}<\/span>`).join('');\r\n\r\n    $('#lmModalContent').innerHTML = `\r\n      <div class=\"lm-modal__header\">\r\n        <div class=\"lm-modal__logo\"><img decoding=\"async\" src=\"${logo}\" alt=\"Logo ${nombre}\" onerror=\"this.src='${IMG_FALLBACK}'\" \/><\/div>\r\n        <h3 id=\"lmModalTitle\" class=\"lm-h\" style=\"margin:0;font-size:22px !important;\">${nombre}<\/h3>\r\n        ${actBadges ? `<div class=\"lm-badges--modal\">${actBadges}<\/div>` : ``}\r\n      <\/div>\r\n      ${details.join('')}\r\n    `;\r\n\r\n    const modal = $('#lmModal');\r\n    modal.setAttribute('aria-hidden','false');\r\n    positionModal();\r\n\r\n    const focusables = modal.querySelectorAll('a,button,[tabindex=\"0\"]');\r\n    const first = focusables[0], last = focusables[focusables.length-1];\r\n    first?.focus();\r\n    modal.onkeydown = (e)=>{\r\n      if(e.key === 'Escape'){ closeModal(); }\r\n      if(e.key === 'Tab' && focusables.length){\r\n        if(e.shiftKey && document.activeElement === first){ e.preventDefault(); last.focus(); }\r\n        else if(!e.shiftKey && document.activeElement === last){ e.preventDefault(); first.focus(); }\r\n      }\r\n    };\r\n    modal.querySelectorAll('[data-close-modal]').forEach(el=> el.onclick = closeModal);\r\n  }\r\n\r\n  function closeModal(){\r\n    const modal = $('#lmModal');\r\n    modal.setAttribute('aria-hidden','true');\r\n    modal.onkeydown = null;\r\n    lastFocus?.focus();\r\n  }\r\n\r\n  function currentSort(list){\r\n    const val = $('#lmSort').value;\r\n    const collate = (a='',b='') => a.localeCompare(b,'es',{sensitivity:'base'});\r\n    const nameOf = o => noNull(o.nombre);\r\n    const primAct = o => (o._acts && o._acts.length) ? o._acts.slice().sort(collate)[0] : '';\r\n    const copy = list.slice();\r\n    if(val === 'nombre') copy.sort((a,b)=> collate(nameOf(a), nameOf(b)));\r\n    else copy.sort((a,b)=> collate(primAct(a), primAct(b)) || collate(nameOf(a), nameOf(b)));\r\n    return copy;\r\n  }\r\n\r\n  function updateCount(){\r\n    const n = FILTERED.length;\r\n    $('#lmCount').textContent = `${n} resultado${n===1?'':'s'}`;\r\n  }\r\n\r\n  function applyFilters(){\r\n    const q = norm($('#lmSearch').value);\r\n    const actsSel  = checkedValues($('#lmActList')).map(s=>s.toLowerCase());\r\n    const citySel  = checkedValues($('#lmCityList')).map(s=>s.toLowerCase());\r\n\r\n    FILTERED = RAW.filter(e=>{\r\n      const txt = [e.nombre, e.domicilio, e.ciudad, e.ciudadNorm, e.actividad, e.correo, e.telefono, (e._acts||[]).join(' ')]\r\n        .map(noNull).join(' | ').toLowerCase();\r\n\r\n      const okQ = !q || txt.includes(q);\r\n      let okA = true;\r\n      if(actsSel.length){ okA = actsSel.some(s => (e._actsNorm||[]).includes(s)); }\r\n      let okC = true;\r\n      if(citySel.length){ okC = citySel.includes(norm(e.ciudadNorm)); }\r\n\r\n      return okQ && okA && okC;\r\n    });\r\n\r\n    renderCards( currentSort(FILTERED) );\r\n    updateCount();\r\n    renderChecklistBadges($('#lmActList'),  $('#lmActBadges'));\r\n    renderChecklistBadges($('#lmCityList'), $('#lmCityBadges'));\r\n    $('#lmEmpty').hidden = !!FILTERED.length;\r\n    \r\n    \/\/ Actualizar marcadores del mapa seg\u00fan filtros\r\n    if (window.lmUpdateMapMarkers) {\r\n      window.lmUpdateMapMarkers(FILTERED);\r\n    }\r\n  }\r\n\r\n  function buildFilters(data){\r\n    const actCount = {};\r\n    data.forEach(e => (e._acts || []).forEach(a => actCount[a] = (actCount[a] || 0) + 1));\r\n    const acts = Object.keys(actCount).sort((a,b)=> a.localeCompare(b,'es',{sensitivity:'base'}))\r\n                 .map(a => ({ value:a, count: actCount[a] }));\r\n    buildChecklist($('#lmActList'), acts);\r\n\r\n    const cityCount = {};\r\n    data.forEach(e=>{\r\n      const c = noNull(e.ciudadNorm);\r\n      if(!c) return;\r\n      cityCount[c] = (cityCount[c] || 0) + 1;\r\n    });\r\n    const cities = Object.keys(cityCount).sort((a,b)=> a.localeCompare(b,'es',{sensitivity:'base'}))\r\n                   .map(c => ({ value:c, count: cityCount[c] }));\r\n    buildChecklist($('#lmCityList'), cities);\r\n  }\r\n\r\n  async function exportExcel(){\r\n    const wb = new ExcelJS.Workbook();\r\n    const ws = wb.addWorksheet('Asociados');\r\n    ws.columns = [\r\n      { header: 'Nombre de Asociado', key: 'nombre', width: 28 },\r\n      { header: 'Domicilio',          key: 'domicilio', width: 34 },\r\n      { header: 'Ciudad',             key: 'ciudad', width: 20 },\r\n      { header: 'Actividad',          key: 'actividad', width: 36 },\r\n      { header: 'Correo',             key: 'correo', width: 32 },\r\n      { header: 'Tel\u00e9fono',           key: 'telefono', width: 18 }\r\n    ];\r\n    currentSort(FILTERED).forEach(e => {\r\n      ws.addRow({\r\n        nombre:    noNull(e.nombre),\r\n        domicilio: noNull(e.domicilio),\r\n        ciudad:    noNull(e.ciudadNorm),\r\n        actividad: (e._acts || []).join('; '),\r\n        correo:    noNull(e.correo),\r\n        telefono:  noNull(e.telefono)\r\n      });\r\n    });\r\n    const head = ws.getRow(1);\r\n    head.eachCell(c=>{\r\n      c.fill = { type:'pattern', pattern:'solid', fgColor:{argb: EXCEL_PRIMARY} };\r\n      c.font = { bold:true, color:{argb:'FFFFFFFF'} };\r\n      c.alignment = { vertical:'middle', horizontal:'left' };\r\n      c.border = { top:{style:'thin',color:{argb:'FFCCCCCC'}},\r\n                   left:{style:'thin',color:{argb:'FFCCCCCC'}},\r\n                   bottom:{style:'thin',color:{argb:'FFCCCCCC'}},\r\n                   right:{style:'thin',color:{argb:'FFCCCCCC'}} };\r\n    });\r\n    for(let r=2; r<=ws.lastRow.number; r++){\r\n      const row = ws.getRow(r);\r\n      row.eachCell(c=>{\r\n        c.alignment = { vertical:'middle', horizontal:'left', wrapText:true };\r\n        c.border = { top:{style:'thin',color:{argb:'FFCCCCCC'}},\r\n                     left:{style:'thin',color:{argb:'FFCCCCCC'}},\r\n                     bottom:{style:'thin',color:{argb:'FFCCCCCC'}},\r\n                     right:{style:'thin',color:{argb:'FFCCCCCC'}} };\r\n      });\r\n      if(r%2===0){ row.eachCell(c=> c.fill = { type:'pattern', pattern:'solid', fgColor:{argb:'FFF9F9F9'} }); }\r\n    }\r\n    const blob = new Blob([await wb.xlsx.writeBuffer()], { type: 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });\r\n    saveAs(blob, 'asociados.xlsx');\r\n  }\r\n\r\n  (async function init(){\r\n    capturePrimaryForExcel();\r\n    $('#lmState').hidden = false;\r\n\r\n    try{\r\n      const res = await fetch(JSON_URL, { cache:'no-store' });\r\n      if(!res.ok) throw new Error('No se pudo cargar el JSON');\r\n      const json = await res.json();\r\n\r\n      RAW = json.map(e=>{\r\n        const acts = splitActivities(e.actividad);\r\n        const actsNorm = acts.map(normalizeActivityLabel);\r\n        return {\r\n          ...e,\r\n          ciudadNorm: titleCaseEs(noNull(e.ciudad)),\r\n          _acts: actsNorm,\r\n          _actsNorm: actsNorm.map(a=>a.toLowerCase())\r\n        };\r\n      });\r\n\r\n      buildFilters(RAW);\r\n      FILTERED = RAW.slice();\r\n      renderCards(currentSort(FILTERED));\r\n      updateCount();\r\n    }catch(e){\r\n      $('#lmState').innerHTML = `<div class=\"lm-empty\"><p>\u26a0\ufe0f Error al cargar los datos.<\/p><\/div>`;\r\n      console.error(e);\r\n    }finally{\r\n      $('#lmState').hidden = true;\r\n    }\r\n\r\n    const debounce = (fn,ms)=>{ let t; return (...a)=>{ clearTimeout(t); t=setTimeout(()=>fn(...a),ms); }; };\r\n    $('#lmSearch').addEventListener('input', debounce(applyFilters, 140));\r\n    $('#lmActList').addEventListener('change', applyFilters);\r\n    $('#lmCityList').addEventListener('change', applyFilters);\r\n    $('#lmSort').addEventListener('change', ()=> renderCards( currentSort(FILTERED) ) );\r\n    $('#lmExport').addEventListener('click', exportExcel);\r\n    $('#lmClearAct').addEventListener('click', ()=>{ uncheckAll($('#lmActList')); applyFilters(); });\r\n    $('#lmClearCity').addEventListener('click', ()=>{ uncheckAll($('#lmCityList')); applyFilters(); });\r\n    $('#lmClearAll').addEventListener('click', ()=>{\r\n      $('#lmSearch').value=''; uncheckAll($('#lmActList')); uncheckAll($('#lmCityList'));\r\n      $('#lmSort').value='actividad,nombre'; applyFilters();\r\n    });\r\n    $('#lmEmptyReset').addEventListener('click', ()=>{\r\n      $('#lmSearch').value=''; uncheckAll($('#lmActList')); uncheckAll($('#lmCityList')); applyFilters();\r\n    });\r\n\r\n    window.addEventListener('resize', ()=>{ equalizeHeights(); positionModal(); capturePrimaryForExcel(); }, { passive:true });\r\n    window.addEventListener('scroll', ()=> positionModal(), { passive:true });\r\n    \r\n    \/\/ Exponer funci\u00f3n global para abrir modal desde el mapa\r\n    window.lmOpenModalByName = function(nombre) {\r\n      const asociado = RAW.find(e => noNull(e.nombre) === nombre);\r\n      if (asociado) {\r\n        openModal(asociado);\r\n      } else {\r\n        console.warn('Asociado no encontrado:', nombre);\r\n      }\r\n    };\r\n  })();\r\n})();\r\n<\/script>\r\n\r\n<!-- Script Leaflet Map -->\r\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\r\n<script>\r\n(function() {\r\n    \/\/ Verificar que el div del mapa existe\r\n    var mapDiv = document.getElementById('map');\r\n    if (!mapDiv) {\r\n        console.error('No se encontr\u00f3 el div del mapa');\r\n        return;\r\n    }\r\n\r\n    try {\r\n        var map = L.map('map', {\r\n            zoomControl: true,\r\n            attributionControl: false,  \/\/ Deshabilitar atribuci\u00f3n autom\u00e1tica para personalizarla\r\n            preferCanvas: false,\r\n            fadeAnimation: true,\r\n            zoomAnimation: true,\r\n            markerZoomAnimation: true,\r\n            scrollWheelZoom: true,\r\n            trackResize: true,\r\n            boxZoom: true,\r\n            doubleClickZoom: true,\r\n            keyboard: false,  \/\/ SOLUCI\u00d3N: Deshabilitar teclado para evitar focus-scroll de WordPress\r\n            worldCopyJump: false,  \/\/ Desabilitar salto autom\u00e1tico para control manual\r\n            continuousWorld: false,\r\n            noWrap: false  \/\/ Permitir wrapping de tiles\r\n        }).setView([42.6639527584475, -6.8], 8);\r\n        \r\n        \/\/ A\u00f1adir control de atribuci\u00f3n personalizado solo con Leaflet y Esri\r\n        L.control.attribution({\r\n            prefix: '<a href=\"https:\/\/leafletjs.com\" title=\"A JavaScript library for interactive maps\">Leaflet<\/a>'\r\n        }).addTo(map);\r\n        \r\n        \/\/ Prevenir que el contenedor del mapa pueda recibir focus\r\n        mapDiv.setAttribute('tabindex', '-1');\r\n        map.getContainer().setAttribute('tabindex', '-1');\r\n    \r\n    \/\/ Vista sat\u00e9lite de Esri\r\n    L.tileLayer('https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/World_Imagery\/MapServer\/tile\/{z}\/{y}\/{x}', {\r\n        attribution: 'Tiles \u00a9 Esri',\r\n        maxZoom: 18,\r\n        tileSize: 256,\r\n        zoomOffset: 0,\r\n        updateWhenIdle: false,\r\n        updateWhenZooming: false,\r\n        keepBuffer: 2,\r\n        noWrap: false,  \/\/ Permitir que los tiles se repliquen en los bordes\r\n        bounds: [[-90, -540], [90, 540]]  \/\/ Permitir longitudes extendidas para wrapping\r\n    }).addTo(map);\r\n    \r\n    \/\/ Crear iconos personalizados\r\n    var customIcon = L.divIcon({\r\n        html: '<img decoding=\"async\" src=\"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/wood.png\" style=\"width:40px; height:23px;\">',\r\n        iconSize: [40, 23],\r\n        iconAnchor: [20, 23],\r\n        popupAnchor: [0, -23],\r\n        className: 'custom-marker-icon'\r\n    });\r\n    \r\n    var forestalIcon = L.divIcon({\r\n        html: '<img decoding=\"async\" src=\"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2026\/02\/servicios_forestales2.png\" style=\"width:35px; height:56px;\">',\r\n        iconSize: [35, 56],\r\n        iconAnchor: [17.5, 56],\r\n        popupAnchor: [0, -56],\r\n        className: 'custom-marker-icon'\r\n    });\r\n    \r\n    var aserraderoIcon = L.divIcon({\r\n        html: '<img decoding=\"async\" src=\"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2026\/03\/aserradero3.png\" style=\"width:35px; height:56px;\">',\r\n        iconSize: [35, 56],\r\n        iconAnchor: [17.5, 56],\r\n        popupAnchor: [0, -56],\r\n        className: 'custom-marker-icon'\r\n    });\r\n    \r\n    var biomasaIcon = L.divIcon({\r\n        html: '<img decoding=\"async\" src=\"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2026\/03\/biomasa3.png\" style=\"width:35px; height:56px;\">',\r\n        iconSize: [35, 56],\r\n        iconAnchor: [17.5, 56],\r\n        popupAnchor: [0, -56],\r\n        className: 'custom-marker-icon'\r\n    });\r\n    \r\n    var rematantesIcon = L.divIcon({\r\n        html: '<img decoding=\"async\" src=\"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2026\/03\/rematante3.png\" style=\"width:35px; height:56px;\">',\r\n        iconSize: [35, 56],\r\n        iconAnchor: [17.5, 56],\r\n        popupAnchor: [0, -56],\r\n        className: 'custom-marker-icon'\r\n    });\r\n    \r\n    var fabricaIcon = L.divIcon({\r\n        html: '<img decoding=\"async\" src=\"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2026\/03\/fabrica3.png\" style=\"width:35px; height:56px;\">',\r\n        iconSize: [35, 56],\r\n        iconAnchor: [17.5, 56],\r\n        popupAnchor: [0, -56],\r\n        className: 'custom-marker-icon'\r\n    });\r\n    \r\n    var IMG_FALLBACK_MAP = 'https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/cropped-cropped-lugo.png';\r\n    \r\n    \/\/ Array para almacenar todos los marcadores\r\n    var allMarkers = [];\r\n    \r\n    \/\/ Funci\u00f3n para crear marcadores din\u00e1micos desde el JSON\r\n    var JSON_URL = 'https:\/\/www.lugomadera.com\/wp-content\/uploads\/asociados.json';\r\n    \r\n    fetch(JSON_URL, { cache: 'no-store' })\r\n        .then(function(response) {\r\n            if (!response.ok) throw new Error('No se pudo cargar el JSON');\r\n            return response.json();\r\n        })\r\n        .then(function(asociados) {\r\n            \/\/ Procesar cada asociado y crear marcadores si tiene coordenadas\r\n            asociados.forEach(function(asociado) {\r\n                var coordenadas = (asociado.coordenadas || '').toString().trim();\r\n                \r\n                \/\/ Validar que tenga coordenadas\r\n                if (!coordenadas) return;\r\n                \r\n                \/\/ Parsear coordenadas (formato: \"43.43522532475084, -7.361069795768951\")\r\n                var coords = coordenadas.split(',').map(function(c) { return parseFloat(c.trim()); });\r\n                if (coords.length !== 2 || isNaN(coords[0]) || isNaN(coords[1])) {\r\n                    console.warn('Coordenadas inv\u00e1lidas para:', asociado.nombre, coordenadas);\r\n                    return;\r\n                }\r\n                \r\n                var lat = coords[0];\r\n                var lng = coords[1];\r\n                \r\n                \/\/ Obtener datos del asociado\r\n                var nombre = (asociado.nombre || '').toString().trim();\r\n                var logo = (asociado.logo || asociado.logo_url || '').toString().trim() || IMG_FALLBACK_MAP;\r\n                var domicilio = (asociado.domicilio || '').toString().trim();\r\n                var ciudad = (asociado.ciudad || '').toString().trim();\r\n                var correo = (asociado.correo || '').toString().trim();\r\n                var telefono = (asociado.telefono || '').toString().trim();\r\n                var como_llegar = (asociado.como_llegar || '').toString().trim();\r\n                \r\n                \/\/ Crear contenido del popup SIMPLIFICADO\r\n                var popupContent = '<div style=\"text-align:center;\">';\r\n                popupContent += '<img decoding=\"async\" src=\"' + logo + '\" alt=\"' + nombre + '\" style=\"width:120px; height:auto; margin-bottom:10px;\" onerror=\"this.src=\\'' + IMG_FALLBACK_MAP + '\\'\">';\r\n                popupContent += '<div style=\"font-size:14px; font-weight:bold; margin-bottom:12px;\">' + nombre + '<\/div>';\r\n                \r\n                \/\/ Escapar comillas y caracteres especiales en el nombre\r\n                var nombreEscapado = nombre.replace(\/\"\/g, '&quot;').replace(\/'\/g, '&#39;');\r\n                popupContent += '<a href=\"javascript:void(0)\" class=\"nectar-button\" onclick=\\'window.lmOpenModalByName(\"' + nombreEscapado + '\");\\'>VER FICHA<\/a>';\r\n                \r\n                if (como_llegar) {\r\n                    popupContent += '<br><a href=\"' + como_llegar + '\" class=\"nectar-button\" target=\"_blank\">C\u00d3MO LLEGAR<\/a>';\r\n                }\r\n                \r\n                popupContent += '<\/div>';\r\n                \r\n                \/\/ Determinar qu\u00e9 icono usar seg\u00fan la actividad\r\n                var actividadesRaw = (asociado.actividad || '').toString().trim().split(\/[;|,]\/).map(function(a) { return a.trim().toUpperCase(); }).filter(function(a) { return a && a !== 'NULL'; });\r\n                var esServiciosForestales = actividadesRaw.length === 1 && actividadesRaw[0] === 'SERVICIOS FORESTALES';\r\n                var tieneAserradero = actividadesRaw.indexOf('ASERRADERO') !== -1;\r\n                var tieneBiomasa = actividadesRaw.indexOf('BIOMASA') !== -1;\r\n                var tieneRematante = actividadesRaw.some(function(act) { return act.indexOf('REMATANTE') !== -1; });\r\n                var tieneFabrica = actividadesRaw.indexOf('F\u00c1BRICA') !== -1 || actividadesRaw.indexOf('FABRICA') !== -1;\r\n                var markerIcon = tieneFabrica ? fabricaIcon : (tieneRematante ? rematantesIcon : (esServiciosForestales ? forestalIcon : (tieneAserradero ? aserraderoIcon : (tieneBiomasa ? biomasaIcon : customIcon))));\r\n                \r\n                \/\/ Crear marcador\r\n                var marker = L.marker([lat, lng], {\r\n                    icon: markerIcon,\r\n                    draggable: false,\r\n                    riseOnHover: true\r\n                }).addTo(map).bindPopup(popupContent, { \r\n                    maxWidth: 300,\r\n                    autoPan: true,\r\n                    autoPanPaddingTopLeft: [20, 180],\r\n                    autoPanPaddingBottomRight: [20, 20],\r\n                    closeButton: true\r\n                });\r\n                \r\n                \/\/ Al hacer clic, centrar el marcador en el mapa (con offset vertical)\r\n                marker.on('click', function(e) {\r\n                    var point = map.project(e.latlng);\r\n                    var newPoint = point.subtract(L.point(0, 100));  \/\/ Bajar 100px (restamos del eje y)\r\n                    var newLatlng = map.unproject(newPoint);\r\n                    map.setView(newLatlng, map.getZoom());\r\n                });\r\n                \r\n                \/\/ Guardar marcador con su nombre para filtrado\r\n                allMarkers.push({\r\n                    marker: marker,\r\n                    nombre: nombre\r\n                });\r\n            });\r\n            \r\n            console.log('\u2705 Marcadores cargados desde el JSON');\r\n            \r\n            \/\/ Exponer funci\u00f3n global para actualizar marcadores seg\u00fan filtros\r\n            window.lmUpdateMapMarkers = function(filteredList) {\r\n                \/\/ Crear set de nombres filtrados para b\u00fasqueda r\u00e1pida\r\n                var nombresVisibles = new Set();\r\n                filteredList.forEach(function(item) {\r\n                    var n = (item.nombre || '').toString().trim();\r\n                    if (n) nombresVisibles.add(n);\r\n                });\r\n                \r\n                \/\/ Mostrar\/ocultar marcadores\r\n                allMarkers.forEach(function(item) {\r\n                    if (nombresVisibles.has(item.nombre)) {\r\n                        \/\/ Mostrar marcador\r\n                        if (!map.hasLayer(item.marker)) {\r\n                            item.marker.addTo(map);\r\n                        }\r\n                    } else {\r\n                        \/\/ Ocultar marcador\r\n                        if (map.hasLayer(item.marker)) {\r\n                            map.removeLayer(item.marker);\r\n                        }\r\n                    }\r\n                });\r\n                \r\n                console.log('\ud83d\uddfa\ufe0f Marcadores actualizados: ' + nombresVisibles.size + ' visibles');\r\n            };\r\n        })\r\n        .catch(function(error) {\r\n            console.error('Error al cargar marcadores:', error);\r\n        });\r\n\r\n    \/\/ Forzar recalculaci\u00f3n del tama\u00f1o del mapa\r\n    setTimeout(function() {\r\n        map.invalidateSize(true);\r\n    }, 100);\r\n    \r\n    setTimeout(function() {\r\n        map.invalidateSize(true);\r\n    }, 300);\r\n    \r\n    \/\/ ===== SISTEMA DE WRAPPING (Infinito) =====\r\n    var isWrapping = false;\r\n    \r\n    function wrapCoordinates(latlng) {\r\n        \/\/ Normalizar longitud a rango [-180, 180]\r\n        var lng = latlng.lng;\r\n        while (lng > 180) lng -= 360;\r\n        while (lng < -180) lng += 360;\r\n        \r\n        \/\/ Latitud se mantiene entre [-90, 90]\r\n        var lat = Math.max(-90, Math.min(90, latlng.lat));\r\n        \r\n        return L.latLng(lat, lng);\r\n    }\r\n    \r\n    function checkAndWrap() {\r\n        if (isWrapping) return;\r\n        \r\n        var center = map.getCenter();\r\n        var wrapped = wrapCoordinates(center);\r\n        \r\n        \/\/ Si las coordenadas cambiaron, el mapa necesita wrappear\r\n        if (center.lng !== wrapped.lng) {\r\n            isWrapping = true;\r\n            map.setView(wrapped, map.getZoom(), { animate: false });\r\n            isWrapping = false;\r\n            \r\n            console.log('\ud83d\udd04 Mapa wrapped: ' + center.lng + '\u00b0 \u2192 ' + wrapped.lng + '\u00b0');\r\n        }\r\n    }\r\n    \r\n    \/\/ Detectar eventos de navegaci\u00f3n\r\n    map.on('moveend', checkAndWrap);\r\n    map.on('dragend', checkAndWrap);\r\n    map.on('zoomend', checkAndWrap);\r\n    \r\n    \/\/ Tambi\u00e9n verificar cuando el usuario intenta hacer pan\r\n    var lastCenter = map.getCenter();\r\n    map.on('move', function() {\r\n        var currentCenter = map.getCenter();\r\n        \r\n        \/\/ Detectar si el usuario intent\u00f3 ir m\u00e1s all\u00e1 de \u00b1180\u00b0\r\n        var lngDiff = currentCenter.lng - lastCenter.lng;\r\n        if (Math.abs(lngDiff) > 180) {\r\n            \/\/ Fue un salto grande, probablemente intento de wrapping\r\n            checkAndWrap();\r\n        }\r\n        lastCenter = currentCenter;\r\n    });\r\n\r\n    } catch(error) {\r\n        console.error('Error al inicializar el mapa:', error);\r\n        mapDiv.innerHTML = '<div style=\"display:flex;align-items:center;justify-content:center;height:600px;background:#f0f0f0;color:#666;border-radius:15px;\">Error al cargar el mapa<\/div>';\r\n    }\r\n\r\n    \/\/ ===== SOLUCI\u00d3N AGRESIVA: Bloquear scroll de WordPress completamente =====\r\n    \r\n    var scrollBlockActive = false;\r\n    var lockedScrollPosition = 0;\r\n    \r\n    \/\/ Funci\u00f3n para bloquear cualquier intento de scroll\r\n    function blockScroll(e) {\r\n        if (scrollBlockActive) {\r\n            window.scrollTo(0, lockedScrollPosition);\r\n        }\r\n    }\r\n    \r\n    \/\/ Interceptar el evento popupclose\r\n    map.on('popupclose', function(e) {\r\n        \/\/ Guardar posici\u00f3n actual\r\n        lockedScrollPosition = window.pageYOffset || document.documentElement.scrollTop;\r\n        scrollBlockActive = true;\r\n        \r\n        \/\/ Activar listener de scroll para bloquear cualquier cambio\r\n        window.addEventListener('scroll', blockScroll, { passive: false });\r\n        \r\n        \/\/ Desactivar el bloqueo despu\u00e9s de 200ms\r\n        setTimeout(function() {\r\n            scrollBlockActive = false;\r\n            window.removeEventListener('scroll', blockScroll);\r\n            console.log('\ud83d\udee1\ufe0f Protecci\u00f3n anti-scroll WordPress activada y desactivada');\r\n        }, 200);\r\n    });\r\n    \r\n    \/\/ Prevenir focus en el mapa que pueda causar scroll\r\n    mapDiv.addEventListener('focus', function(e) {\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n        this.blur();\r\n    }, true);\r\n    \r\n    map.getContainer().addEventListener('focus', function(e) {\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n        this.blur();\r\n    }, true);\r\n    \r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>DIRECTORIO EMPRESARIAL \u25be Filtros 0 resultados Limpiar Actividad Limpiar Ayuntamiento Limpiar Opciones Ordenar por Actividad \u2192 NombreNombre Descargar Excel No hay resultados con los filtros actuales. Quitar filtros &times;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-templates\/full-width-transparent.php","meta":{"footnotes":""},"class_list":["post-5574","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Directorio empresarial - Lugo Madera<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lugomadera.com\/index.php\/work\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Directorio empresarial - Lugo Madera\" \/>\n<meta property=\"og:description\" content=\"DIRECTORIO EMPRESARIAL \u25be Filtros 0 resultados Limpiar Actividad Limpiar Ayuntamiento Limpiar Opciones Ordenar por Actividad \u2192 NombreNombre Descargar Excel No hay resultados con los filtros actuales. Quitar filtros &times;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lugomadera.com\/index.php\/work\/\" \/>\n<meta property=\"og:site_name\" content=\"Lugo Madera\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-03T07:40:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white.png\" \/>\n\t<meta property=\"og:image:width\" content=\"3000\" \/>\n\t<meta property=\"og:image:height\" content=\"2483\" \/>\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=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"89 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/index.php\\\/work\\\/\",\"url\":\"https:\\\/\\\/www.lugomadera.com\\\/index.php\\\/work\\\/\",\"name\":\"Directorio empresarial - Lugo Madera\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/index.php\\\/work\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/index.php\\\/work\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lugomadera.com\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/lugo-white-300x248.png\",\"datePublished\":\"2016-12-03T15:44:41+00:00\",\"dateModified\":\"2026-03-03T07:40:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/index.php\\\/work\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lugomadera.com\\\/index.php\\\/work\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/index.php\\\/work\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lugomadera.com\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/lugo-white.png\",\"contentUrl\":\"https:\\\/\\\/www.lugomadera.com\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/lugo-white.png\",\"width\":3000,\"height\":2483,\"caption\":\"Logotipo LugoMadera blanco recortado\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/index.php\\\/work\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/www.lugomadera.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Directorio empresarial\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/#website\",\"url\":\"https:\\\/\\\/www.lugomadera.com\\\/\",\"name\":\"Lugo Madera\",\"description\":\"Asociaci\u00f3n Provincial de Empresarios de la 1\u00aa Transformaci\u00f3n de la Madera de Lugo\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lugomadera.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/#organization\",\"name\":\"Lugo Madera\",\"url\":\"https:\\\/\\\/www.lugomadera.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.lugomadera.com\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/lugo-white-300-h-1.png\",\"contentUrl\":\"https:\\\/\\\/www.lugomadera.com\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/lugo-white-300-h-1.png\",\"width\":600,\"height\":262,\"caption\":\"Lugo Madera\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lugomadera.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Directorio empresarial - Lugo Madera","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:\/\/www.lugomadera.com\/index.php\/work\/","og_locale":"es_ES","og_type":"article","og_title":"Directorio empresarial - Lugo Madera","og_description":"DIRECTORIO EMPRESARIAL \u25be Filtros 0 resultados Limpiar Actividad Limpiar Ayuntamiento Limpiar Opciones Ordenar por Actividad \u2192 NombreNombre Descargar Excel No hay resultados con los filtros actuales. Quitar filtros &times;","og_url":"https:\/\/www.lugomadera.com\/index.php\/work\/","og_site_name":"Lugo Madera","article_modified_time":"2026-03-03T07:40:51+00:00","og_image":[{"width":3000,"height":2483,"url":"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Tiempo de lectura":"89 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lugomadera.com\/index.php\/work\/","url":"https:\/\/www.lugomadera.com\/index.php\/work\/","name":"Directorio empresarial - Lugo Madera","isPartOf":{"@id":"https:\/\/www.lugomadera.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lugomadera.com\/index.php\/work\/#primaryimage"},"image":{"@id":"https:\/\/www.lugomadera.com\/index.php\/work\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-300x248.png","datePublished":"2016-12-03T15:44:41+00:00","dateModified":"2026-03-03T07:40:51+00:00","breadcrumb":{"@id":"https:\/\/www.lugomadera.com\/index.php\/work\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lugomadera.com\/index.php\/work\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.lugomadera.com\/index.php\/work\/#primaryimage","url":"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white.png","contentUrl":"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white.png","width":3000,"height":2483,"caption":"Logotipo LugoMadera blanco recortado"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lugomadera.com\/index.php\/work\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/www.lugomadera.com\/"},{"@type":"ListItem","position":2,"name":"Directorio empresarial"}]},{"@type":"WebSite","@id":"https:\/\/www.lugomadera.com\/#website","url":"https:\/\/www.lugomadera.com\/","name":"Lugo Madera","description":"Asociaci\u00f3n Provincial de Empresarios de la 1\u00aa Transformaci\u00f3n de la Madera de Lugo","publisher":{"@id":"https:\/\/www.lugomadera.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lugomadera.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.lugomadera.com\/#organization","name":"Lugo Madera","url":"https:\/\/www.lugomadera.com\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.lugomadera.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-300-h-1.png","contentUrl":"https:\/\/www.lugomadera.com\/wp-content\/uploads\/2024\/02\/lugo-white-300-h-1.png","width":600,"height":262,"caption":"Lugo Madera"},"image":{"@id":"https:\/\/www.lugomadera.com\/#\/schema\/logo\/image\/"}}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.lugomadera.com\/index.php\/wp-json\/wp\/v2\/pages\/5574","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lugomadera.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lugomadera.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lugomadera.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lugomadera.com\/index.php\/wp-json\/wp\/v2\/comments?post=5574"}],"version-history":[{"count":179,"href":"https:\/\/www.lugomadera.com\/index.php\/wp-json\/wp\/v2\/pages\/5574\/revisions"}],"predecessor-version":[{"id":10934,"href":"https:\/\/www.lugomadera.com\/index.php\/wp-json\/wp\/v2\/pages\/5574\/revisions\/10934"}],"wp:attachment":[{"href":"https:\/\/www.lugomadera.com\/index.php\/wp-json\/wp\/v2\/media?parent=5574"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}