JustZix — manual de uso

Inyección de estilos CSS propios, código JavaScript y botones de acción en cualquier página

Tabla de contenidos

Concepto y conceptos clave

JustZix permite inyectar automáticamente tu propio CSS y JavaScript en páginas seleccionadas, así como definir botones de acción (atajos que ejecutan fragmentos de código bajo demanda).

Jerarquía de datos

Directorio
El nivel superior — un grupo de conjuntos para un patrón de URL. P. ej. el directorio "justzix.com" con el patrón https://justzix.com/*. Puedes habilitar/deshabilitar todo el directorio con un solo clic.
Grupo
Un nivel intermedio entre el directorio y los conjuntos — ayuda a organizar proyectos más grandes (p. ej. "Admin", "Frontend", "QA"). Cada directorio tiene como mínimo un grupo. El grupo tiene su propio interruptor con cascada hacia los conjuntos activos.
Conjunto
Una modificación individual: un fragmento de CSS, un fragmento de JS, más una lista de botones de acción y, opcionalmente, patrones de URL propios que lo limitan a subpáginas concretas. Cada conjunto pertenece a un grupo.
CSS
Estilos aplicados al instante — los cambios se ven inmediatamente tras guardar, sin recargar la página.
JavaScript
Código ejecutado una vez en cada carga de una página que coincida con el patrón. Requiere recargar la página para volver a ejecutarse.
Botones de acción
Ejecutan JavaScript solo al hacer clic, en una barra flotante. Perfectos para herramientas de diagnóstico y operaciones frecuentes.

Patrones de URL a nivel de conjunto y de grupo

Cada conjunto y cada grupo puede tener su propia lista de patrones de URL adicionales (chip-input). Cuando la lista está vacía, el elemento funciona en todos los lugares donde coincida el patrón del directorio. Cuando estableces, por ejemplo, https://justzix.com/admin/*, el elemento solo funcionará en las subpáginas del admin.

Patrón del directorioPatrones del conjuntoFuncionará en
https://justzix.com/*(vacío)todo el dominio justzix.com
https://justzix.com/*https://justzix.com/admin/*solo la sección /admin/
https://justzix.com/*https://justzix.com/produkty/*
https://justzix.com/koszyk
solo las subpáginas de productos + carrito
*://localhost:*/**://localhost:3000/*solo el puerto 3000 (dev)
Los patrones de URL por regla son un filtro adicional — no sustituyen al patrón del directorio. La regla se activa solo cuando la URL coincide con ambos: el patrón del directorio y al menos uno de los patrones del conjunto (si los hay).

Tutorial — introducción interactiva

Para los usuarios nuevos, JustZix incluye un tutorial interactivo que te guía paso a paso en la creación de una solución completa — desde una carpeta, pasando por un grupo y un conjunto de reglas, hasta el código CSS/JS y un botón de acción. Las indicaciones aparecen como globos junto a los sucesivos elementos del panel.

Cómo iniciarlo:

En la ventana «Centro de tutoriales» eliges un tutorial y haces clic en Empezar. Durante el tutorial:

Interfaz y navegación

Modo de edición

Acceso mediante clic derecho sobre el icono de la extensión → "Opciones", o clic sobre el icono → botón "Panel de edición".

Botón flotante (en páginas que coinciden)

Un pequeño botón circular aparece automáticamente en las páginas que coinciden con cualquier directorio. Por defecto muestra el texto ZIX, pero cada directorio puede tener su propia etiqueta.

Etiqueta del directorio: en la barra del directorio, en el extremo izquierdo (junto al selector de color) hay un campo de texto para la etiqueta del botón. Límites impuestos: máx. 3 caracteres, siempre en MAYÚSCULAS (la conversión a mayúsculas ocurre al instante mientras escribes). El campo acepta letras y cifras — ejemplos: ZIX, QA, DEV, ADM, X. Cuando varios directorios coinciden, se toma la etiqueta del primero que la tenga definida; los demás se ignoran (campo vacío = se recurre a ZIX).

Estado por color (paleta de marca):

Color del directorio: si en el directorio defines el selector de color, el botón flotante en las páginas que coinciden adoptará ese color. Los estados "mixed" y "off" modulan automáticamente la saturación. Cuando varios directorios coinciden, se toma el color del primero que lo tenga definido.

Panel

Al entrar en el panel de edición la extensión abre el Panel — la página principal con un resumen de la biblioteca y atajos rápidos. Antes el panel seleccionaba automáticamente el primer directorio de la lista; ahora, en su lugar, ves una vista general.

El Panel es accesible mediante el clic en el logotipo del sidebar y mediante el icono de „casa" en la barra de breadcrumb de cada editor (directorio, grupo, conjunto). La propia cabecera del Panel también tiene un icono de „casa" — al hacer clic en él se actualizan los datos (se recarga la biblioteca desde el storage y se vuelve a renderizar el Panel).

El Panel tiene un diseño con filas fijas de tarjetas:

Las tarjetas „Últimos ejemplos" y „Del blog" obtienen su contenido de la página del proyecto; cuando el endpoint no está disponible (p. ej. sin conexión), ambas tarjetas se ocultan. La versión de la extensión se comprueba de nuevo cada vez que se entra en el panel.

El panel izquierdo en modo de edición muestra los directorios en jerarquía — puedes desplegar cada directorio para ver sus conjuntos y pasar a editar uno concreto.

Navegación

ElementoAcción
Flecha de despliegueDespliega/contrae la lista de conjuntos o grupos (recordado entre sesiones)
Clic sobre el nombre de un directorio (contraído)Selecciona el directorio, abre el Folder editor y despliega sus grupos/conjuntos
Clic sobre un directorio ya seleccionadoToggle: lo contrae (el siguiente clic lo vuelve a desplegar) — análogamente para el grupo
Clic sobre el nombre de un grupo (contraído)Selecciona el grupo, abre el Group editor y despliega sus conjuntos
Clic sobre el nombre de un conjuntoAbre la vista del conjunto individual (Rule editor)
Checkbox junto al directorioHabilita/deshabilita todo el directorio (cascada hacia los grupos y sus conjuntos activos)
Checkbox junto al grupoHabilita/deshabilita el grupo (cascada hacia sus conjuntos activos)
Checkbox junto al conjuntoControla de forma independiente un único conjunto
Estado ●/○ junto al directorio/grupo/conjuntoActivo: ● activo, ○ inactivo (forzado a deshabilitado)
C J A U junto al conjuntoEtiquetas de contenido: C = tiene CSS, J = tiene JavaScript, A = tiene acciones, U = tiene patrones de URL propios. Aparecen solo cuando el campo correspondiente no está vacío.
Barra de color a la izquierdaEl color del directorio se dibuja mediante box-shadow inset — no desplaza la posición del nombre de la carpeta (las carpetas con color y sin color quedan alineadas)
Asa de drag&dropSujétala con el ratón y arrastra para cambiar el orden
Estado por defecto tras una instalación nueva: todos los directorios y grupos están contraídos. El primer clic los despliega, el siguiente clic sobre el mismo elemento los contrae. El estado de despliegue se recuerda entre sesiones (storage expandedFolders, expandedGroups).

Cambio de orden (drag & drop)

Pasa el cursor sobre un directorio, grupo o conjunto — a la izquierda aparecerá el asa de drag&drop. Sujétala con el ratón y arrastra:

Directorios

Grupos

Conjuntos

El drag & drop respeta la selección — si arrastras entre directorios el conjunto seleccionado actualmente, la selección lo sigue y el directorio de destino se despliega automáticamente.
Cuando ves un conjunto individual, en la parte superior del editor aparece una barra con el enlace "Mostrar todos en el directorio" para volver rápidamente a la vista del directorio completo.

Toggle del sidebar

La barra vertical entre el sidebar y el editor oculta el panel izquierdo — útil cuando necesitas más espacio para el editor. El estado se recuerda entre sesiones. Tras mostrar/ocultar, CodeMirror actualiza automáticamente su anchura.

Redimensionar los editores

Bajo cada editor (CSS, JS, código de acción) hay una barra horizontal con un asa para arrastrar en vertical. Sujétala con el ratón y arrastra hacia abajo para ampliar el editor. Altura mín. 80px, máx. ilimitada — la página se desplaza de forma natural con el contenido.

Sobre cada editor de código CodeMirror — CSS y JavaScript en la tarjeta del conjunto, así como "Código JS" en el editor de acciones — hay una barra de búsqueda: un campo de texto y un botón con icono de lupa.

Atajos

AtajoAcción
EnterBuscar (nueva consulta) o ir al siguiente resultado (cuando la consulta no ha cambiado)
Shift+EnterResultado anterior
Ctrl+Alt+→ / Ctrl+Alt+←Resultado siguiente / anterior — funciona desde el editor y desde el campo de búsqueda
Ctrl+Alt+FDesde el editor de código, pasa el foco al campo de búsqueda
EscBorra el campo de búsqueda

Patrones de URL

El patrón de URL define en qué páginas se activa el directorio.

