{"id":732,"date":"2025-09-02T06:11:36","date_gmt":"2025-09-02T04:11:36","guid":{"rendered":"https:\/\/herramientas.publican2.com\/?page_id=732"},"modified":"2025-09-02T06:47:46","modified_gmt":"2025-09-02T04:47:46","slug":"anuncios","status":"publish","type":"page","link":"https:\/\/herramientas.publican2.com\/sv\/anuncios\/","title":{"rendered":"Anuncios"},"content":{"rendered":"<div class=\"rgar-wrap\" data-mode=\"actions\">\r\n            <div class=\"rgar-card\">\r\n                <div class=\"rgar-toolbar\">\r\n                    <div class=\"rgar-filter\">\r\n                        <label for=\"rgar-search\">Buscar<\/label>\r\n                        <input id=\"rgar-search\" type=\"search\" placeholder=\"T\u00edtulo, nombre, ciudad, provincia, email...\">\r\n                    <\/div>\r\n                <\/div>\r\n                <div class=\"rgar-statusbar\">\r\n                    <span>Registros cargados: <strong id=\"rgar-found\">24<\/strong><\/span>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"rgar-table-wrap\">\r\n                <table id=\"rgar-table\">\r\n                    <thead>\r\n                        <tr>\r\n                            <th data-sort=\"num\" class=\"rgar-sortable\">#<\/th>\r\n                            <!-- URL \/ Abrir eliminado como columna -->\r\n                            <th data-sort=\"titulo\" class=\"rgar-sortable rgar-col-title\">T\u00edtulo<\/th>\r\n                            <th data-sort=\"nombre\" class=\"rgar-sortable\">Nombre<\/th>\r\n                            <th data-sort=\"provincia\" class=\"rgar-sortable\">Provincia<\/th>\r\n                            <th data-sort=\"ciudad\" class=\"rgar-sortable\">Ciudad<\/th>\r\n                            <!-- <th data-sort=\"celular\" class=\"rgar-sortable\">Celular<\/th> -->\r\n\r\n                            <th data-sort=\"guardado\" class=\"rgar-sortable\">Guardado<\/th>\r\n                            <th data-sort=\"email\" class=\"rgar-sortable rgar-col-email\">Email<\/th>\r\n<th class=\"rgar-col-ver\">Ver<\/th>\r\n<th class=\"rgar-col-acciones\">Acciones<\/th>\r\n\r\n                        <\/tr>\r\n                    <\/thead>\r\n                    <tbody><\/tbody>\r\n                <\/table>\r\n            <\/div>\r\n\r\n            <!-- Modal email -->\r\n            <div id=\"rgar-modal\" aria-hidden=\"true\">\r\n                <div class=\"rgar-modal__backdrop\" data-close><\/div>\r\n                <div class=\"rgar-modal__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"rgar-modal-title\">\r\n                    <button class=\"rgar-modal__close\" data-close title=\"Cerrar\">&times;<\/button>\r\n                    <h3 id=\"rgar-modal-title\">Email sugerido<\/h3>\r\n                    <div class=\"rgar-modal__content\">\r\n                        <div class=\"rgar-field\">\r\n                            <label>Asunto<\/label>\r\n                            <textarea id=\"rgar-email-subject\" rows=\"2\" readonly><\/textarea>\r\n                            <button type=\"button\" class=\"rgar-copy\" data-copy=\"#rgar-email-subject\">Copiar asunto<\/button>\r\n                        <\/div>\r\n                        <div class=\"rgar-field\">\r\n                            <label>Cuerpo<\/label>\r\n                            <textarea id=\"rgar-email-body\" rows=\"12\" readonly><\/textarea>\r\n                            <button type=\"button\" class=\"rgar-copy\" data-copy=\"#rgar-email-body\">Copiar cuerpo<\/button>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <input type=\"hidden\" id=\"rgar-nonce\" value=\"8deb75cf92\">\r\n            <input type=\"hidden\" id=\"rgar-ajax\"  value=\"https:\/\/herramientas.publican2.com\/wp-admin\/admin-ajax.php\">\r\n\r\n            <script id=\"rgar-initial-data\" type=\"application\/json\">[{\"pid\":845,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264598\",\"titulo\":\"TOYOTA COROLLA XEI HEV AUTOMATICO(HYBRIDO). A\\u00d1O 2021 CON 67.000KM. MOTOR A COMBUSTIBLE 1.8 COMBINADO CON UN MOTOR EL\\u00c9CTRICO. PANTALLA T\\u00c1CTIL, ENCENDIDO POR BOT\\u00d3N, CLIMATIZADOR BI-ZONA, FAROS LED, CONTROL DE VELOCIDAD CRUCERO, SISTEMA DE ALERTA DE CAMBIO DE CARRIL, C\\u00c1MARA DE ESTACIONAMIENTO CON SENSORES DELANTEROS Y TRASEROS, CONTROL ESTABILIDAD, 7 AIRBARGS.\",\"nombre\":\"SHELBY AUTOMOTORES\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"341 - 156391160\",\"email\":\"\",\"id\":5264598,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":844,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264597\",\"titulo\":\"Titular documentaci\\u00f3n completa lista para transferir, vtv vigente , cubiertas reci\\u00e9n colocadas , kit de altura , kit de separadores, SERVICE reci\\u00e9n echo evalu\\u00f3 posible permuta.\",\"nombre\":\"Juan Leandro\",\"provincia\":\"Santa Fe\",\"ciudad\":\"San Lorenzo\",\"celular\":\"03476 - 15668333\",\"email\":\"\",\"id\":5264597,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":843,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264591\",\"titulo\":\"VENDO o PERMUTO POR AUTO\",\"nombre\":\"Gianfranco\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"341 - 155646338\",\"email\":\"\",\"id\":5264591,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":842,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264584\",\"titulo\":\"CITRO\\u00cbN C3 AIRCROSS FEEL AT\",\"nombre\":\"Gaston\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"0341 - 153013518\",\"email\":\"\",\"id\":5264584,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":841,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264586\",\"titulo\":\"Documentaci\\u00f3n completa lista para transferir, vtv vigente GNC excelente estado ,evalu\\u00f3 permuta.\",\"nombre\":\"Juan Leandro\",\"provincia\":\"Santa Fe\",\"ciudad\":\"San Lorenzo\",\"celular\":\"03476 - 15668333\",\"email\":\"\",\"id\":5264586,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":840,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264579\",\"titulo\":\"GOL TREND PACK III Full &#8211; 2011\",\"nombre\":\"Renzo N\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"341 - 156009080\",\"email\":\"\",\"id\":5264579,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":839,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264580\",\"titulo\":\"Focus Titanium 2015 el m\\u00e1s full autom\\u00e1tico con GNC de 6ta generaci\\u00f3n puesto hace 4 a\\u00f1os.\",\"nombre\":\"claudio\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"0341 - 156659190\",\"email\":\"\",\"id\":5264580,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":838,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264576\",\"titulo\":\"Marca:\\u00a0Renault\",\"nombre\":\"matias marilungo\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"341 - 153873777\",\"email\":\"\",\"id\":5264576,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":837,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264573\",\"titulo\":\"Marca:\\u00a0Chevrolet\",\"nombre\":\"Hebert\",\"provincia\":\"Buenos Aires\",\"ciudad\":\"San Nicolas De Los Arroyos,est.s.nicolas\",\"celular\":\"336 - 154642431\",\"email\":\"\",\"id\":5264573,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":836,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264570\",\"titulo\":\"Visitas hasta el momento: 159\",\"nombre\":\"Lucrecia\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Funes\",\"celular\":\"341 - 152741508\",\"email\":\"\",\"id\":5264570,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":835,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264540\",\"titulo\":\"Visitas hasta el momento: 167\",\"nombre\":\"Alfonsina Arias\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Coronda\",\"celular\":\"342 - 154459949\",\"email\":\"\",\"id\":5264540,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":834,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264570\",\"titulo\":\"Visitas hasta el momento: 157\",\"nombre\":\"Lucrecia\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Funes\",\"celular\":\"341 - 152741508\",\"email\":\"\",\"id\":5264570,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":833,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264565\",\"titulo\":\"Se trata de la versi\\u00f3n TEKNA 2.0 CVT, tapizado en cuero, techo solar electrico, camara de retroceso.\",\"nombre\":\"\\u00a0LPF CARS\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"341 - 156057948\",\"email\":\"\",\"id\":5264565,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":832,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264558\",\"titulo\":\"Atenci\\u00f3n coleccionistas y\\\/o restauradores. Todo original. A\\u00f1o 1972. Torino. No coup\\u00e9. NAFTA y GNC.\",\"nombre\":\"Graciela\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Correa\",\"celular\":\"3471 - 15688309\",\"email\":\"\",\"id\":5264558,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":831,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264560\",\"titulo\":\"Precio Sin Impuestos: $ 18.140.495\",\"nombre\":\"\\u00a0Sakura Motors S.A.\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"0341 - 156576574\",\"email\":\"\",\"id\":5264560,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":830,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264559\",\"titulo\":\"Automotores Buenos Aires 5016*\",\"nombre\":\"AUTOMOTORES BUENOS AIRES 5016\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"341 - 152093540\",\"email\":\"sebastianalejandro85@gmail.com\",\"id\":5264559,\"guardado\":true,\"permalink\":\"\",\"_sent\":true,\"_subject\":\"Mejora la visibilidad de tu aviso en autom\\u00f3viles en Rosario\",\"_body\":\"Hola, AUTOMOTORES BUENOS AIRES 5016,\\n\\nNos hemos fijado en tu anuncio en RosarioGarage y queremos ofrecerte una oportunidad para potenciar su alcance. Publican2.com es la plataforma l\\u00edder en clasificados de autos en LATAM, y podemos brindarte mejores condiciones para que tu aviso destaque a\\u00fan m\\u00e1s.  \\n\\nAl republicar tu anuncio en Publican2.com, podr\\u00e1s acceder a una mayor audiencia interesada en autom\\u00f3viles en Rosario y Santa Fe, con opciones de promoci\\u00f3n y visibilidad que hacen la diferencia. Adem\\u00e1s, nuestro proceso es sencillo y seguro, asegurando que tu anuncio mantenga toda su informaci\\u00f3n y atractivo.  \\n\\nNunca fue tan f\\u00e1cil llegar a m\\u00e1s compradores potenciales y vender m\\u00e1s r\\u00e1pido tu veh\\u00edculo. Te invitamos a aprovechar esta oportunidad y a publicar tu aviso con nosotros para obtener resultados superiores.  \\n\\nSaludos cordiales,  \\nEquipo Publican2\"},{\"pid\":829,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264549\",\"titulo\":\"Cinta caminadora usada. Excelente estado. No hago envios. MODELO: ARG-500 MOTORIZADA ESPECIFICACIONES T\\u00c9CNICAS RESISTENCIA: MOTORIZADA. EJERCICIO: CAMINAR Y CORRER. PESO M\\u00c1XIMO: 110 Kg. VELOCIDAD: 16 Km\\\/h. ANCHO DE BANDA: 43 cm. PLEGABLE: S\\u00cd. INCLINACI\\u00d3N: MANUAL. PROGRAMAS: 15. MONITOR ELECTR\\u00d3NICO: S\\u00cd. POTENCIA: 1.5 HP. CARACTER\\u00cdSTICAS La cinta motorizada ARG-500 tiene una superficie amplia para caminar y correr. Cuenta con una Consola Backlight que controla tiempo, velocidad, distancia, calor\\u00edas y pulso. Una velocidad de 0 a 16 Km\\\/H que puede ser controlada en la consola y por los botones de velocidad en el manubrio. Al igual que la inclinaci\\u00f3n. Ruedas para f\\u00e1cil traslado y llave de seguridad.\",\"nombre\":\"Damian Liserre\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"341 - 153245555\",\"email\":\"\",\"id\":5264549,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":828,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264548\",\"titulo\":\"1.6 GNC TITULAR. acepto permutas ( MOTOS 250 cc para arriba )\",\"nombre\":\"luciano\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"0341 - 152607058\",\"email\":\"\",\"id\":5264548,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":827,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264550\",\"titulo\":\"Precio Sin Impuestos: $ 18.966.942\",\"nombre\":\"\\u00a0Sakura Motors S.A.\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"0341 - 156576574\",\"email\":\"\",\"id\":5264550,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":826,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264541\",\"titulo\":\"SOLO 3 VECES DE USO, LAS VENDO PORQUE ME QUEDAN JUSTAS DE TALLE\",\"nombre\":\"Damian Liserre\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"341 - 153245555\",\"email\":\"\",\"id\":5264541,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":825,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264540\",\"titulo\":\"Visitas hasta el momento: 164\",\"nombre\":\"Alfonsina Arias\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Coronda\",\"celular\":\"342 - 154459949\",\"email\":\"\",\"id\":5264540,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":824,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264538\",\"titulo\":\"Peugeot 2008, a\\u00f1o 2019, 88.197 KMS.\",\"nombre\":\"Rosario Planes S.A\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"341 - 153 634427\",\"email\":\"sebastianalejandro85@gmail.com\",\"id\":5264538,\"guardado\":true,\"permalink\":\"\",\"_sent\":true,\"_subject\":\"Mejora tu alcance en veh\\u00edculos con mejores condiciones\",\"_body\":\"Hola Rosario Planes S.A.,\\n\\n\\u00bfHas considerado ampliar la visibilidad de tu aviso del Peugeot 2008 en otro canal? En Publican2.com te ofrecemos una plataforma especializada en autom\\u00f3viles, con condiciones m\\u00e1s competitivas y una mayor exposici\\u00f3n para que tu anuncio destaque a\\u00fan m\\u00e1s en Rosario y toda Santa Fe. Sabemos lo importante que es para ti vender r\\u00e1pido y en las mejores condiciones, por eso te brindamos opciones para potenciar tu anuncio, con tarifas ajustadas y una audiencia activa interesada en veh\\u00edculos de calidad como el tuyo.\\n\\nRepubica tu aviso del Peugeot 2008 en Publican2.com y aprovecha nuestro alcance y apoyo personalizado para conseguir mejores resultados. No dejes pasar esta oportunidad de maximizar las vistas y las potenciales ventas de tu veh\\u00edculo.\\n\\n\\u00bfQuieres que te ayudemos a migrar tu aviso? Estamos a tu disposici\\u00f3n para facilitarte el proceso y ofrecerte asesoramiento sin compromiso.\\n\\nUn saludo cordial,  \\nEquipo Publican2\"},{\"pid\":823,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264532\",\"titulo\":\"Vendo plan de ahorro de un Nissan versa 1,6 sense con 10 cuotas pagas\",\"nombre\":\"Jorge Mario Quiroga\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"341 - 156693636\",\"email\":\"\",\"id\":5264532,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"},{\"pid\":822,\"url\":\"https:\\\/\\\/www.rosariogarage.com\\\/index.php?action=carro\\\/showProduct&itmId=5264531\",\"titulo\":\"Precio Sin Impuestos: $ 16.818.181\",\"nombre\":\"\\u00a0Sakura Motors S.A.\",\"provincia\":\"Santa Fe\",\"ciudad\":\"Rosario\",\"celular\":\"0341 - 156576574\",\"email\":\"\",\"id\":5264531,\"guardado\":true,\"permalink\":\"\",\"_sent\":false,\"_subject\":\"\",\"_body\":\"\"}]<\/script>\r\n        <\/div>\r\n\r\n                <style>\r\n\r\n            \/* ===== Layout general del contenedor ===== *\/\r\n\r\n\/* --- Cabecera en una sola l\u00ednea y sin cortes raros --- *\/\r\n#rgar-table th{\r\n  white-space: nowrap;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n}\r\n\r\n\/* --- La tabla no se achica por debajo de este ancho; aparece scroll x en el wrap --- *\/\r\n#rgar-table{\r\n  min-width: 1120px;   \/* ajusta si lo necesitas (1080\u20131200 suele ir bien) *\/\r\n}\r\n\r\n\r\n\/* # (\u00edndice) *\/\r\n#rgar-table th:nth-child(1),\r\n#rgar-table td:nth-child(1){ width: 48px; }\r\n\r\n\/* T\u00edtulo: ancho flexible pero con l\u00edmites y elipsis *\/\r\n.rgar-col-title{ min-width: 380px; max-width: 520px; }\r\n#rgar-table td.rgar-title{\r\n  white-space: nowrap;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  font-weight: 600;\r\n}\r\n\r\n\/* Nombre \/ Provincia \/ Ciudad: una l\u00ednea con elipsis *\/\r\n#rgar-table td:nth-child(3),\r\n#rgar-table td:nth-child(4),\r\n#rgar-table td:nth-child(5){\r\n  white-space: nowrap;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n}\r\n\r\n\/* Celular *\/\r\n#rgar-table th:nth-child(6),\r\n#rgar-table td:nth-child(6){ width: 120px; white-space: nowrap; }\r\n\r\n\/* Guardado *\/\r\n\/* Guardado: angosto *\/\r\n#rgar-table th:nth-child(7),\r\n#rgar-table td:nth-child(7){\r\n  width:170px !important;\r\n  max-width:170px !important;\r\n  text-align:center !important;\r\n  padding:0 .25rem !important;\r\n}\r\n\r\n\r\n\/* Email: m\u00e1s ancho y truncado con puntos suspensivos *\/\r\n#rgar-table th:nth-child(8),\r\n#rgar-table td:nth-child(8){\r\n  min-width: 200px !important;   \/* dale respiro *\/\r\n  max-width: 280px;              \/* controla que no rompa la tabla *\/\r\n  white-space: nowrap;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n}\r\n\r\n\r\n\/* Badge compacto *\/\r\n.rgar-badge{ padding:.05rem .35rem; font-size:.75rem; }\r\n\r\n\/* Email *\/\r\n.rgar-col-email{ min-width: 220px; }\r\n.rgar-email-input{\r\n  width: 100%;\r\n  max-width: none;\r\n  height: 32px;           \/* consistente *\/\r\n  padding: .35rem .5rem;\r\n  text-overflow: ellipsis;\r\n}\r\n\r\n\/* Ver *\/\r\n.rgar-col-ver{ width: 70px; }\r\n.rgar-col-ver .rgar-action{ width: 100%; }\r\n\r\n\/* Acciones (dos columnas 50\/50) *\/\r\n.rgar-col-acciones{ width: 180px; }\r\n.rgar-actions-cell{\r\n  display: grid;\r\n  grid-template-columns: 1fr 1fr;\r\n  gap: .45rem;\r\n}\r\n.rgar-actions-cell .rgar-action{ width: 100%; }\r\n\r\n\r\n\r\n\r\n.rgar-wrap{\r\n  max-width: 1200px;      \/* evita desbordes en layouts fluidos *\/\r\n  margin: 0 auto;\r\n  padding: 4px 8px 16px;\r\n}\r\n\r\n\/* Tarjeta superior: separaciones m\u00e1s aireadas *\/\r\n.rgar-card{\r\n  padding: 14px;\r\n  margin-bottom: 14px;\r\n}\r\n\r\n\/* Barra de herramientas y b\u00fasqueda *\/\r\n.rgar-toolbar{ gap: 10px 16px; }\r\n.rgar-filter input{\r\n  min-width: 320px;\r\n  width: clamp(220px, 40vw, 420px);\r\n}\r\n\r\n\/* ===== Tabla: scroll horizontal si es necesario ===== *\/\r\n.rgar-table-wrap{\r\n  overflow-x: auto;\r\n  overflow-y: hidden;\r\n  padding-bottom: 6px;     \/* espacio para la barra de scroll *\/\r\n}\r\n\r\n\/* Est\u00e9tica y densidad de filas *\/\r\n#rgar-table{\r\n  width: 100%;\r\n  table-layout: fixed;      \/* ya lo usas: ayuda a truncar *\/\r\n  border-collapse: separate;\r\n  border-spacing: 0;\r\n}\r\n\r\n#rgar-table th,\r\n#rgar-table td{\r\n  padding: .55rem .65rem;   \/* un pel\u00edn m\u00e1s de aire lateral *\/\r\n  vertical-align: middle;\r\n}\r\n\r\n#rgar-table tbody tr:hover{\r\n  background: #fafafa;\r\n}\r\n\r\n\/* ===== Columnas y truncado ===== *\/\r\n\r\n\/* T\u00edtulo: m\u00e1s ancho y elipsis *\/\r\n.rgar-col-title{ width: 420px; }             \/* antes 260px *\/\r\n#rgar-table td.rgar-title{\r\n  white-space: nowrap;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n}\r\n\r\n\/* Nombre\/Provincia\/Ciudad: una l\u00ednea con elipsis *\/\r\n#rgar-table td:nth-child(3),\r\n#rgar-table td:nth-child(4),\r\n#rgar-table td:nth-child(5){\r\n  white-space: nowrap;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n}\r\n\r\n\/* Celular: ancho fijo corto *\/\r\n.rgar-col-celular{ width: 140px; }\r\n#rgar-table td:nth-child(6){\r\n  white-space: nowrap;\r\n}\r\n\r\n\/* Guardado: compacto *\/\r\n#rgar-table td:nth-child(7){\r\n  white-space: nowrap;\r\n}\r\n\r\n\/* Email: ancho controlado + elipsis del input *\/\r\n.rgar-col-email{ width: 220px; }\r\n.rgar-email-input{\r\n  width: 100%;\r\n  max-width: none;         \/* que llene su celda *\/\r\n  font-size: .92rem;\r\n  padding: .35rem .5rem;\r\n  text-overflow: ellipsis;\r\n}\r\n\r\n\/* Columna \"Ver\": angosta *\/\r\n.rgar-col-ver{ width: 64px; }\r\n.rgar-col-ver .rgar-action{ width: 100%; }\r\n\r\n\/* Acciones: dos columnas 50\/50 y ancho estable *\/\r\n.rgar-col-acciones{ width: 180px; }\r\n.rgar-actions-cell{\r\n  display: grid;\r\n  grid-template-columns: 1fr 1fr;\r\n  gap: .45rem;\r\n}\r\n.rgar-actions-cell .rgar-action{ width: 100%; }\r\n\r\n\/* Badges m\u00e1s compactos *\/\r\n.rgar-badge{ padding:.1rem .4rem; font-size:.78rem; }\r\n\r\n\/* Botones de acci\u00f3n: altura y espaciado consistentes *\/\r\n.rgar-action{\r\n  padding: .4rem .55rem;\r\n  line-height: 1.1;\r\n}\r\n\r\n\/* Evitar que textos largos rompan el layout (URLs o palabras sin espacios) *\/\r\n#rgar-table td{\r\n  word-wrap: break-word;\r\n  overflow-wrap: anywhere;\r\n}\r\n\r\n\/* ===== Sticky header mejorado (sombra al hacer scroll) ===== *\/\r\n#rgar-table th{\r\n  position: sticky;\r\n  top: 0;\r\n  background: #f9fafb;\r\n  z-index: 1;\r\n}\r\n.rgar-table-wrap:has(table thead){\r\n  \/* sombra sutil cuando hay scroll vertical dentro del wrap *\/\r\n  --shadow: 0 6px 10px -10px rgba(0,0,0,.25);\r\n}\r\n#rgar-table thead{ box-shadow: var(--shadow); }\r\n\r\n\/* ===== Responsive ===== *\/\r\n@media (max-width: 1100px){\r\n  .rgar-col-title{ width: 340px; }\r\n  .rgar-col-email{ width: 200px; }\r\n  .rgar-col-acciones{ width: 160px; }\r\n}\r\n\r\n@media (max-width: 900px){\r\n  \/* Esconde Provincia para ganar aire *\/\r\n  #rgar-table th:nth-child(5),\r\n  #rgar-table td:nth-child(5){ display: none; } \/* Ciudad queda; Provincia se oculta *\/\r\n  .rgar-col-title{ width: 320px; }\r\n}\r\n\r\n@media (max-width: 720px){\r\n  \/* Esconde tambi\u00e9n 'Ver' y compacta t\u00edtulo *\/\r\n  .rgar-col-ver,\r\n  #rgar-table th:nth-child(9),\r\n  #rgar-table td:nth-child(9){ display:none; }\r\n\r\n  .rgar-col-title{ width: 260px; }\r\n  .rgar-col-email{ width: 180px; }\r\n\r\n  \/* Acciones apiladas si no entra *\/\r\n  .rgar-actions-cell{\r\n    grid-template-columns: 1fr;\r\n  }\r\n}\r\n\r\n@media (max-width: 520px){\r\n  \/* \u00daltimo ajuste: ocultar Provincia y Celular si a\u00fan no entra *\/\r\n  #rgar-table th:nth-child(4),\r\n  #rgar-table td:nth-child(4){ display:none; } \/* Provincia ya oculta arriba si quieres *\/\r\n  #rgar-table th:nth-child(6),\r\n  #rgar-table td:nth-child(6){ display:none; } \/* Celular *\/\r\n  .rgar-filter input{ width: 100%; min-width: 0; }\r\n}\r\n\r\n\/* Tono del placeholder del input de b\u00fasqueda *\/\r\n.rgar-filter input::placeholder{ color:#9ca3af; }\r\n\r\n\/* Puntos de la statusbar con menos ruido visual *\/\r\n.rgar-statusbar{ gap: 10px; }\r\n.rgar-dot{ opacity:.35; }\r\n\r\n\/* Bordes de la tabla m\u00e1s sutiles en retina *\/\r\n#rgar-table th, #rgar-table td{ border-bottom:1px solid #eceff3; }\r\n\r\n\r\n            .rgar-wrap { font-family: system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif; }\r\n            .rgar-card { background:#fff; border:1px solid #e5e7eb; border-radius:12px; padding:12px; margin-bottom:12px; }\r\n            .rgar-flex { display:flex; gap:12px; flex-wrap:wrap; align-items:flex-end; }\r\n            .rgar-flex label { display:block; font-weight:600; margin-bottom:4px; }\r\n            .rgar-flex input { width:220px; padding:.5rem .6rem; border:1px solid #e5e7eb; border-radius:8px; }\r\n            .rgar-actions { display:flex; gap:8px; }\r\n            #rgar-start-btn { background:#065f46; color:#fff; border:none; border-radius:8px; padding:.55rem .8rem; cursor:pointer; }\r\n            #rgar-stop-btn  { background:#991b1b; color:#fff; border:none; border-radius:8px; padding:.55rem .8rem; cursor:pointer; }\r\n            #rgar-stop-btn[disabled] { opacity:.6; cursor:not-allowed; }\r\n\r\n            .rgar-toolbar { display:flex; gap:16px; align-items:flex-end; margin-top:10px; flex-wrap:wrap; }\r\n            .rgar-filter label { display:block; font-weight:600; margin-bottom:4px; }\r\n            .rgar-filter input, .rgar-filter select { padding:.5rem .6rem; border:1px solid #e5e7eb; border-radius:8px; min-width:220px; }\r\n\r\n            .rgar-statusbar { display:flex; gap:8px; align-items:center; color:#374151; margin-top:8px; flex-wrap:wrap; }\r\n            .rgar-indicator { width:12px; height:12px; border-radius:999px; display:inline-block; box-shadow:0 0 0 2px rgba(0,0,0,.05) inset; }\r\n            .rgar-green { background:#10b981; }\r\n            .rgar-red   { background:#ef4444; }\r\n            .rgar-dot { opacity:.5; }\r\n\r\n            .rgar-table-wrap { overflow:auto; }\r\n            #rgar-table { width:100%; border-collapse:separate; border-spacing:0; table-layout:fixed; }\r\n            #rgar-table th, #rgar-table td { border-bottom:1px solid #e5e7eb; padding:.55rem .5rem; font-size:.95rem; text-align:left; vertical-align:top; }\r\n            #rgar-table th { background:#f9fafb; position:sticky; top:0; z-index:1; user-select:none; }\r\n            .rgar-col-title { width:260px; }\r\n            #rgar-table td.rgar-title { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; font-weight:600; }\r\n\r\n            \/* Reemplaza la regla existente por esta *\/\r\n\/* Acciones en dos columnas (Generar | Enviar) *\/\r\n.rgar-actions-cell{\r\n  display: grid;\r\n  grid-template-columns: 1fr 1fr; \/* 2 columnas iguales *\/\r\n  gap: .5rem;\r\n}\r\n\r\n\/* Que los botones ocupen todo el ancho de su celda *\/\r\n.rgar-actions-cell .rgar-action{\r\n  width: 100%;\r\n}\r\n\r\n\/* (Opcional) En pantallas muy estrechas, volver a 1 columna *\/\r\n@media (max-width: 520px){\r\n  .rgar-actions-cell{\r\n    grid-template-columns: 1fr;\r\n  }\r\n}\r\n\r\n\r\n\/* Celdas con una sola l\u00ednea + elipsis *\/\r\n.rgar-one-line {\r\n  white-space: nowrap;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n}\r\n\r\n\r\n\/* Celular m\u00e1s corto *\/\r\n.rgar-col-celular { width: 140px; }\r\n\r\n\r\n            .rgar-action { border:1px solid #e5e7eb; background:#fff; padding:.35rem .6rem; border-radius:.5rem; cursor:pointer; text-decoration:none; }\r\n            .rgar-action[disabled] { opacity:.5; cursor:not-allowed; }\r\n\r\n            .rgar-badge { display:inline-block; padding:.15rem .45rem; border-radius:.4rem; font-size:.8rem; border:1px solid #e5e7eb; }\r\n            .rgar-badge--yes { background:#ecfdf5; }\r\n            .rgar-badge--no  { background:#fef2f2; }\r\n\r\n            .rgar-sortable { cursor:pointer; }\r\n            .rgar-sortable::after { content:\"\u2195\"; margin-left:.35rem; opacity:.4; font-size:.8rem; }\r\n            .rgar-sortable[data-dir=\"asc\"]::after  { content:\"\u2191\"; opacity:.9; }\r\n            .rgar-sortable[data-dir=\"desc\"]::after { content:\"\u2193\"; opacity:.9; }\r\n\r\n            .rgar-email-input { width:100%; max-width:260px; padding:.35rem .5rem; border:1px solid #e5e7eb; border-radius:.5rem; }\r\n\r\n            \/* Modal *\/\r\n            #rgar-modal { display:none; }\r\n            #rgar-modal[aria-hidden=\"false\"] { display:block; }\r\n            .rgar-modal__backdrop { position:fixed; inset:0; background:rgba(0,0,0,.5); }\r\n            .rgar-modal__dialog { position:fixed; inset:50% auto auto 50%; transform:translate(-50%, -50%); background:#fff; border-radius:.75rem; width:min(820px, 92vw); box-shadow:0 20px 50px rgba(0,0,0,.25); }\r\n            .rgar-modal__close { position:absolute; right:.5rem; top:.35rem; background:transparent; border:none; font-size:1.5rem; cursor:pointer; }\r\n            .rgar-modal__content { padding:1rem; }\r\n            .rgar-modal__dialog h3 { margin:0; padding:1rem 2.5rem 0 1rem; font-size:1.1rem; }\r\n            .rgar-field { display:grid; gap:.35rem; margin-top:.75rem; }\r\n            .rgar-field textarea { width:100%; padding:.6rem .7rem; border:1px solid #e5e7eb; border-radius:.5rem; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace; }\r\n\r\n            .rgar-action.rgar-send[disabled] { background:#ecfdf5; border-color:#10b981; color:#065f46; }\r\n\r\n\r\n        <\/style>\r\n\r\n        <script>\r\n        (() => {\r\n            const wrap = document.currentScript.closest('.rgar-wrap') || document.querySelector('.rgar-wrap');\r\n            const MODE = wrap?.getAttribute('data-mode') || 'actions';\r\n            const $  = (s, c=document)=>c.querySelector(s);\r\n            const $$ = (s, c=document)=>Array.from(c.querySelectorAll(s));\r\n\r\n            const ajaxUrl  = $('#rgar-ajax')?.value;\r\n            const nonce    = $('#rgar-nonce')?.value;\r\n\r\n            const table  = $('#rgar-table');\r\n            const thead  = table?.tHead;\r\n            const tbody  = table?.querySelector('tbody');\r\n            const searchInput = $('#rgar-search');\r\n            const elFound = $('#rgar-found');\r\n\r\n            \/\/ Estado tabla\r\n            const rows = [];\r\n            const state = { sortKey:null, sortDir:'asc', search:'' };\r\n\r\n            function escapeHtml(s=''){ return s.replace(\/[&<>\"']\/g, c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#039;'}[c])); }\r\n            function trimTitle(t,max){ t=(t||'').trim().replace(\/\\s+\/g,' '); return t.length>max?t.slice(0,max-1)+'\u2026':t; }\r\n\r\n            function applyFiltersAndSort(data) {\r\n                let list = data.slice();\r\n                const q = (state.search||'').toLowerCase().trim();\r\n                if (q) {\r\n                    list = list.filter(r =>\r\n    (r.titulo||'').toLowerCase().includes(q) ||\r\n    (r.nombre||'').toLowerCase().includes(q) ||\r\n    (r.provincia||'').toLowerCase().includes(q) ||\r\n    (r.ciudad||'').toLowerCase().includes(q) ||\r\n    \/* (r.celular||'').toLowerCase().includes(q) || *\/ \/\/ Celular oculto temporalmente\r\n    (r.email||'').toLowerCase().includes(q)\r\n);\r\n\r\n                }\r\n                if (state.sortKey) {\r\n                    const key = state.sortKey, dir = state.sortDir==='asc'?1:-1;\r\n                    list.sort((a,b)=>{\r\n                        let va, vb;\r\n                        if (key==='num') { va=a._seq; vb=b._seq; }\r\n                        else if (key==='guardado'){ va=a.guardado?1:0; vb=b.guardado?1:0; }\r\n                        else { va=(a[key]||'').toString().toLowerCase(); vb=(b[key]||'').toString().toLowerCase(); }\r\n                        if (va<vb) return -1*dir;\r\n                        if (va>vb) return  1*dir;\r\n                        return 0;\r\n                    });\r\n                }\r\n                return list;\r\n            }\r\n\r\n            function renderRow(r, idx) {\r\n                const tituloFull = escapeHtml(r.titulo||'');\r\n                const guardadoBadge = r.guardado\r\n                    ? '<span class=\"rgar-badge rgar-badge--yes\">S\u00ed<\/span>'\r\n                    : '<span class=\"rgar-badge rgar-badge--no\">No<\/span>';\r\n\r\n                \/\/ 1) Sustituye la creaci\u00f3n del bot\u00f3n \"Ver\" para que sea un bot\u00f3n manejado por JS (no <a> directo)\r\nconst verBtn = (MODE==='actions' && r.url)\r\n    ? `<a class=\"rgar-action rgar-ver\" href=\"${r.url}\" data-url=\"${r.url}\" target=\"_blank\" rel=\"noopener\">Ver<\/a>`\r\n    : '';\r\n\r\n\r\n                \/\/ NUEVO: bot\u00f3n Enviar correo junto a Generar email\r\n                const acciones = (MODE==='actions')\r\n                    ? `<div class=\"rgar-actions-cell\">\r\n                           <button class=\"rgar-action rgar-gen\">Generar<\/button>\r\n                           <button class=\"rgar-action rgar-send\"${r._sent ? ' disabled' : ''}>${r._sent ? 'Enviado' : 'Enviar'}<\/button>\r\n                       <\/div>`\r\n                    : '';\r\n\r\n                const emailCell = (MODE==='actions')\r\n                    ? `<input class=\"rgar-email-input\" type=\"email\" placeholder=\"correo@ejemplo.com\" value=\"${escapeHtml(r.email||'')}\" data-pid=\"${r.pid||''}\">`\r\n                    : '';\r\n\r\n                return `\r\n                    <tr data-row='${JSON.stringify(r).replace(\/'\/g,\"&#039;\")}'>\r\n                        <td>${idx}<\/td>\r\n                        <td class=\"rgar-title\" title=\"${tituloFull}\">${escapeHtml(trimTitle(r.titulo||'', 90))}<\/td>\r\n                        <td>${escapeHtml(r.nombre||'')}<\/td>\r\n                        <td>${escapeHtml(r.provincia||'')}<\/td>\r\n                        <td>${escapeHtml(r.ciudad||'')}<\/td>\r\n                        \r\n                        <td>${guardadoBadge}<\/td>\r\n                        ${MODE==='actions' ? `<td>${emailCell}<\/td><td>${verBtn}<\/td><td>${acciones}<\/td>` : ``}\r\n                    <\/tr>\r\n                `;\r\n            }\r\n\r\n\r\n            function render() {\r\n                if (!tbody) return;\r\n                const list = applyFiltersAndSort(rows);\r\n                let html = '';\r\n                let n=1;\r\n                list.forEach(r => { html += renderRow(r, n++); });\r\n                tbody.innerHTML = html;\r\n                if (elFound) elFound.textContent = String(list.length);\r\n            }\r\n\r\n            function setSortFromTh(th){\r\n                const key = th.getAttribute('data-sort');\r\n                if (!key) return;\r\n                if (state.sortKey === key) state.sortDir = state.sortDir==='asc'?'desc':'asc';\r\n                else { state.sortKey = key; state.sortDir='asc'; }\r\n                $$('.rgar-sortable', thead).forEach(h => h.removeAttribute('data-dir'));\r\n                th.setAttribute('data-dir', state.sortDir);\r\n                render();\r\n            }\r\n            if (thead) $$('.rgar-sortable', thead).forEach(th => th.addEventListener('click',()=>setSortFromTh(th)));\r\n            if (searchInput) searchInput.addEventListener('input',()=>{ state.search = searchInput.value||''; render(); });\r\n\r\n            \/\/ Debounce helper\r\n            function debounce(fn, ms){ let t; return (...args)=>{ clearTimeout(t); t=setTimeout(()=>fn.apply(null,args), ms); }; }\r\n\r\n            \/\/ Guardado de email autom\u00e1tico\r\n            const saveEmailDebounced = debounce(async (pid, email, inputEl)=>{\r\n                try {\r\n                    const res = await fetch(ajaxUrl, {\r\n                        method:'POST',\r\n                        headers:{'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8'},\r\n                        body:new URLSearchParams({ action:'rgar_save_email', nonce:nonce, pid:String(pid||''), email:String(email||'') })\r\n                    });\r\n                    const json = await res.json();\r\n                    if (!json || !json.ok) throw new Error(json && json.error ? json.error : 'Error al guardar');\r\n                    inputEl.style.borderColor = '#10b981';\r\n                    setTimeout(()=> inputEl.style.borderColor = '#e5e7eb', 800);\r\n                } catch(err){\r\n                    inputEl.style.borderColor = '#ef4444';\r\n                    inputEl.title = 'No se pudo guardar: ' + (err.message||'');\r\n                }\r\n            }, 600);\r\n\r\n\r\n\/\/ ==== Auto-pegar email desde portapapeles al volver de \"Ver\" (robusto con reintentos) ====\r\nconst EMAIL_RE = \/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\/i;\r\nlet _lastVerPid = null;\r\n\r\nasync function tryPasteClipboardEmailForPid(pid){\r\n    if (!pid) return;\r\n\r\n    \/\/ Requisito: contexto seguro (https o localhost)\r\n    const isSecure = location.protocol === 'https:' || location.hostname === 'localhost' || location.hostname === '127.0.0.1';\r\n    if (!isSecure) { _lastVerPid = null; return; }\r\n\r\n    \/\/ Hasta 5 intentos espaciados (100ms, 250ms, 500ms, 1000ms, 1500ms)\r\n    const delays = [100, 250, 500, 1000, 1500];\r\n\r\n    try {\r\n        \/\/ Pedir permiso si es posible (no todos los navegadores lo soportan)\r\n        if (navigator.permissions?.query) {\r\n            try {\r\n                const perm = await navigator.permissions.query({ name: 'clipboard-read' });\r\n                if (perm.state === 'denied') { _lastVerPid = null; return; }\r\n            } catch(_) { \/* ignore *\/ }\r\n        }\r\n        if (!navigator.clipboard?.readText) { _lastVerPid = null; return; }\r\n\r\n        \/\/ Funci\u00f3n de intento individual\r\n        const attempt = async () => {\r\n            const txt = (await navigator.clipboard.readText())?.trim() || '';\r\n            const m = txt.match(EMAIL_RE);\r\n            if (!m) return null;\r\n            return m[0];\r\n        };\r\n\r\n        let email = null;\r\n        for (let d of delays) {\r\n            await new Promise(r => setTimeout(r, d));\r\n            try {\r\n                email = await attempt();\r\n            } catch(_) { email = null; }\r\n            if (email) break;\r\n        }\r\n\r\n        if (!email) { _lastVerPid = null; return; }\r\n\r\n        const inp = tbody.querySelector(`.rgar-email-input[data-pid=\"${pid}\"]`);\r\n        if (!inp) { _lastVerPid = null; return; }\r\n\r\n        inp.value = email;\r\n        inp.style.borderColor = '#10b981';\r\n        saveEmailDebounced(pid, email, inp);\r\n        setTimeout(()=> inp.style.borderColor = '#e5e7eb', 1000);\r\n    } finally {\r\n        _lastVerPid = null;\r\n    }\r\n}\r\n\r\n\r\n\r\n\r\n            \/\/ Helpers para leer\/actualizar el JSON incrustado en cada fila\r\n            function getRowData(tr){\r\n                try { return JSON.parse(tr.getAttribute('data-row')||'{}'); } catch(e){ return {}; }\r\n            }\r\n            function setRowData(tr, data){\r\n                tr.setAttribute('data-row', JSON.stringify(data).replace(\/'\/g,\"&#039;\"));\r\n            }\r\n\r\n\r\n            \/\/ ----- MODO ACTIONS: cargar filas desde JSON embebido y gestionar modal\/email -----\r\n            if (MODE === 'actions') {\r\n                const initEl = document.getElementById('rgar-initial-data');\r\n                let initial = [];\r\n                try { initial = JSON.parse(initEl?.textContent || '[]'); } catch(e){ initial = []; }\r\n                initial.forEach((r,i)=>{ r._seq=i+1; rows.push(r); });\r\n                render();\r\n\r\n                \/\/ Abrir anuncio y, al volver a esta pesta\u00f1a, intentar pegar el email desde el portapapeles\r\ntbody.addEventListener('click', e=>{\r\n    const a = e.target.closest('.rgar-ver');\r\n    if (!a) return;\r\n\r\n    e.preventDefault();\r\n    const tr  = a.closest('tr');\r\n    const row = getRowData(tr);\r\n    const url = a.getAttribute('data-url') || row?.url;\r\n    if (!url) return;\r\n\r\n    _lastVerPid = row?.pid || null;\r\n\r\n    \/\/ Abrimos la otra pesta\u00f1a\r\n    window.open(url, '_blank', 'noopener');\r\n\r\n    \/\/ Reintentar al recuperar foco (una sola vez)\r\n    const onFocusBack = () => {\r\n        if (_lastVerPid) tryPasteClipboardEmailForPid(_lastVerPid);\r\n        window.removeEventListener('focus', onFocusBack, true);\r\n    };\r\n    window.addEventListener('focus', onFocusBack, { capture: true, once: true });\r\n\r\n    \/\/ Fallback por si no dispara 'focus' (una sola vez)\r\n    const onVis = () => {\r\n        if (!document.hidden && _lastVerPid) tryPasteClipboardEmailForPid(_lastVerPid);\r\n        document.removeEventListener('visibilitychange', onVis, true);\r\n    };\r\n    document.addEventListener('visibilitychange', onVis, { capture: true, once: true });\r\n\r\n    \/\/ \u00daltimo fallback: por si vuelve con teclado\/gesto raro, probamos una vez a los 1.2s\r\n    setTimeout(()=> { if (_lastVerPid) tryPasteClipboardEmailForPid(_lastVerPid); }, 1200);\r\n});\r\n\r\n\r\n\r\n                \/\/ Modal\r\n                const modal = document.getElementById('rgar-modal');\r\n                const emailSubj = document.getElementById('rgar-email-subject');\r\n                const emailBody = document.getElementById('rgar-email-body');\r\n                const modalClose = $$('.rgar-modal__close, .rgar-modal__backdrop', modal);\r\n                function openModal(){ modal?.setAttribute('aria-hidden','false'); }\r\n                function closeModal(){ modal?.setAttribute('aria-hidden','true'); }\r\n                modalClose.forEach(el=> el.addEventListener('click', closeModal));\r\n                document.addEventListener('keydown', e=>{ if(e.key==='Escape') closeModal(); });\r\n\r\n                \/\/ Copiar\r\n                document.addEventListener('click', e=>{\r\n                    const b = e.target.closest('.rgar-copy');\r\n                    if (!b) return;\r\n                    const sel = b.getAttribute('data-copy');\r\n                    const el  = $(sel);\r\n                    if (!el) return;\r\n                    el.select(); document.execCommand('copy');\r\n                    b.textContent='Copiado \u2713'; setTimeout(()=> b.textContent='Copiar '+(sel.includes('subject')?'asunto':'cuerpo'),900);\r\n                });\r\n\r\n\r\n                \/\/ Delegaci\u00f3n: Generar email\r\n                tbody.addEventListener('click', async e=>{\r\n                    const btn = e.target.closest('.rgar-gen');\r\n                    if (!btn) return;\r\n                    const tr  = btn.closest('tr');\r\n                    const row = getRowData(tr);\r\n                    btn.disabled = true; btn.textContent='Generando...';\r\n                    try {\r\n                        const res = await fetch(ajaxUrl, {\r\n                            method:'POST',\r\n                            headers:{'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8'},\r\n                            body:new URLSearchParams({ action:'rgar_generate_email', nonce:nonce, row: JSON.stringify(row) })\r\n                        });\r\n                        const json = await res.json();\r\n                        if (!json || !json.ok) throw new Error(json && json.error ? json.error : 'Error desconocido');\r\n\r\n                        \/\/ Mostrar en modal\r\n                        emailSubj.value = json.subject || '';\r\n                        emailBody.value = json.body || '';\r\n                        openModal();\r\n\r\n                        \/\/ Guardar en la fila para poder enviar luego sin regenerar\r\n                        row._subject = json.subject || '';\r\n                        row._body    = json.body || '';\r\n                        setRowData(tr, row);\r\n                    } catch(err) {\r\n                        alert('No se pudo generar el email: ' + (err.message||'')); \r\n                    } finally {\r\n                        btn.disabled=false; btn.textContent='Generar email';\r\n                    }\r\n                });\r\n\r\n\r\n\r\n\r\n                \/\/ Delegaci\u00f3n: Enviar correo\r\ntbody.addEventListener('click', async e=>{\r\n    const btn = e.target.closest('.rgar-send');\r\n    if (!btn) return;\r\n\r\n    const tr   = btn.closest('tr');\r\n    const row  = getRowData(tr);\r\n    const inp  = tr.querySelector('.rgar-email-input');\r\n    const to   = (inp?.value || '').trim();\r\n    const pid  = row.pid || '';\r\n\r\n    if (!to) { alert('Introduce un email destinatario en la columna Email.'); return; }\r\n\r\n    \/\/ Asegurar asunto\/cuerpo: si no existen en la fila, generarlos primero\r\n    let subject = row._subject || '';\r\n    let body    = row._body    || '';\r\n\r\n    try {\r\n        btn.disabled = true; btn.textContent = 'Preparando...';\r\n\r\n        if (!subject || !body) {\r\n            const genRes = await fetch(ajaxUrl, {\r\n                method:'POST',\r\n                headers:{'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8'},\r\n                body:new URLSearchParams({ action:'rgar_generate_email', nonce:nonce, row: JSON.stringify(row) })\r\n            });\r\n            const genJson = await genRes.json();\r\n            if (!genJson || !genJson.ok) throw new Error(genJson && genJson.error ? genJson.error : 'No se pudo generar');\r\n\r\n            subject = genJson.subject || '';\r\n            body    = genJson.body || '';\r\n\r\n            \/\/ Persistir en la fila\r\n            row._subject = subject;\r\n            row._body    = body;\r\n            setRowData(tr, row);\r\n        }\r\n\r\n        btn.textContent = 'Enviando...';\r\n        const sendRes = await fetch(ajaxUrl, {\r\n            method:'POST',\r\n            headers:{'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8'},\r\n            body:new URLSearchParams({\r\n                action: 'rgar_send_email',\r\n                nonce,\r\n                subject,\r\n                body,\r\n                to,\r\n                pid: String(pid||'')\r\n            })\r\n        });\r\n        const sendJson = await sendRes.json();\r\n        if (!sendJson || !sendJson.ok) throw new Error(sendJson && sendJson.error ? sendJson.error : 'wp_mail fall\u00f3');\r\n\r\n        \/\/ Marcar como enviado en UI y en el row\r\n        btn.textContent = 'Enviado';\r\n        btn.disabled = true;\r\n        row._sent = true;\r\n        setRowData(tr, row);\r\n    } catch (err) {\r\n        alert('No se pudo enviar el correo: ' + (err.message || 'desconocido'));\r\n        btn.disabled = false; btn.textContent = row._sent ? 'Enviado' : 'Enviar correo';\r\n    }\r\n});\r\n\r\n\r\n\r\n                \/\/ Delegaci\u00f3n: cambio en input email -> guardar autom\u00e1tico\r\n                tbody.addEventListener('input', e=>{\r\n                    const inp = e.target.closest('.rgar-email-input');\r\n                    if (!inp) return;\r\n                    const pid = inp.getAttribute('data-pid');\r\n                    const email = inp.value.trim();\r\n                    saveEmailDebounced(pid, email, inp);\r\n                });\r\n            }\r\n\r\n            \/\/ ----- MODO COLLECT -----\r\n            if (MODE === 'collect') {\r\n                const inpStart = document.getElementById('rgar-start');\r\n                const inpEnd   = document.getElementById('rgar-end');\r\n                const btnGo    = document.getElementById('rgar-start-btn');\r\n                const btnStop  = document.getElementById('rgar-stop-btn');\r\n                const indicator= document.getElementById('rgar-indicator');\r\n                const stateText= document.getElementById('rgar-state-text');\r\n                const elProcessed = document.getElementById('rgar-processed');\r\n                const elLast      = document.getElementById('rgar-last');\r\n\r\n                let running=false, nextId=0, endId=0, processed=0;\r\n                const CONCURRENCY=4;\r\n\r\n                function setRunning(on){\r\n                    running=!!on;\r\n                    if (running){ indicator.classList.remove('rgar-red'); indicator.classList.add('rgar-green'); stateText.textContent='En marcha'; btnGo.disabled=true; btnStop.disabled=false; }\r\n                    else { indicator.classList.remove('rgar-green'); indicator.classList.add('rgar-red'); stateText.textContent='Detenido'; btnGo.disabled=false; btnStop.disabled=true; }\r\n                }\r\n\r\n                async function workerLoop(){\r\n                    while(running){\r\n                        const id = nextId;\r\n                        if (id > endId) break;\r\n                        nextId++;\r\n                        if (elLast) elLast.textContent = String(id);\r\n                        try {\r\n                            const res = await fetch(ajaxUrl, {\r\n                                method:'POST',\r\n                                headers:{'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8'},\r\n                                body:new URLSearchParams({ action:'rgar_check_and_extract', nonce:nonce, id:String(id) })\r\n                            });\r\n                            const json = await res.json();\r\n                            processed++; if (elProcessed) elProcessed.textContent = String(processed);\r\n\r\n                            \/\/ Solo se muestran NUEVOS guardados\r\n                            if (json && json.ok && json.row) {\r\n                                const r = json.row;\r\n                                if (r.guardado) {\r\n                                    r._seq = rows.length + 1;\r\n                                    rows.push(r);\r\n                                    render();\r\n                                }\r\n                            }\r\n                        } catch(e){ \/* noop *\/ }\r\n                    }\r\n                }\r\n\r\n                btnGo?.addEventListener('click',()=>{\r\n                    const s = parseInt(inpStart.value,10), e=parseInt(inpEnd.value,10);\r\n                    if (isNaN(s)||isNaN(e)||e<s){ alert('Rango inv\u00e1lido. Verifica Inicio y Fin.'); return; }\r\n                    processed=0; if (elProcessed) elProcessed.textContent='0';\r\n                    if (elLast) elLast.textContent='-';\r\n                    rows.length=0; if (tbody) tbody.innerHTML='';\r\n                    state.search=''; if (searchInput) searchInput.value='';\r\n                    if (elFound) elFound.textContent='0';\r\n                    nextId=s; endId=e; setRunning(true);\r\n                    for(let i=0;i<CONCURRENCY;i++) workerLoop();\r\n                });\r\n                btnStop?.addEventListener('click',()=> setRunning(false));\r\n            }\r\n        })();\r\n        <\/script>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"type":"","auto_type":false,"post":"","stream":"","stream_url":"","waveform_data":[],"duration":0,"bpm":0,"downloadable":false,"download_url":"","purchase_title":"","purchase_url":"","post-count-all":0,"like_count":0,"download_count":0,"editor_note":"","copyright":"","captions":[],"sources":[],"footnotes":""},"acf":[],"_links":{"self":[{"href":"https:\/\/herramientas.publican2.com\/sv\/wp-json\/wp\/v2\/pages\/732"}],"collection":[{"href":"https:\/\/herramientas.publican2.com\/sv\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/herramientas.publican2.com\/sv\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/herramientas.publican2.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/herramientas.publican2.com\/sv\/wp-json\/wp\/v2\/comments?post=732"}],"version-history":[{"count":3,"href":"https:\/\/herramientas.publican2.com\/sv\/wp-json\/wp\/v2\/pages\/732\/revisions"}],"predecessor-version":[{"id":771,"href":"https:\/\/herramientas.publican2.com\/sv\/wp-json\/wp\/v2\/pages\/732\/revisions\/771"}],"wp:attachment":[{"href":"https:\/\/herramientas.publican2.com\/sv\/wp-json\/wp\/v2\/media?parent=732"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}