// ==UserScript==
// @namespace mercado-libre-plox
// @name Mercado Libre Plox
// @name:en Mercado Libre Plox
// @description Oculta o marca productos Internacionales en Mercado Libre (Chile).
// @description:en Hide or mark international products in Mercado Libre (Chile).
// @version 0.0.1
// @author Alplox
// @match *://*.mercadolibre.cl/*
// @grant none
// @icon https://www.mercadolibre.cl/favicon.ico
// @license MIT
// @downloadURL https://raw.githubusercontent.com/Alplox/Mercado-Libre-Plox/refs/heads/main/mercado-libre-plox.user.js
// @updateURL https://raw.githubusercontent.com/Alplox/Mercado-Libre-Plox/refs/heads/main/mercado-libre-plox.meta.js
// ==/UserScript==
(function (d) {
'use strict';
// === Íconos SVG ===
const iconOcultos = ``;
const iconGrisear = ``;
// === Funciones de utilidad ===
function whenReady(selector, cb, timeout = 10000) {
const el = d.querySelector(selector);
if (el) return cb(el);
const obs = new MutationObserver((_, o) => {
const found = d.querySelector(selector);
if (found) {
o.disconnect();
cb(found);
}
});
obs.observe(d.documentElement, { childList: true, subtree: true });
setTimeout(() => obs.disconnect(), timeout);
}
whenReady('section.ui-search-results', init);
// === Función principal ===
function init() {
let modoMarcado = localStorage.getItem('ml_modo_marcado') === 'true';
// === CSS ===
const style = d.createElement('style');
style.textContent = `
.plox-item-oculto { display:none !important; }
#btnConfigPlox {
position: fixed;
bottom: 20px;
right: 20px;
z-index: 99999;
padding: 10px 14px;
background: #ffdb4d;
border: 1px solid #aaa;
border-radius: 8px;
cursor: pointer;
font-size: 14px;
font-weight: 600;
box-shadow: 0 3px 8px rgba(0,0,0,0.2);
gap: 10px;
display: flex;
align-items: center;
}
#btnConfigPlox span {
background:#000;
color:#fff;
padding:3px;
border-radius:8px;
font-size:12px;
}
.modo-actual-plox svg,
.plox-btn svg,
#btnConfigPlox svg {
margin: -5px auto;
}
#btnConfigPlox svg path {
fill:#fff;
}
#ploxConfigModal {
position: fixed;
top: 25%;
left: 50%;
transform: translateX(-50%);
background: #fff;
padding: 16px;
border: 1px solid #bbb;
border-radius: 10px;
box-shadow: 0 6px 20px rgba(0,0,0,0.25);
z-index: 100000;
width: 320px;
font-family: Arial, sans-serif;
}
#ploxConfigModal h3 { margin: 0 0 8px 0; text-align: center; font-size: 16px; }
.modo-actual-plox {
margin: 12px 0;
font-size: 14px;
text-align: center;
display:flex;
justify-content:center;
align-items:center;
gap:6px;
background: #96d5ffff;
padding: 6px;
border-radius: 6px; }
.plox-btn { display:block; width:100%; padding:8px; margin-top:8px; background:#ffdb4d; border:1px solid #888; border-radius:6px; cursor:pointer; text-align:center; }
.plox-btn:hover { background:#ffe87d; }
#modalOcultos {
position: fixed;
top: 8%;
left: 50%;
transform: translateX(-50%);
width: 100%;
max-height: 80%;
overflow-y: auto;
background: #fff;
border: 1px solid #888;
padding: 18px;
z-index: 100000;
box-shadow: 0 6px 30px rgba(0,0,0,0.3);
border-radius: 10px;
}
.descripcion-plox { font-size: 13px; text-align: center; margin-bottom: 8px; background: #f0f0f0; padding: 6px; border-radius: 6px; }
.ocultos-cerrar { float:right; cursor:pointer; font-size:16px; border:none; background:transparent; }
.ocultos-lista { list-style:none; padding:0; margin:0; display:flex; flex-wrap:wrap; gap:14px; }
.ocultos-item {
width: 200px;
border:1px solid #ddd;
border-radius:6px;
padding:10px;
box-sizing:border-box;
display:flex; flex-direction:column; align-items:center; text-align:center;
background:#fafafa;
}
.ocultos-item img { width:100%; height:120px; object-fit:contain; margin-bottom:8px; }
.ocultos-item a { font-weight:600; color:#0066c0; text-decoration:none; margin-bottom:6px; }
.ocultos-motivo { font-size:12px; color:#444; margin-bottom:6px; }
.ocultos-boton { padding:6px 8px; margin-top:6px; width:100%; cursor:pointer; border-radius:6px; border:1px solid #999; background:#fff; }
/* --- Marcar visualmente --- */
.plox-item-marcado {
background-color:#e0e0e0 !important;
opacity:0.5 !important;
transition: all 0.3s ease;
position:relative;
}
.plox-item-etiqueta {
position:absolute;
top:4px;
right:4px;
background:#000;
color:#fff;
font-size:10px;
padding:2px 5px;
border-radius:4px;
opacity:0.8;
z-index:2;
}
.plox-item-restaurado {
background:#ffeb3b !important;
border:none !important;
}
`;
d.head.appendChild(style);
// === Helpers ===
function obtenerItem(el) {
if (!el || !el.closest) return null;
// 1. Caso típico: ítems normales de resultados
let li = el.closest('li.ui-search-layout__item');
if (li) return li;
// 2. Caso: filtro "Envío desde otro país"
li = el.closest('li.ui-search-filter-highlighted-SHIPPING_ORIGIN_HIGHLIGHTED');
if (li) return li;
// 3. Caso: anuncio inferior al final del listado
let div = el.closest('#ui-search-bottom-ads__wrapper');
if (div) return div;
return null;
}
function actualizarContador() {
const btn = d.querySelector('#conteo-ocultados');
if (!btn) return;
const conteo = d.querySelectorAll('[data-plox-marcado]').length;
btn.textContent = conteo;
}
function aplicarEtiqueta(li) {
if (!li.querySelector('.plox-item-etiqueta')) {
const tag = d.createElement('div');
tag.className = 'plox-item-etiqueta';
tag.textContent = 'Marcado por Mercado Libre Plox';
li.appendChild(tag);
}
}
function estaVisible(el) {
return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);
}
function limpiarEtiqueta(li) {
li.querySelector('.plox-item-etiqueta')?.remove();
}
function aplicarModoAElemento(li) {
if (!li) return;
if (modoMarcado) {
li.setAttribute('data-plox-marcado', 'true');
li.classList.add('plox-item-marcado');
li.classList.remove('plox-item-oculto');
aplicarEtiqueta(li);
} else {
li.setAttribute('data-plox-marcado', 'false');
limpiarEtiqueta(li);
li.classList.remove('plox-item-marcado');
li.classList.add('plox-item-oculto');
}
actualizarContador();
}
function escanear() {
const selectores = [
'span.poly-component__cbt', // Internacional
'a.poly-component__ads-promotions', // Promocionado
'span.poly-component__manufacturing-time', // Llega después
'a.poly-component__purchase-options', // Opciones de compra
'.ui-search-bottom-ads__wrapper', // Anuncio inferior (Si tienes adblock, no lo verás. Pero está ahí)
'li.ui-search-filter-highlighted-SHIPPING_ORIGIN_HIGHLIGHTED' // Boton Filtro Envío desde otro país
];
selectores.forEach(selector => {
d.querySelectorAll(selector).forEach(node => {
const item = obtenerItem(node);
/* console.log('ML Plox - Encontrado:', selector, item); */
if (!item) return;
if (modoMarcado) {
aplicarModoAElemento(item);
} else {
if (estaVisible(item)) {
aplicarModoAElemento(item);
}
}
});
});
}
function actualizarTextoBoton() {
const btn = d.querySelector('#btnConfigPlox');
if (!btn) return;
const label = modoMarcado ? `Marcados ${iconGrisear}` : `Ocultos ${iconOcultos}`;
btn.querySelector('span span:last-child').innerHTML = label;
}
function crearBotonConfig() {
if (d.querySelector('#btnConfigPlox')) return;
const btn = d.createElement('button');
btn.id = 'btnConfigPlox';
btn.innerHTML = `⚙️ Mercado Libre Plox 0Marcados`;
btn.addEventListener('click', abrirConfig);
d.body.appendChild(btn);
actualizarTextoBoton();
}
function abrirConfig() {
if (d.querySelector('#ploxConfigModal')) return;
const modal = d.createElement('div');
modal.id = 'ploxConfigModal';
const titulo = d.createElement('h3');
titulo.textContent = '⚙️ Configuración Mercado Libre Plox';
const descripcion = d.createElement('div');
descripcion.className = 'descripcion-plox';
descripcion.textContent = 'Oculta: Compras Internacionales, Promocionados, Etiquetados como "Llega después" u "Opciones de compra".';
const modoActual = d.createElement('div');
modoActual.className = 'modo-actual-plox';
modoActual.id = 'active-mode';
const modoTexto = d.createElement('strong');
modoTexto.innerHTML = modoMarcado
? `Marcar (grisear) ${iconGrisear}`
: `Ocultar ${iconOcultos}`;
modoActual.innerHTML = 'Modo actual: ';
modoActual.appendChild(modoTexto);
const botonToggle = d.createElement('button');
botonToggle.id = 'ploxToggle';
botonToggle.className = 'plox-btn';
botonToggle.innerHTML = `Cambiar a: ${modoMarcado ? `Ocultar ${iconOcultos}` : `Marcar (grisear) ${iconGrisear}`}`;
botonToggle.addEventListener('click', () => {
modoMarcado = !modoMarcado;
localStorage.setItem('ml_modo_marcado', modoMarcado);
actualizarTextoBoton();
modal.querySelector('#active-mode').innerHTML = `Modo actual: ${modoMarcado ? `Marcar (grisear) ${iconGrisear}` : `Ocultar ${iconOcultos}`}`;
botonToggle.innerHTML = `Cambiar a: ${modoMarcado ? `Ocultar ${iconOcultos}` : `Marcar (grisear) ${iconGrisear}`}`;
escanear();
});
// Botón de cerrar
const botonCerrar = d.createElement('button');
botonCerrar.id = 'ploxCerrar';
botonCerrar.className = 'plox-btn';
botonCerrar.textContent = 'Cerrar';
botonCerrar.addEventListener('click', () => modal.remove());
// Añadir todo al modal
modal.appendChild(titulo);
modal.appendChild(descripcion);
modal.appendChild(modoActual);
modal.appendChild(botonToggle);
modal.appendChild(botonCerrar);
d.body.appendChild(modal);
}
// === Activación inicial ===
const observer = new MutationObserver(escanear);
const containerPrincipal = d.querySelector('section.ui-search-results');
const containerExtra1 = d.querySelector('.ui-search-bottom-ads__wrapper')?.parentNode;
const containerExtra2 = d.querySelector('li.ui-search-filter-highlighted-SHIPPING_ORIGIN_HIGHLIGHTED')?.parentNode;
if (containerPrincipal) {
observer.observe(containerPrincipal, { childList: true, subtree: true });
}
if (containerExtra1) {
observer.observe(containerExtra1, { childList: true, subtree: true });
}
if (containerExtra2) {
observer.observe(containerExtra2, { childList: true, subtree: true });
}
escanear();
actualizarContador()
crearBotonConfig();
}
})(document);