PatrónCoincide con
https://justzix.com/adminSolo esa URL exacta
https://justzix.com/*Todas las páginas de justzix.com
https://*.justzix.com/*Todos los subdominios y páginas
*://localhost:*/*Todas las aplicaciones locales
https://example.com/admin/*Solo la sección /admin/ y sus subpáginas
*example*Cualquier URL que contenga "example"
Consejo: la coincidencia ignora el query string (?id=123) y el hash (#section), salvo que los incluyas en el patrón.

Estados de los conjuntos (Activo / Habilitado)

Cada conjunto tiene dos flags independientes:

FlagSignificado
ActivoIndica si este conjunto está controlado por el interruptor del directorio y del grupo (ambos niveles cascadean hacia las active rules). Habilitar el directorio o el grupo habilita todos los conjuntos activos que contiene.
HabilitadoEl estado actual: si el conjunto está ahora inyectado en las páginas.

Cascada de interruptores

Toggle del directorio  →  cambia enabled de todas las active rules de sus grupos
Toggle del grupo       →  cambia enabled de todas las active rules de ese grupo
Toggle del conjunto    →  cambia solo enabled de ese conjunto

Las reglas con Activo: NO (badge ○) se omiten en las cascadas — las controlas solo manualmente, con independencia del estado de la carpeta y del grupo.

Ejemplos prácticos

Conjunto siempre manual

Activo: NO • Habilitado: controlado manualmente

El conjunto no reacciona a la habilitación de todo el directorio. Lo controlas solo manualmente. Ideal para modificaciones experimentales que no quieres habilitar de forma masiva.

Conjunto siempre habilitado con el directorio

Activo: SÍ • Habilitado: SÍ

Ajuste estándar. Habilitar/deshabilitar el directorio controla también este conjunto.

Conjunto deshabilitado temporalmente

Activo: SÍ • Habilitado: NO

El conjunto está "conectado" al directorio, pero deshabilitado por el momento. El próximo clic en el interruptor principal del directorio volverá a activarlo.

Botón flotante y panel

AcciónEfecto
Clic izquierdoToggle de todos los directorios que coinciden (habilitar/deshabilitar)
Clic derechoAbre un panel con la lista de directorios y conjuntos
ArrastreCambio de posición (recordado por ventana)

En el panel desplegable (clic derecho) puedes:

El panel muestra solo los conjuntos activos (●) — los independientes (○) se ocultan por concisión. Cuando la carpeta tiene un único grupo llamado "Predeterminado", la cabecera del grupo se omite — se ven solo los conjuntos.

Ocultar el botón flotante para una página: en el widget del popup de la extensión — haz clic en el icono de JustZix junto a la dirección y pulsa el icono "eye-off" junto al nombre del directorio. La restauración se hace con el enlace "Restaurar botón flotante" del mismo sitio.

Hacer clic en el icono de JustZix en la barra de extensiones de Chrome abre el widget del popup — un panel de control compacto para la pestaña actual. De arriba abajo:

Barras de acciones (ActionBars)

En un mismo workspace puedes tener varias barras de acciones — cada una con su propio nombre, orientación, color de fondo, su propio conjunto de botones y una posición independiente por ventana del navegador. La barra puede asignarse a una carpeta, un grupo o un conjunto individual (lo cual decide la visibilidad y la cascada).

Creación y edición de una barra

En el editor del directorio, del grupo o del conjunto hay un botón "Barras de acciones (N)". El clic abre el modal de gestión de barras. En el modal:

Visibilidad heredada hacia abajo

Asignación de una acción a una barra

Cada acción de la pestaña "Acciones" de la tarjeta del conjunto tiene un dropdown "Barra de acciones" — eliges la barra de destino de la lista de las visibles para ese conjunto (barras propias del conjunto + barras del grupo + barras de la carpeta).

Pegado de barras (snap & connect)

Durante el arrastre de una barra, la extensión detecta los bordes de barras adyacentes y del botón flotante a una distancia ≤ 12 px. Aparece un indicador visual de adherencia y, al soltar, las barras se unen en un grupo de conexiones. A continuación:

Clic derecho sobre el asa de arrastre de la barra → menú contextual:

En el modo de edición de la barra este menú queda silenciado; el clic derecho sobre la etiqueta ofrece entonces la opción "Eliminar etiqueta".

Mostrar/ocultar barras — desde 3 lugares

Para habilitar/deshabilitar de forma permanente las barras de acciones (sin F5), la extensión ofrece tres puntos de entrada, todos mapeados al mismo actionBar.enabled en storage — un cambio desde un lugar se propaga al panel de edición y al resto de UIs:

  1. Floating panel (clic derecho sobre el botón flotante principal de JustZix) — la sección "Barras de acciones" bajo la lista de carpetas/grupos/conjuntos. Un checkbox por barra muestra el estado persistente. Clic → toggle de actionBar.enabled.
  2. Widget del popup (clic en el icono de la extensión junto a la dirección) — la sección "Barras de acciones" bajo la lista de carpetas. Además, por carpeta, un pequeño icono "eye-off" — oculta el botón flotante para la página actual (la restauración se hace con el enlace "Restaurar botón flotante").
  3. chrome.contextMenus (clic derecho en la página → JustZix → Barras de acciones) — un submenú dinámico con un checkbox por barra. La lista se reconstruye por pestaña activa y con cada cambio de estado.
Ocultación persistente vs runtime:
Las posiciones de todas las barras (y del botón flotante) se guardan por ventana del navegador en la memoria de sesión. Cada ventana tiene sus posiciones, con independencia de las demás. Se resetean al cerrar la ventana o al reiniciar Chrome.

Modo de edición de la barra — disposición libre

El modo de edición de la barra de acciones se activa de tres maneras: con el atajo Ctrl+Alt+S (funciona desde cualquier lugar de la página), con el interruptor del widget del popup de la extensión, y desde el menú contextual de Chrome (clic derecho → "Modo de edición de la barra de acciones"). En la parte superior de la pantalla aparece una barra informativa; volver a usar cualquiera de los interruptores sale del modo.

En el modo de edición, el funcionamiento normal de los elementos queda suspendido (el clic no ejecuta código, los campos no aceptan el foco) — en su lugar, los elementos se pueden distribuir y escalar:

El modo de edición es "duro": al mover y redimensionar, los elementos se ajustan a una cuadrícula de 8 px, no se puede sacar un elemento fuera de la barra ni colocarlo sobre otro — en caso de colisión, ambos elementos (el que se mueve y el de debajo) reciben un marco rojo y, al soltar, el elemento vuelve a su posición anterior. La barra no se puede reducir de modo que un elemento quede fuera; cuando un nuevo elemento o etiqueta no cabe en la barra, el lienzo de la barra se amplía automáticamente. El clic derecho sobre la barra en modo de edición no muestra el menú "ocultar/desconectar barra".

Modos de disposición de la barra: la barra arranca en modo flow (flexbox clásico — elementos uno tras otro, en vertical u horizontal). El primer movimiento o reescalado de un elemento convierte la barra al modo custom (un lienzo con posicionamiento libre) — sin cambios visuales, ya que la disposición actual se captura como punto de partida.

Las posiciones y tamaños en modo custom (bar.layoutMode, bar.size, action.layout, action.size) se guardan de forma permanente y se sincronizan entre dispositivos — a diferencia de la posición "flotante" de la barra en la página, que permanece por ventana del navegador.

Tipos de acción: BUTTON / SELECT / INPUT / SLIDER / TEXTAREA / TOGGLE3

Cada acción tiene un tipo — se elige con un dropdown al principio de cada acción en la tarjeta del conjunto. Hay disponibles 6 tipos:

TipoUICuándo ejecuta el código
BUTTONBotón clicable con una etiqueta de máx. 6 caracteresclic del usuario
SELECT staticDropdown personalizado con el estilo de la barra — las opciones se configuran en un modalselección de opción (value = option.value)
SELECT jsUn <select> nativo — tu código rellena las opciones y conecta el handlerUNA VEZ al renderizar ($el = <select>)
INPUTCampo de texto con placeholder (una sola línea)change (Enter o blur)
SLIDERDeslizador <input type="range"> con label + visualización del valorchange (soltar el ratón / Enter), value = número
TEXTAREACampo multilínea — Enter es un salto de línea legítimo (NO ejecuta el código)change (blur — salir del campo)
TOGGLE3Control segmentado de 3 estados (tipo radio) — 3 mini-botones, uno activoclic sobre un estado inactivo, value = state.value del activo, más stateIdx y stateLabel en el scope

Las etiquetas de texto estáticas no son un tipo de acción — se añaden directamente en la barra en modo de edición (consulta "Modo de edición de la barra" → etiquetas).

Campos comunes

SELECT — modal de opciones

El clic en "Opciones (N)" en la tarjeta de una acción de tipo SELECT abre un modal:

INPUT — modal de configuración

SLIDER — modal de configuración

TEXTAREA — modal de configuración

TOGGLE3 — modal de configuración

Memoria persistente (SELECT, INPUT, SLIDER, TEXTAREA, TOGGLE3)

La selección / valor / posición del deslizador / contenido del textarea / estado activo del toggle3 se recuerdan automáticamente por acción. Tras F5 el valor vuelve; tras cerrar la pestaña y volver a abrirla (en una página que coincida con la regla) también. Singleton por action.id — un valor independiente de la URL concreta.

Formato del valor en la memoria según el tipo:

Storage:

Sin sincronización cross-device: la memoria permanece en local. Dos ordenadores pueden tener valores distintos (p. ej. un filtro distinto por usuario).

Seguridad: sessionStorage es legible por los scripts de la página (mismo origin). Para datos sensibles no uses INPUT — en su lugar, escribe el valor directamente en el campo "Código JS" del conjunto.

ID estable de la acción

Cada acción tiene un action.id inmutable (formato a_<base36>_<random>). En la tarjeta del conjunto, junto a cada acción hay un badge con el número de fila — el clic copia el ID completo al portapapeles, el tooltip muestra el ID completo.

En el user-JS, refiérete a ella mediante data-jz-action-id:

const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');
el.value = 'nuevo valor';
el.dispatchEvent(new Event('change'));

O mediante los helpers window.JZ — consulta Invocación programática de acciones desde JS.

Clic derecho en cualquier página → JustZix:

Los submenús de ventanas se reconstruyen en: tabs.onActivated, tabs.onUpdated (cambio de URL), y storage.onChanged para folders/groups/rules/actionBars/cssPanes/jsPanes/jsConsoles/outputConsoles/floatingHidden. El submenú TEMP es estático (siempre 4 elementos).

Ventanas en el frontend (CSS / JS / Consolas)

La extensión ofrece cuatro tipos de ventanas flotantes inyectadas en las páginas, junto a las barras de acciones. Cada ventana está asignada a una carpeta, grupo o conjunto (hereda la visibilidad en cascada, igual que las barras de acciones) y aparece en las páginas que coinciden por URL.

Gestión: en el editor de la carpeta / grupo / conjunto encontrarás un botón "Ventanas ▾ (N)". El clic despliega un menú con los 4 tipos — eliges el tipo y se abre un modal con la lista de ventanas de ese nivel (más las ventanas heredadas de niveles superiores). Las añades, nombras, coloreas, eliminas.

TipoColorPara qué
CSS paneverdeUn textarea de CSS inyectado en vivo como <style>
JS paneámbarUn textarea de JS ejecutado al cambiar el código
JS ConsolemoradoREPL — escribes código, Ctrl+Enter lo ejecuta, el output aparece debajo
Output ConsoleesmeraldaVista de solo lectura de los logs de la página (console.* + errores)

CSS pane

Una ventana flotante con un campo de texto para CSS. Cada cambio (tras una breve pausa) actualiza el <style> inyectado — ves el efecto en vivo. El contenido se recuerda por pestaña del navegador (sobrevive a F5, desaparece al cerrar la pestaña). Ideal para probar CSS rápidamente sin guardarlo en una regla.

JS pane

Un campo de texto para JavaScript ejecutado en el contexto de la página. El código se ejecuta tras un cambio (con retardo) o manualmente con el botón ▶ Run / el atajo Ctrl+Enter. Los errores de ejecución aparecen en una barra roja bajo el código. Cuando el código se ha modificado desde la última ejecución, el botón Run se ilumina en amarillo (estado "dirty").

JS Console (REPL)

Una consola completa dentro de la página. Escribes código en el campo inferior, Ctrl+Enter (o ▶) lo ejecuta, el resultado se añade al área de logs superior. Funciones:

El input, el output y el historial se recuerdan por pestaña. La consola ejecuta el código en el MAIN world de la página — tienes acceso a todas las variables y funciones de la página.

Output Console

Una vista de solo lectura de los logs — captura automáticamente todo lo que ocurre en la página: console.log/warn/error/info/debug, excepciones no capturadas, Promise rejections no manejadas, el tráfico de red y los push a dataLayer, así como tu propio logger window.JUSTZIX.*. A diferencia de la JS Console (donde tú mismo escribes el código), aquí los logs fluyen solos.

Seis pestañas con contadores

La ventana se divide en 6 pestañas, cada una con un contador de entradas (badge):

PestañaContenido
AllTodas las entradas de todas las fuentes, en orden cronológico
JZconsoleSolo tu logger window.JUSTZIX.*
ConsoleSolo los console.log/info/warn/error/debug estándar de la página
NetworkPeticiones de red de la página (mediante chrome.webRequest)
ErrorsExcepciones no capturadas y Promise rejections — con detalles desplegables
DataLayerPush a window.dataLayer (GTM) + vista en vivo del objeto

Barra de filtros contextuales

Entre las pestañas y el campo de búsqueda hay una barra de filtros que cambia según la pestaña seleccionada:

Buscador

Bajo la barra de filtros hay un campo de búsqueda siempre visible. Filtra en vivo las entradas de la pestaña activa (coincidencia de fragmento, sin distinguir mayúsculas). Esc limpia el campo.

Logs de consola — desplegables como en DevTools

Las entradas console.* aparecen por defecto contraídas — muestran una vista previa abreviada (p. ej. [PickupMap][2026-05-16T15:25Z] AUTO_SELECTION_SKIPPED: {reason: 'Lower priority source', …}). El clic despliega los argumentos completos (objetos/arrays como un árbol JSON desplegable), análogamente a la consola de DevTools.

Pestaña Network

Network captura las peticiones mediante chrome.webRequest (permiso webRequest en el manifest). Cada entrada muestra, entre otras cosas, el método, la URL, el estado, el tipo de recurso, el tamaño, la duración, la dirección remota (Remote address) y el iniciador (Initiator). El búfer de peticiones se mantiene en segundo plano, por lo que las entradas anteriores a la apertura de la ventana también aparecen.

Pestaña DataLayer

La ventana DataLayer se divide en dos columnas:

Los clics en la propia interfaz de JustZix (desplegar nodos del árbol, botones de la ventana) no llegan a esta pestaña. Si la página recopilara eventos click (p. ej. GTM auto-event), un clic en la ventana generaría un push a dataLayer y restablecería el despliegue del árbol — la extensión reconoce esos push y no los reporta (el window.dataLayer real de la página permanece intacto).

Logger propio — window.JUSTZIX

La Output Console expone una API global para registrar desde tu código (JS pane, acciones, código de la página):

JUSTZIX.log('log normal');
JUSTZIX.warn('advertencia');
JUSTZIX.error(new Error('error'));   // mostrará el stack trace
JUSTZIX.info({ obj: 1, arr: [2,3] });
JUSTZIX.debug('detalles');           // oculto por defecto (filtro)

Alias disponibles:

Tras aparecer la Output Console verás en el log una línea de bienvenida que indica qué alias está disponible en esa página.

Qué se captura

Los errores de las peticiones fetch/XHR no llegan a la pestaña Errors (no son excepciones JS) — los encontrarás en la pestaña Network por el estado 4xx/5xx. No capturamos las violaciones de CSP ni las advertencias internas de Chrome.

Ayuda rápida — Ctrl+Shift+H

Ctrl+Shift+H abre una ventana desplazable de ayuda rápida — una guía para usar JustZix en la página: atajos globales, atajos dentro de las ventanas, la Consola Output, manejo de las ventanas con el ratón, el modo edición de barra y el registro en la Consola Output. Funciona en cualquier página. Arrastras la ventana por la cabecera; Esc / clic fuera / × / volver a pulsar Ctrl+Shift+H la cierra.

Personalización del aspecto de la ventana

Colores: en el modal de gestión (panel de edición) cada ventana tiene un selector de color — el punto de la cabecera, el fondo y el texto de la cabecera, el fondo y el texto del body, el color de los botones de acción.

Fuente y tamaño: clic derecho sobre la barra de cabecera de la ventana → un menú con selección de fuente (Consolas, Menlo, Monaco, Courier New y otras monospace) y de tamaño (10–24 px).

Arrastrar, adherir y conectar

Cada ventana se arrastra por la barra de cabecera. Al acercar un borde a otra ventana / barra de acciones / botón flotante (≤ 12 px) aparece una atracción magnética — las ventanas se pegan formando un grupo. Arrastrar un grupo pegado mueve todos los elementos juntos. Las posiciones se recuerdan por ventana del navegador.

Redimensionar la ventana

Cada ventana tiene 8 asas de redimensionado: 4 en las esquinas (cambio de anchura y altura a la vez) y 4 en los bordes (cambio de un solo eje). El asa arrastrada mantiene el borde opuesto en su sitio. Rango: anchura 180–1200 px, altura 120–900 px. El nuevo tamaño (pane.size) se guarda — para las ventanas permanentes se sincroniza entre dispositivos, para las ventanas TEMP por pestaña.

Desplazamiento dentro de la ventana

El desplazamiento con la rueda del ratón dentro de una ventana desplaza únicamente el contenido de esa ventana — la página de debajo no se desplaza. Esto también se aplica cuando el área de la ventana llega al final del desplazamiento o cuando el cursor está sobre una parte no desplazable (la cabecera, la barra de filtro).

Clic derecho sobre la cabecera de la ventana

Botón de cerrar y doble clic en la cabecera

Cada ventana (tanto temporal TEMP como persistente) tiene un botón × de cerrar en la esquina derecha de la cabecera. Las TEMP se ocultan (reábrelas desde el menú contextual de la página o con un atajo), las persistentes — se desactivan (reactívalas con la casilla en el popup). Doble clic en la barra de la cabecera:

Pegado y resaltado del borde

Cuando el borde de una ventana se acerca a otra ventana de JustZix (umbral de 12 px), aparece un borde rojo en el lado del pegado (en ambas ventanas). Soltar el cursor en esta posición ejecuta el snap — las ventanas se mueven después como grupo. Todas las ventanas de la extensión participan en este mecanismo: barras de acciones, FAB, paneles persistentes (CSS/JS/Console/Output), TEMP y el AI Helper.

Paneles TEMP — ventanas temporales

Puedes crear una ventana temporal en cualquier página — incluso una para la que no tengas ninguna carpeta. Los paneles TEMP son una herramienta rápida ad-hoc: pruebas CSS/JS en una página ajena sin configurar reglas.

Características de los paneles TEMP:

Creación / cierre (toggle):

AI Helper — asistente de IA

AI Helper es un asistente de IA integrado en la extensión que ayuda a preparar e implementar una solución CSS/JS para una tarea concreta en la página actual. El modelo puede examinar la página, probar código en vivo en ventanas TEMP y — tras tu aceptación — crear un directorio, grupo y conjunto listos para usar.

Configuración de las claves API

En el menú Ajustes del sidebar, el elemento "AI Helper" abre un modal de configuración:

Seguridad de las claves: las claves API se almacenan por defecto exclusivamente en la memoria local de este dispositivo (chrome.storage.local). La clave llega a otros dispositivos solo cuando marcas su checkbox "sincronizar" — entonces se sincroniza mediante la nube de JustZix (el mismo canal por el que la extensión sincroniza carpetas, grupos y conjuntos). Las claves sin marcar nunca salen del dispositivo. Las llamadas a la API van a través del service worker de la extensión, de modo que la clave no llega al contexto de la página.

Ventana del chat

La ventana de AI Helper es una ventana flotante (por pestaña, como las ventanas TEMP — arrastrable, escalable con 8 asas, con cruz de cierre, una sola instancia). La abres / cierras:

En la ventana: selección del proveedor (cuando tienes más de una clave) y del modelo (lista obtenida en vivo), el historial de la conversación, un botón para limpiar la conversación y un campo de texto (se envía con el botón o con Ctrl+Enter). El modelo recibe automáticamente el contexto de la página actual — URL, título y un fragmento del HTML.

Workflow agéntico

AI Helper conduce la conversación según un workflow establecido:

  1. Pregunta por los detalles — alcance de la URL, nombres de carpeta/grupo/conjunto, colores, el objetivo exacto.
  2. Examina la página con la herramienta query_page (selectores, estructura del DOM) antes de escribir el código.
  3. Inserta el código CSS/JS preparado en una ventana temporal TEMP, que ves en vivo en la página.
  4. Verifica los errores por sí mismo — con las herramientas read_temp_pane y read_console comprueba que el código probado no reporte errores antes de mostrarte el resultado.
  5. Pide que compruebes el efecto y pregunta explícitamente si la prueba ha salido bien.
  6. Cuando la prueba no ha salido — corrige el código y vuelve a probarlo.
  7. Solo tras tu confirmación consolida la solución: crea el directorio → el grupo → el conjunto y, si es necesario, también una barra de acciones y acciones. Cada creación de una entidad requiere una confirmación aparte en la extensión.

El modelo usa las herramientas mediante un protocolo de texto simple (un bloque @@JZ_TOOL@@ … @@END@@) que funciona de forma idéntica para OpenAI, Anthropic y Gemini. Las llamadas a las herramientas y sus resultados aparecen en la ventana como "chips" aparte. Herramientas disponibles:

HerramientaAcción
query_pageDevuelve el número de coincidencias del selector y el HTML de hasta 5 elementos
list_structureDevuelve los directorios / grupos / conjuntos existentes junto con sus id
open_temp_paneAbre una ventana temporal TEMP (CSS o JS)
set_temp_pane_codeInserta código en una ventana TEMP — sirve para pruebas en vivo
read_temp_paneVerifica la ventana TEMP — para JS ejecuta el código y devuelve error o éxito
read_consoleAbre una ventana TEMP Output Console y devuelve las entradas de console capturadas de la página
create_folderCrea una carpeta + un grupo por defecto (requiere confirmación)
create_groupCrea un grupo en una carpeta (requiere confirmación)
create_ruleCrea un conjunto con código CSS/JS (requiere confirmación)
create_barCrea una barra de acciones asociada a una carpeta/grupo/conjunto (requiere confirmación)
create_actionCrea una acción (button/select/input/slider/textarea/toggle3) en una barra (requiere confirmación)
request_user_inputMuestra al usuario un formulario en línea en la ventana de chat (campos de texto / número / color / select / casilla) y espera la respuesta
list_bars / list_actions / list_panes / list_allDevuelven listas de barras de acciones / acciones / ventanas (CSS/JS/Console/Output) existentes — opcionalmente filtradas por padre
read_folder / read_group / read_rule / read_bar / read_actionDevuelven los datos completos de una entidad específica (antes de un cambio planeado)
update_folder / update_group / update_rule / update_bar / update_actionModifican una entidad existente — requiere confirmación (con un diff de campos)
create_css_pane / create_js_pane / create_js_console / create_output_consoleCrean una ventana persistente en la página (requiere confirmación)
read_*_pane / read_*_console + update_*_pane / update_*_consoleLectura y modificación de los metadatos de las ventanas persistentes (nombre, color, posición, tamaño, estilo)
read_pane_code / update_pane_codeLectura e inserción del código CSS/JS en una ventana persistente (por pestaña del navegador) — requiere confirmación
screenshot_pageCaptura de la vista actual de la página como imagen — la interfaz de JustZix se oculta automáticamente; para modelos compatibles con visión
AI Helper puede crear, leer y modificar toda la estructura de la extensión (carpetas / grupos / conjuntos / barras / acciones / ventanas persistentes), verificar por sí mismo los errores del código probado (read_temp_pane + read_console), pedirte datos mediante un formulario en línea (request_user_input) y hacer capturas de la página (screenshot_page) como imágenes adjuntas a la siguiente solicitud.

Apariencia de la ventana de AI Helper

Un clic derecho sobre la barra del encabezado de la ventana de AI Helper abre un menú con las opciones «Traer al frente» / «Enviar al fondo» (cambiar el orden de las ventanas JustZix cuando se superponen), «Desconectar de: X» (cuando AI Helper está pegado a otra ventana) y «Apariencia…». El panel «Apariencia…» permite estilizar por separado cuatro roles en la conversación: tus mensajes, respuestas de la IA, resultados de herramientas, formularios en línea — cada uno con su propia fuente, tamaño, color de texto y de fondo. Los valores se guardan por dispositivo.

Pegado con otras ventanas y orden (Z-order)

La ventana de AI Helper participa del mismo mecanismo de pegado que las barras de acciones, las ventanas persistentes (CSS / JS / Console / Output) y las ventanas TEMP. Arrastrar un borde cerca de otra ventana de JustZix (umbral de 12 px) → atracción magnética, un borde rojo indica el lado del pegado en ambas ventanas. Las ventanas pegadas se mueven como grupo.

Cuando las ventanas se solapan, las opciones «Traer al frente» / «Enviar al fondo» en el menú contextual de cada ventana (clic derecho en el encabezado) hacen un salto único — la ventana pasa por encima / por debajo de todos los vecinos que se solapan, sin necesidad de hacer clic varias veces.

Captura de la página (para modelos con visión)

La herramienta screenshot_page captura la vista actual de la página y la envía al modelo como imagen. Toda la interfaz de JustZix se oculta automáticamente antes de la captura (FAB, barras de acciones, AI Helper, paneles persistentes, TEMP). Un búfer de las 3 capturas más recientes, adjuntadas una sola vez a la siguiente solicitud (tras enviar — eliminadas del búfer, para ahorrar tokens). Requiere un modelo compatible con visión (p. ej. gpt-4o, claude-3+/4, gemini-1.5+/2). Debajo del chip de resultado en el chat aparece una miniatura — un clic abre la vista a pantalla completa.

Atajos de teclado

Globales (funcionan desde cualquier lugar de la página)

AtajoAcción
Ctrl+Alt+GCrear / cerrar TEMP CSS pane
Ctrl+Alt+HCrear / cerrar TEMP JS pane
Ctrl+Alt+JCrear / cerrar TEMP JS Console
Ctrl+Alt+KCrear / cerrar TEMP Output Console
Ctrl+Alt+IAbrir el panel de edición (ventana separada), primer conjunto activo en esta página, pestaña CSS
Ctrl+Alt+OComo arriba, pestaña JS
Ctrl+Alt+PComo arriba, pestaña Acciones
Ctrl+Alt+\Abrir / cerrar la ventana de AI Helper
Ctrl+Alt+SModo de edición de la barra de acciones — habilitar / deshabilitar
Ctrl+ZDeshacer el último cambio (solo en modo de edición de la barra)
DeleteEliminar las etiquetas seleccionadas (solo en modo de edición de la barra)
EscDeseleccionar todos los elementos (solo en modo de edición de la barra)
Ctrl+Shift+LLimpiar la pestaña activa de cada Output Console
Ctrl+Shift+HAyuda rápida — atajos y ventanas en la página (en todas partes)

Dentro de una ventana (cuando tiene el foco)

AtajoAcciónVentana
Ctrl+EnterEjecutar el código / enviar el mensajeJS pane, JS Console, AI Helper
/ Historial de comandosJS Console (input)
Ctrl+LLimpiar el outputJS Console
EscLimpiar el campo de búsquedaOutput Console

Editores de código (panel de edición)

AtajoAcción
Ctrl+Alt+FFoco en el campo de búsqueda sobre el editor
Ctrl+Alt+→ / Ctrl+Alt+←Resultado de búsqueda siguiente / anterior
Enter / Shift+EnterBuscar / resultado siguiente / anterior (en el campo de búsqueda)
Ctrl+Alt+I / O / PCambiar la pestaña del conjunto activo a CSS / JS / Acciones (cuando la tarjeta del conjunto está renderizada)
¿Por qué estas combinaciones? Ctrl+Alt+G/H/J/K son teclas contiguas (disposición Vim), todas libres en todos los navegadores y sistemas. Ctrl+Alt+L se omitió a propósito — en Linux bloquea la pantalla. Ctrl+Alt+S (modo de edición) y Ctrl+Alt+\ (AI Helper) están en la misma familia de modificadores. Los atajos de la Output Console (Ctrl+Shift+...) no colisionan, porque se diferencian por el modificador.

Exportación e importación

La extensión ofrece cinco formatos de exportación (completo, parcial, directorio, grupo, conjunto) con detección automática del tipo de archivo al importar, para evitar sobrescrituras accidentales.

Exportación — completa o de elementos seleccionados

En el menú Ajustes del sidebar: Exportar ajustes. El modal abre dos modos:

Los archivos de exportación parcial tienen el nombre justzix-partial-FECHA.json (frente a justzix-backup-FECHA.json para el completo), y dentro un flag partial: true y un campo groups[].

Exportación de un directorio individual (con selección)

En la barra del directorio: Exportar — abre un modal con un árbol de grupos y conjuntos (análogo al de la exportación parcial, pero limitado a ese directorio). Se exportan solo los conjuntos marcados y los grupos a los que pertenecen — los grupos vacíos no llegan al archivo.

Formato justzix-folder — el archivo contiene un campo groups[] con la jerarquía de grupos y conjuntos del directorio.

Exportación de un grupo

En la barra del grupo: Exportar — un modal con la lista de conjuntos del grupo (checkboxes). Archivo: justzix-grupo-<nombre>-<fecha>.json, formato justzix-group.

Exportación de un conjunto individual

En la vista del conjunto: Exportar conjunto — descarga el archivo inmediatamente (sin modal). Formato justzix-rule, nombre: justzix-conjunto-<nombre>-<fecha>.json.

Cinco formatos de archivo:

Importación — detección automática del tipo (modal de importación completa)

Tras cargar un archivo / pegar el JSON, la extensión reconoce automáticamente el tipo y muestra un panel de detección coloreado:

ColorSignificadoAcción
Teal (turquesa)Backup completo válidoMuestra el número de directorios/conjuntos, la fecha de exportación, una advertencia de sobrescritura
MoradoBackup parcial (partial: true)Elección de modo: Fusionar con los actuales o Reemplazar todo
NaranjaTipo de archivo incorrecto en este modalUn mensaje que orienta al modal correcto, el botón Importar bloqueado
RojoError de parseo del JSON / formato no válidoEl botón Importar bloqueado

Modos de importación parcial (panel morado)

Importación de un directorio individual

En la barra del directorio: Importar. Comprueba conflictos por ID y por nombre:

Importación de un grupo

En la barra del grupo: Importar — acepta 3 formatos:

Todos los conjuntos del archivo llegan al grupo actual con nuevos ID (la operación es siempre del tipo "añadir copia" — sin conflictos).

Importación de un conjunto individual

En la vista del conjunto: Importar conjunto — acepta solo justzix-rule. Un prompt con 3 opciones:

La importación completa sobrescribe todos los ajustes (salvo que sea un backup parcial con el modo "Fusionar"). Haz una exportación antes de importar para tener un backup.

Usos prácticos de la exportación parcial

Sincronización en la nube

Ajustes → Sincronización en la nube abre el modal de la cuenta de sincronización. La extensión mantiene tu biblioteca (directorios, grupos, conjuntos, acciones, barras de acciones, ventanas en el frontend) en la nube de justzix.com y la conserva coherente entre dispositivos. La sincronización funciona solo cuando has iniciado sesión — sin una cuenta la extensión funciona únicamente en local.

Cuenta y clave de sincronización

Primera sincronización — resolución de conflictos

Al iniciar sesión, la extensión compara los datos locales con los datos de la nube:

ElecciónQué hace
Usar los datos de la nubeBorra la biblioteca local y reconstruye el estado de la cuenta a partir del servidor
Enviar mis datos localesLos datos locales pasan a ser los canónicos — elimina lo que había en la nube
FusionarCombina ambos conjuntos — añade las entidades que faltan, conservando las existentes

También puedes Cancelar — la extensión cierra entonces la sesión y no cambia nada.

Sincronización continua

Tras la primera conciliación, la sincronización se ejecuta en segundo plano: la extensión envía los cambios y descarga las nuevas entidades aproximadamente una vez por minuto. Un cambio realizado en un dispositivo aparece en los demás al cabo de poco tiempo. El punto de estado junto al elemento "Sincronización en la nube" indica si la cuenta está conectada.

Protección contra fantasmas. Un directorio eliminado previamente en un dispositivo podía "resucitar" al iniciar sesión en el siguiente. La extensión ahora obtiene del servidor la lista de entidades eliminadas (tombstones) y no vuelve a enviar algo que fue eliminado en otro lugar.

Pestaña Estado — biblioteca en la nube, historial, acciones

La pestaña Estado del modal de sincronización muestra el estado de la cuenta y ofrece botones de acción:

Biblioteca en la nube

Contadores de las entidades que se encuentran en la cuenta: directorios, grupos, conjuntos, acciones, barras de acciones, ventanas en el frontend. Solo se cuentan las entidades alcanzables en el árbol (un grupo debe tener un directorio existente, un conjunto — un grupo, una barra/ventana — un padre existente) — de forma coherente con los contadores del Panel. Se actualizan al abrir el panel y tras una sincronización manual.

Historial de sincronización

Un registro local del dispositivo de las últimas sincronizaciones. En la página se ven las últimas 10 entradas; el botón «Ver historial completo» abre una ventana con la lista completa (hasta 100 entradas). Cada entrada contiene:

El registro es local — no se sincroniza entre dispositivos. Se crea una entrada tras cada tick de sincronización que cambió algo realmente; el «Sincronizar ahora» manual siempre deja una entrada, incluso sin ningún cambio.

Qué se sincroniza y qué no

Las estadísticas de uso (aplicaciones de CSS, ejecuciones de JS, visualizaciones de ventanas) se sincronizan como entidades separadas por dispositivo — la tarjeta del Panel las suma de todos los dispositivos emparejados. El tema y el idioma se sincronizan como un ajuste común de la cuenta y se aplican en la siguiente apertura del panel en el otro dispositivo.

Compartir por enlace (Shares)

Una alternativa a enviar un archivo JSON por mensajería. Generas un enlace público con un tiempo de vida (1h / 6h / 12h / 24h / 48h) y se lo pasas al destinatario. El backend de justzix.com guarda el payload en la nube hasta su caducidad, después se elimina.

Requiere una cuenta de sincronización (Sync) con la sesión iniciada. El token en sí es un secreto público — cualquiera con el enlace lo descargará, así que no lo envíes por canales públicos si el contenido es sensible.

Formato del token

JZS-XXXX-XXXX-XXXX-XXXX (16 caracteres Crockford base32, ~80 bits de entropía). También se acepta la URL completa https://www.justzix.com/s/JZS-... — la extensión la parsea y normaliza (las letras confusas I/L→1, O→0, U→V).

Límites de la cuenta

Superar el límite = un error con un mensaje. Revoca los enlaces que no uses en el panel Mis shares.

Creación del enlace (emisor)

El botón "Compartir URL" en cuatro puntos de entrada, junto a "Descargar archivo":

El clic abre el modal de generación del enlace: subject + summary de lo que compartes, un radio con el TTL (24h por defecto), "Generar enlace". Tras el éxito, el modal cambia a la vista del resultado con dos valores copiables:

Cada uno tiene su botón "Copiar". También se muestra la hora de caducidad en la zona horaria local.

Panel "Mis shares"

Ajustes → Mis shares (un modal aparte, no forma parte de la sincronización — son dos funcionalidades distintas). Muestra la lista de enlaces activos: un contador en la cabecera X/20 activos · Y MB / 50 MB, y para cada share una tarjeta con:

Revocar no retira el contenido ya descargado. Si alguien llegó a descargar el payload, lo tiene en local. El share es un "best-effort time-limit", no un DRM.

Importar desde un enlace (destinatario)

Ajustes → Importar desde URL (entre "Importar ajustes" y "Sincronización en la nube", el icono de cadena). El modal tiene dos pasos:

Paso 1 — input. Pegas el enlace o solo el token. Validación del lado del cliente: se extrae el token de la URL, se normaliza en Crockford-base32, se comprueban los 16 caracteres + el formato. Formato incorrecto → un mensaje con una pista sobre el formato correcto.

Paso 2 — preview. La extensión muestra el resumen del share:

Si el share contiene JavaScript (jsLines > 0) — aparece un banner rojo de advertencia con un enlace "Mostrar el código JavaScript". Abre un overlay con el código JS completo de cada regla y acción — revísalo antes de importar, porque el código se ejecutará en las páginas que coincidan.

Paso 3 — importación. Clic en "Importar" → el backend devuelve el payload completo → la extensión crea las nuevas entidades con ID siempre nuevos (nunca sobrescribe los existentes por ID):

TipoQué ocurre
justzix-ruleCrea un nuevo directorio + grupo "Predeterminado" + el conjunto importado
justzix-groupCrea un nuevo directorio + el grupo importado + los conjuntos
justzix-folderAñade como un nuevo directorio de nivel superior
justzix-fullMerge: añade todos los folders/groups/rules con ID nuevos

Nombre del nuevo contenedor: <nombre-del-emisor o "Import"> <fecha> — luego puedes renombrarlo / trasladarlo libremente.

Errores del destinatario

ErrorMensaje
Token no válido"El token no es válido. Comprueba si has copiado el enlace completo."
404 not_found"Este enlace ha caducado o ha sido revocado por el emisor. Pide uno nuevo."
429 rate_limited"Demasiados intentos. Espera un momento e inténtalo de nuevo."
5xx / network"Problema con el servidor. Inténtalo de nuevo."

El backend no distingue un 404 "nunca existió" de un 404 "caducado / revocado" — a propósito, para no revelar si el token existió alguna vez.

Invocación programática de acciones desde JS

Puedes invocar cualquier acción (de la pestaña "Acciones" de la tarjeta del conjunto) de forma programática desde el JS del conjunto o desde el código de otra acción. El namespace global window.JZ se instala automáticamente en el MAIN world antes de cada ejecución de user-JS.

API — acciones

LlamadaQué hace
JZ.click(labelOrId)Hace clic de forma programática. Semántica según el tipo de acción: BUTTONel.click(). SELECT static (botón con dropdown) → el.click() (abre el popup; el usuario elegirá la opción manualmente). SELECT js (<select> nativo) → establece value en la primera opción non-disabled y hace dispatch de change. INPUT / TEXTAREA / SLIDERel.click() — atención: no cambia el valor ni dispara el handler change. Para establecer el valor: const el = JZ.action('LBL'); el.value = 'X'; el.dispatchEvent(new Event('change')). TOGGLE3el.click() incide en el contenedor; para activar un estado concreto usa el.querySelector('.jz-toggle3-state[data-jz-state-idx="1"]').click(). Devuelve true/false.
JZ.value(labelOrId)Getter unificado del valor actual. INPUT / TEXTAREA → el.value nativo. SLIDER → wrap.dataset.jzValue (wrap es un DIV, el renderer establece el data attr desde el inicial + en input/change). SELECT(js) → el.value nativo. SELECT(static) → el.dataset.jzValue (el renderer lo establece en cada selección). TOGGLE3 → el.dataset.jzValue (state.value del activo; fallback a state.label). BUTTON → null. Elemento no encontrado → null.
JZ.setValue(labelOrId, value)Setter programático. INPUT/TEXTAREA → el.value = String(v) + dispatch de input+change. SLIDER → establece el <input.jz-action-slider> nativo + dispatch. SELECT(js) → el.value = String(v) + dispatch de change. SELECT(static) + TOGGLE3 → envía un CustomEvent 'jz-set-value', el listener de content.js hace el flujo completo (memoria + UI + ejecuta el código). Búsqueda en TOGGLE3: por state.value → fallback a state.label → fallback al idx numérico 0-2. BUTTON → false. Devuelve true/false.
JZ.action(labelOrId)Devuelve el elemento de la acción (button / select / input / textarea / slider / contenedor toggle3) o null. Búsqueda: primero por data-jz-action-id, luego case-insensitive por data-jz-key (el label en MAYÚSCULAS). Funciona para los 6 tipos de acción.
JZ.actionById(id)Búsqueda exclusivamente por el action.id estable (p. ej. 'a_mp1deeq3_uimd8l'). Recomendado para acciones sin label o cuando quieres certeza.
JZ.actions()Un array de todos los elementos de acción visibles (button + select + input + textarea + slider + toggle3) de la página actual.
JZ.labels()Un array de las etiquetas originales (con el case conservado tal como lo escribiste).

Ejemplo — lectura y establecimiento de valores

// === Lectura ===
const filter = JZ.value('FILT');           // INPUT/TEXTAREA — string
const opacity = JZ.value('OPAC');          // SLIDER — string numérico ("75")
const mode = JZ.value('MODE');             // SELECT static — string (option.value)
const theme = JZ.value('THM');             // TOGGLE3 — state.value del estado activo

// === Establecimiento ===
JZ.setValue('FILT', 'nuevo valor');        // INPUT/TEXTAREA — string + dispatch input+change
JZ.setValue('OPAC', 75);                   // SLIDER — clamp a min/max, dispatch input+change
JZ.setValue('SRT', 'prod');                // SELECT(js) — select nativo + dispatch change
JZ.setValue('MODE', 'staging');            // SELECT static — content.js hace el flujo (memoria + UI + código)
JZ.setValue('THM', 'dark');                // TOGGLE3 — búsqueda por state.value (fallback a label, luego idx)
JZ.setValue('THM', 2);                     // TOGGLE3 — equivalente; el idx numérico también funciona

API — barras y floating button

LlamadaQué hace
JZ.bars()Todos los contenedores .jz-actions-bar (ActionBars) visibles en la página.
JZ.barById(id)El elemento de la barra por data-jz-bar-id.
JZ.floatingBtn()El botón flotante principal #justzix-floating-btn o null (cuando está oculto).
La búsqueda en JZ.click / JZ.action es case-insensitive por el label, pero exacta por el action.id estable. Para acciones sin label (típicamente INPUT) usa JZ.actionById('a_...').

Variables de contexto en el código de la acción

En el campo "Código JS" de la acción tienes disponibles automáticamente unas variables — inyectadas como const por el background service worker antes de la ejecución:

VariableQué contieneCuándo está disponible
$elEl elemento DOM de esa acción (input / select / button / textarea / contenedor toggle3)siempre que exista action.id
$action{ id, label, type, el }siempre
valueEl valor actual según el tipo: SELECT static → option.value; INPUT/TEXTAREA → el contenido del campo; SLIDER → un número; TOGGLE3 → state.value del estado activo (fallback a state.label cuando value está vacío).SELECT static, INPUT, TEXTAREA, SLIDER, TOGGLE3. SELECT js: el código se ejecuta UNA VEZ al renderizar — value está vacío.
stateIdxInteger 0-2 — el índice del estado activo (desde qué estado empezó el clic).solo TOGGLE3
stateLabelString — el label del estado activo (máx. 5 caracteres).solo TOGGLE3

Snippet en la UI

En el modal de configuración de una acción de tipo SELECT e INPUT, el panel "ID estable de la acción" muestra el action.id completo con un botón copy y un selector JS de ejemplo (document.querySelector('[data-jz-action-id="..."]')). Bajo la lista de BUTTON se ven chips JZ.click('LBL') — el clic en el chip copia el snippet al portapapeles.

Requisitos

Ejemplo — una acción AUTO que invoca una secuencia

// Código de la acción "AUTO"
JZ.click('LOAD');                          // clic en la acción LOAD (p. ej. carga datos)
setTimeout(() => JZ.click('PROC'), 500);   // 500ms después PROC (procesa)
setTimeout(() => JZ.click('SAVE'), 1500);  // 1500ms después SAVE (guarda)

Ejemplo — JS del conjunto que reacciona al DOM

Tras aparecer un elemento dinámico, haz clic en la acción que lo elimina:

// Código JS del conjunto — un observer sobre un modal que aparece dinámicamente
const observer = new MutationObserver(() => {
  if (document.querySelector('.cookie-banner')) {
    JZ.click('CCK');  // haz clic en la acción que elimina el banner
    observer.disconnect();
  }
});
observer.observe(document.body, { childList: true, subtree: true });

Ejemplo — establecimiento programático del valor de un INPUT

// JZ.click sobre un INPUT no cambia el valor — usa el patrón con dispatch de 'change':
const el = JZ.action('SRCH');           // o JZ.actionById('a_mp1deeq3_uimd8l')
if (el) {
  el.value = 'nuevo filtro';
  el.dispatchEvent(new Event('change'));
}

Acceso directo mediante el DOM

Si prefieres trabajar con el DOM directamente (p. ej. cambias un estilo, no invocas):

// Búsqueda por el ID estable (recomendado — resistente al cambio del label):
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');

// Búsqueda por el label (case-insensitive — MAYÚSCULAS en data-jz-key):
const btn = document.querySelector('[data-jz-key="MYBT"]');
btn.style.opacity = '0.5';      // atenúalo
btn.dataset.busy = 'true';      // atributo propio

Dónde viven los elementos de acción en el DOM:

Tipo de acciónContenedorSelector del elemento
BUTTON.jz-actions-bar[data-jz-bar-id="..."].jz-action-btn[data-jz-action-id="..."]
SELECT (static).jz-actions-bar.jz-action-select[data-jz-action-variant="static"] (button con popup; data-jz-value = el valor seleccionado actualmente)
SELECT (js).jz-actions-bar.jz-action-select.jz-variant-js (<select> nativo)
INPUT.jz-actions-bar.jz-action-input[data-jz-action-id="..."]
SLIDER.jz-actions-bar.jz-action-slider-wrap[data-jz-action-id="..."] (wrap); el slider en sí: .jz-action-slider (<input type="range"> nativo)
TEXTAREA.jz-actions-bar.jz-action-textarea[data-jz-action-id="..."]
TOGGLE3.jz-actions-bar.jz-action-toggle3[data-jz-action-id="..."] (contenedor; data-jz-value = state.value del activo); los botones de estado: .jz-toggle3-state[data-jz-state-idx="0|1|2"], el activo tiene la clase .active

Todos los elementos tienen el atributo data-jz-action-id (un identificador estable único). El selector .jz-actions-bar es seguro — no colisiona con el DOM de la página.

La búsqueda por el label (data-jz-key) funciona para todos los tipos de acción. Cada elemento de acción tiene tanto data-jz-label (el case original) como data-jz-key (MAYÚSCULAS). Por seguridad (p. ej. cuando el label puede cambiar) usa el data-jz-action-id estable o JZ.actionById().

Funciones destacadas

Buscador en el sidebar

El campo "Buscar" filtra el árbol de directorios. Lógica de coincidencia:

La coincidencia es case-insensitive, el resaltado en amarillo muestra el punto de coincidencia.

Interruptor global

Tras hacer clic en el icono de la extensión en la toolbar de Chrome aparece el widget del popup con un gran interruptor verde/gris "Plugin enabled". En el modo deshabilitado no se inyecta ningún CSS/JS en ninguna página, con independencia de los ajustes de los directorios. El botón flotante queda entonces deshabilitado (Halt Red, opacity 0.7). El estado sobrevive al reinicio de Chrome.

Insertar la URL de la pestaña

Un botón junto al campo del patrón de URL — inserta protocol://host/* de la pestaña activa. Creación de un directorio en 2 segundos. La dirección de la página de opciones de la extensión se omite — toma la pestaña externa más reciente.

Validación de la URL en vivo

Inline, a la derecha del campo de URL, aparece la información "Coincide con X pestañas abiertas" o una advertencia. Detecta erratas al instante.

Historial de cambios del conjunto

Se crea una instantánea del CSS y el JS 3 segundos después de la última edición (debounce). Límite de 5 versiones — la más antigua se descarta. Al restaurar una versión, el contenido actual se añade al historial como la instantánea más reciente, de modo que siempre puedes deshacer el deshacer.

Etiquetas y búsqueda por etiquetas

En la cabecera de la tarjeta del conjunto hay un campo para etiquetas — escríbelas separadas por comas. Aparecen como pequeñas etiquetas en el sidebar junto al nombre del conjunto. El buscador también encuentra por etiquetas.

Etiqueta y color del directorio

Cada directorio puede tener su propia etiqueta en el botón flotante (máx. 3 letras, MAYÚSCULAS) y un color (selector de color). La etiqueta y el color ayudan a reconocer visualmente qué proyecto está activo en cada página.

Estadísticas de clics en las acciones

Cada botón de acción cuenta cuántas veces se ha pulsado. Ayuda a ver cuáles se usan realmente.

Validación de CSS

Bajo el editor de CSS se muestra una barra con la lista de problemas de sintaxis:

Es una validación sintáctica simple — no comprueba la corrección de properties/values. El CSS con error se sigue inyectando (el navegador simplemente omitirá las reglas erróneas).

Preview de JS al importar

En el modal de importación de un directorio individual, tras cargar el archivo, aparece una lista de conjuntos con métricas:

Contenido del archivo (3 conjuntos):
  Auto-login              CSS: 0L • JS: 4L                    JS
  Ocultar banner cookie   CSS: 8L • JS: 0L
  Debug GTM               CSS: 0L • JS: 12L • 2 acciones (8L)  JS

Una advertencia con el número de líneas de JS si hay alguna presente. El clic en el botón JS muestra el código completo para revisarlo antes de importar.

Aislamiento de JS con try/catch

Cada conjunto de JS se ejecuta por separado, con su propio try/catch. Un error en un conjunto no bloquea la ejecución de los demás. Los errores se registran en la consola con el nombre del conjunto/acción y el stack trace completo.

Cuota de almacenamiento

Un indicador del consumo de memoria en el menú Ajustes del sidebar (p. ej. 1.2 MB / 10 MB). Rojo por encima del 80%.

Filtro "Solo activos"

Un checkbox sobre la lista — oculta los conjuntos marcados como independientes (○) y muestra solo los activos en el directorio (●). Ayuda a filtrar los conjuntos "manuales" cuando el directorio tiene muchos. Reacciona al instante a los cambios de los interruptores.

Actualización de la extensión

La extensión tiene una clave fija en el manifest (en la versión para Firefox — un gecko.id fijo), lo que significa que el ID de la extensión es invariable entre actualizaciones — los datos (directorios, conjuntos, ajustes) se conservan. JustZix se distribuye para cuatro navegadores: Chrome, Edge, Opera y Firefox.

Notificación de nueva versión

En el menú Ajustes (junto al número de versión) aparece un banner verde "Hay una nueva versión disponible" cuando el servidor publica un paquete más reciente que el instalado. El banner contiene un enlace de descarga. La comprobación es silenciosa — sin red el banner simplemente no se muestra.

Procedimiento de actualización (Chrome / Edge / Opera)

  1. Descarga el nuevo ZIP con la actualización
  2. Descomprímelo sobrescribiendo la misma carpeta donde estaba la versión anterior
  3. En chrome://extensions/ (Edge: edge://extensions/) localiza la extensión y haz clic en el icono de recarga en la tarjeta
  4. La extensión se recargará con los nuevos archivos, los datos se quedan

Firefox

La versión para Firefox se carga mediante about:debugging → "Este Firefox" → "Cargar complemento temporal" (apuntando a manifest.json en la carpeta justzix_firefox/). Una actualización = recargar tras sobrescribir los archivos.

Qué puede provocar la pérdida de datos: Haz siempre una exportación antes de cualquier operación sobre la extensión. Si usas la sincronización en la nube — los datos también están en la nube de la cuenta.

Ejemplos de CSS

CSS Ocultar anuncios y banners
/* Ocultar anuncios típicos */
.ad, .ads, .advertisement,
.banner-ad, [class*="ad-banner"],
[id*="google_ads"] {
  display: none !important;
}

/* Ocultar el cookie banner */
.cookie-banner, #cookie-notice {
  display: none !important;
}
CSS Modo oscuro para una página sin soporte de dark mode
html {
  filter: invert(0.92) hue-rotate(180deg);
}
img, video, picture, iframe, [style*="background-image"] {
  filter: invert(1) hue-rotate(180deg);
}

Truco: invertir toda la página y volver a invertir las imágenes. Funciona sorprendentemente bien en la mayoría de páginas.

CSS Resaltado de elementos para pruebas / e2e
/* Colorea todos los elementos con data-testid */
[data-testid] {
  outline: 2px dashed #f59e0b !important;
  outline-offset: -2px;
}
[data-testid]::before {
  content: attr(data-testid);
  position: absolute;
  background: #f59e0b;
  color: white;
  font-size: 10px;
  padding: 2px 4px;
  z-index: 9999;
}
CSS Panel administrativo más legible
/* Aumenta la legibilidad de las tablas del admin */
table.admin-list td, table.admin-list th {
  padding: 8px 12px !important;
  font-size: 14px !important;
}

/* Sticky header de la tabla */
table.admin-list thead {
  position: sticky;
  top: 0;
  background: white;
  z-index: 10;
}

/* Filas alternas */
table.admin-list tbody tr:nth-child(odd) {
  background: #f9fafb;
}
CSS Contenedor de contenido más ancho
/* A menudo las páginas tienen un max-width rígido de 1200px - fuerza la anchura */
.container, .main-content, main {
  max-width: 95% !important;
  width: 95% !important;
}
CSS Entorno dev evidente (banner de colores)
body::before {
  content: "ENTORNO DEV";
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  background: #dc2626;
  color: white;
  text-align: center;
  padding: 4px;
  font-weight: bold;
  z-index: 999999;
  font-family: 'Roboto Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
}
body { padding-top: 28px !important; }

Perfecto para el patrón https://dev.example.com/* y no confundir entornos.

Ejemplos de JavaScript

JS Autocompletado de los campos de login (entorno dev)
// ¡Solo para dev! Nunca guardes contraseñas reales
window.addEventListener('load', () => {
  const login = document.querySelector('input[name="login"]');
  const pass = document.querySelector('input[name="password"]');
  if (login) login.value = 'admin@dev.local';
  if (pass) pass.value = 'devpass123';
});
JS Registro de eventos analíticos en la consola
// Intercepta dataLayer.push (GTM)
const origPush = window.dataLayer?.push;
if (origPush) {
  window.dataLayer.push = function(...args) {
    console.log('%c[GTM]', 'color:#16a34a;font-weight:bold', args);
    return origPush.apply(window.dataLayer, args);
  };
}

// Intercepta gtag
const origGtag = window.gtag;
if (origGtag) {
  window.gtag = function(...args) {
    console.log('%c[GA4]', 'color:#2563eb;font-weight:bold', args);
    return origGtag.apply(window, args);
  };
}

Ideal para depurar la configuración de la analítica en producción sin tocar el código.

JS Auto-skip de intro / cookie / anuncios
// Cada 500ms durante 10s comprueba y haz clic en los botones "Aceptar"
let attempts = 0;
const interval = setInterval(() => {
  if (++attempts > 20) return clearInterval(interval);

  const buttons = [...document.querySelectorAll('button, a')];
  const target = buttons.find(b =>
    /aceptar|acepto|accept all/i.test(b.textContent || '')
  );
  if (target) {
    target.click();
    clearInterval(interval);
  }
}, 500);
JS Añadir atajos de teclado
document.addEventListener('keydown', (e) => {
  // Ctrl+Shift+S - guardar el formulario
  if (e.ctrlKey && e.shiftKey && e.key === 'S') {
    e.preventDefault();
    document.querySelector('button[type="submit"]')?.click();
  }
  // Ctrl+Shift+E - ir a la edición (ejemplo no probado)
  if (e.ctrlKey && e.shiftKey && e.key === 'E') {
    e.preventDefault();
    document.querySelector('a.edit-link')?.click();
  }
});
JS Desactivar alerts / confirm / beforeunload
// Omite los molestos confirm y beforeunload durante las pruebas
window.confirm = () => true;
window.alert = (msg) => console.log('[alert silenciado]', msg);
window.onbeforeunload = null;
window.addEventListener('beforeunload', e => {
  e.stopImmediatePropagation();
}, true);
JS Trasladar un elemento a otro lugar del DOM
// Recuerda - el CSS puro no lo hará cuando el padre tiene display:none
window.addEventListener('load', () => {
  const target = document.querySelector('.important-info');
  const newParent = document.querySelector('.sidebar');
  if (target && newParent) {
    newParent.prepend(target);
  }
});
JS Mostrar campos / elementos ocultos
// Muestra todos los input type="hidden" ocultos
document.querySelectorAll('input[type="hidden"]').forEach(input => {
  const wrapper = document.createElement('div');
  wrapper.style.cssText = 'background:#fef3c7;padding:4px;font-size:11px;font-family:monospace;border:1px dashed #f59e0b;';
  wrapper.innerHTML = `${input.name}: ${input.value}`;
  input.parentNode.insertBefore(wrapper, input);
});

Ejemplos de botones de acción

ACCIÓN CLR — vaciar el formulario

Etiqueta: CLR   Color: rojo

document.querySelectorAll('input, textarea, select').forEach(el => {
  if (el.type === 'hidden') return;
  if (el.type === 'checkbox' || el.type === 'radio') {
    el.checked = false;
  } else {
    el.value = '';
  }
  el.dispatchEvent(new Event('change', { bubbles: true }));
});
ACCIÓN FILL — rellenar datos de prueba

Etiqueta: FILL   Color: verde

const data = {
  email: 'test@example.com',
  phone: '600000000',
  firstName: 'Juan',
  lastName: 'Prueba',
  street: 'Calle de Prueba 1',
  city: 'Madrid',
  zip: '28001'
};
Object.keys(data).forEach(name => {
  const el = document.querySelector(`[name="${name}"]`);
  if (el) {
    el.value = data[name];
    el.dispatchEvent(new Event('input', { bubbles: true }));
    el.dispatchEvent(new Event('change', { bubbles: true }));
  }
});
ACCIÓN CART — añadir un producto de prueba al carrito

Etiqueta: CART   Color: naranja

// Para una tienda típica — haz clic en el primer "añadir al carrito"
const btn = document.querySelector('.add-to-cart, [data-action="add-to-cart"]');
if (btn) btn.click();
else alert('No se encontró el botón de añadir al carrito');
ACCIÓN COPY — copiar la URL de la página al portapapeles

Etiqueta: COPY   Color: morado

navigator.clipboard.writeText(location.href).then(() => {
  console.log('Copiado:', location.href);
});
ACCIÓN TKN — mostrar el token de autenticación

Etiqueta: TKN   Color: amarillo

// Extrae el token JWT de localStorage / cookies para depurar
const token = localStorage.getItem('authToken')
  || document.cookie.match(/token=([^;]+)/)?.[1];
if (token) {
  navigator.clipboard.writeText(token);
  alert('Token copiado. Primeros caracteres: ' + token.slice(0, 20) + '...');
} else {
  alert('No hay token');
}
ACCIÓN SQL — mostrar las peticiones a la API en la consola

Etiqueta: SQL   Color: azul

// Intercepta todos los fetch y muéstralos en la consola
const origFetch = window.fetch;
window.fetch = async function(...args) {
  console.log('%c[FETCH]', 'color:#2563eb', args[0]);
  const res = await origFetch.apply(this, args);
  return res;
};
console.log('Registro de fetch habilitado. Cada llamada aparecerá en la consola.');
ACCIÓN ENV — mostrar información del entorno

Etiqueta: ENV   Color: gris

const info = {
  url: location.href,
  userAgent: navigator.userAgent.split(' ').pop(),
  cookies: document.cookie.split(';').length,
  localStorage: Object.keys(localStorage).length,
  framework: window.React ? 'React' : window.Vue ? 'Vue' : window.jQuery ? 'jQuery' : 'unknown'
};
alert(JSON.stringify(info, null, 2));

Escenarios de uso

1. Trabajo con varios clientes / proyectos

Cada proyecto tiene su propio directorio con su propio patrón de URL. Puedes tener directorios:

En el panel derecho los directorios privados se pueden habilitar/deshabilitar rápidamente. La exportación de un directorio individual permite compartir la configuración con el equipo.

2. Entorno de desarrollo con marcado visual

En cada dev/staging añade un banner y auto-login. Un conjunto de CSS (el banner) y uno de JS (auto-fill). Creas un directorio aparte para cada entorno, se activan con un simple checkbox.

3. Herramientas para product manager / QA

Un panel de acciones con botones: FILL (datos de prueba), CART (compra de prueba), CLR (vaciar el formulario), STATE (mostrar el estado de la aplicación en un alert). Sin programador, sin consola, un solo clic.

4. Modificaciones de páginas públicas

Tus blogs/documentaciones favoritos con mejor legibilidad — contenedor más ancho, fuente, modo oscuro. Cada página en un directorio aparte, "Activo" dejado siempre habilitado.

5. Depuración de la analítica / GTM

Un conjunto por cada dominio con JS que intercepta dataLayer.push y gtag. Lo habilitas cuando el cliente reporta un problema con la analítica, sin tocar el código de la página.

6. Trabajo en paneles administrativos

El patrón *://*.justzix.com/admin/* y CSS que mejora las tablas, listas y formularios. Más una acción "Filtro de prueba" que establece automáticamente los filtros para un workflow típico.

7. Pruebas seguras en producción

La acción RO (read-only) inyecta CSS que oculta todos los botones "Eliminar", "Guardar", "Enviar" — un "modo de solo lectura" temporal para no equivocarse.

// Oculta los botones peligrosos
document.querySelectorAll(
  'button[type="submit"], .delete-btn, .danger-btn, [class*="delete"]'
).forEach(b => b.style.display = 'none');
console.warn('MODO READ-ONLY habilitado');

Problemas frecuentes y soluciones

El JavaScript no se ejecutó

El CSS no funciona

El botón flotante no aparece

Perdí datos tras actualizar la extensión

La extensión tiene una clave fija en el manifest — las sucesivas actualizaciones conservan los datos. Si aun así los datos desaparecieron:

Las posiciones de los botones/paneles se resetean

Es normal — las posiciones son por ventana del navegador y se almacenan en la memoria de sesión (chrome.storage.session). Tras cerrar la ventana las posiciones desaparecen, en una ventana nueva empiezas desde las predeterminadas. La posición sobrevive a la navegación entre pestañas de la misma ventana.

La exportación parcial omitió algunos ajustes globales

Sí — la exportación parcial contiene solo los directorios y conjuntos marcados, más los ajustes de visibilidad relacionados con ellos. No contiene las posiciones de los paneles flotantes (son por ventana) ni otras preferencias globales. Para un backup completo usa el modo "Todo".

La importación parcial me sobrescribió un directorio que antes no existía

El modo "Fusionar" empareja los directorios por ID. Si el archivo importado tenía un ID en conflicto con un directorio existente (p. ej. el mismo archivo ya se importó una vez), aparece un prompt: 1 sobrescribir / 2 copia (predeterminado, seguro) / Cancelar. Eligiendo 2 obtienes copias con nuevos ID y el añadido "(import)" en el nombre de la carpeta — no pierdes nada.

El árbol de directorios no se despliega

La flecha de despliegue aparece solo si el directorio tiene conjuntos. Un directorio vacío tiene un punto atenuado en lugar de flecha. El estado de despliegue de cada directorio se recuerda en chrome.storage.local.

No veo el botón Exportar/Importar del directorio

Esos botones están en la barra del directorio (en la parte superior del área de edición), junto al botón "Eliminar directorio". No confundir con los botones del menú Ajustes, que afectan a la totalidad de los ajustes.

AI Helper no responde

Conflicto con la Content Security Policy

El JS de reglas y acciones se ejecuta en el contexto de la página mediante una estrategia por capas resistente a las reglas estrictas de Content Security Policy. La mayoría de las páginas — incluidos grandes servicios como Facebook — funcionan de inmediato, sin configuración.

Las páginas con una CSP muy estricta (algunos bancos, sitios corporativos) pueden bloquear la ejecución. Para que el JS funcione en todas las páginas, activa para JustZix la opción «Permitir scripts de usuario»: abre chrome://extensions, ve a los detalles de JustZix y activa el interruptor (los navegadores más antiguos también requieren el modo de desarrollador). Cuando una página bloquea la ejecución, la ventana JavaScript / la Consola JS muestra un mensaje adecuado.


JustZix — manual