Iniezione di stili CSS personalizzati, codice JavaScript e pulsanti azione su qualsiasi pagina
JustZix consente di iniettare automaticamente CSS e JavaScript personalizzati su pagine selezionate, oltre a definire pulsanti azione (scorciatoie che eseguono frammenti di codice su richiesta).
https://justzix.com/*. È possibile abilitare/disabilitare l'intera cartella con un clic.Ogni set e ogni gruppo può ricevere un proprio elenco di pattern URL aggiuntivi (chip-input). Quando l'elenco è vuoto — l'elemento funziona ovunque corrisponda il pattern della cartella. Se imposti ad es. https://justzix.com/admin/* — l'elemento funzionerà solo sulle sottopagine dell'admin.
| Pattern della cartella | Pattern del set | Funziona su |
|---|---|---|
https://justzix.com/* | (vuoto) | tutto il dominio justzix.com |
https://justzix.com/* | https://justzix.com/admin/* | solo la sezione /admin/ |
https://justzix.com/* | https://justzix.com/produkty/*https://justzix.com/koszyk | solo le sottopagine dei prodotti + carrello |
*://localhost:*/* | *://localhost:3000/* | solo la porta 3000 (dev) |
Per i nuovi utenti JustZix include un tutorial interattivo che ti guida passo dopo passo nella creazione di una soluzione completa — da una cartella, passando per un gruppo e un set di regole, fino al codice CSS/JS e un pulsante azione. I suggerimenti appaiono come fumetti accanto agli elementi successivi del pannello.
Come avviarlo:
Nella finestra «Centro tutorial» scegli un tutorial e clicchi Inizia. Durante il tutorial:
Accesso tramite clic destro sull'icona dell'estensione → "Opzioni", oppure clic sull'icona → pulsante "Pannello di modifica".
Un piccolo pulsante rotondo appare automaticamente sulle pagine che corrispondono a una qualsiasi cartella. Per impostazione predefinita mostra la scritta ZIX, ma ogni cartella può avere la propria etichetta.
Etichetta della cartella: nella barra della cartella, all'estrema sinistra (accanto al color picker) c'è un campo di testo per l'etichetta del pulsante. Limiti imposti: max 3 caratteri, sempre MAIUSCOLO (la conversione in maiuscolo avviene immediatamente durante la digitazione). Il campo accetta lettere e cifre — esempi: ZIX, QA, DEV, ADM, X. Con più cartelle corrispondenti viene presa l'etichetta della prima che ne ha una impostata; le altre vengono ignorate (campo vuoto = fallback a ZIX).
Stato indicato dal colore (palette del brand):
Colore della cartella: se imposti il color picker accanto a una cartella, il pulsante flottante sulle pagine corrispondenti assumerà quel colore. Gli stati "mixed" e "off" modulano automaticamente la saturazione. Con più cartelle corrispondenti viene preso il colore della prima con un colore impostato.
All'accesso al pannello di modifica l'estensione apre il Pannello — la pagina iniziale con un riepilogo della libreria e scorciatoie rapide. In precedenza il pannello selezionava automaticamente la prima cartella dell'elenco; ora vedi invece una panoramica.
Il Pannello è raggiungibile con il clic sul logo nella sidebar e con l'icona "casa" sulla barra breadcrumb di ogni editor (cartella, gruppo, set). Anche l'intestazione del Pannello stesso ha un'icona "casa" — il suo clic aggiorna i dati (ricarica la libreria dallo storage e ricostruisce il Pannello).
Il Pannello ha un layout con righe fisse di schede:
chrome.storage.local e data dell'ultimo backup cloud.Le schede „Ultimi esempi" e „Dal blog" recuperano il contenuto dal sito del progetto; quando l'endpoint non è disponibile (es. offline), entrambe le schede vengono nascoste. La versione dell'estensione viene verificata di nuovo a ogni accesso al pannello.
Il pannello sinistro in modalità di modifica mostra le cartelle in una gerarchia — è possibile espandere ogni cartella per vederne i set e passare alla modifica di uno specifico set.
| Elemento | Azione |
|---|---|
| Freccia di espansione | Espande/comprime l'elenco dei set o dei gruppi (memorizzato tra le sessioni) |
| Clic sul nome della cartella (compressa) | Seleziona la cartella, apre il Folder editor ed espande i suoi gruppi/set |
| Clic su una cartella già selezionata | Toggle: comprime (un clic successivo riespande) — analogamente per il gruppo |
| Clic sul nome del gruppo (compresso) | Seleziona il gruppo, apre il Group editor ed espande i suoi set |
| Clic sul nome del set | Apre la vista del singolo set (Rule editor) |
| Checkbox accanto alla cartella | Abilita/disabilita l'intera cartella (cascata verso i gruppi e i loro set attivi) |
| Checkbox accanto al gruppo | Abilita/disabilita il gruppo (cascata verso i suoi set attivi) |
| Checkbox accanto al set | Controlla in modo indipendente il singolo set |
| Stato ●/○ accanto a cartella/gruppo/set | Attivo: ● attivo, ○ inattivo (forzatamente disabilitato) |
| C J A U accanto al set | Etichette del contenuto: C = ha CSS, J = ha JavaScript, A = ha azioni, U = ha pattern URL propri. Appaiono solo quando il campo corrispondente non è vuoto. |
| Barra del colore a sinistra | Il colore della cartella è disegnato con box-shadow inset — non sposta la posizione del nome della cartella (le cartelle con e senza colore sono allineate) |
| Maniglia drag&drop | Afferra con il mouse e trascina per cambiare l'ordine |
expandedFolders, expandedGroups).
Passa il mouse su una cartella, un gruppo o un set — sul lato sinistro apparirà una maniglia drag&drop. Afferra con il mouse e trascina:
Una barra verticale tra la sidebar e l'editor nasconde il pannello sinistro — utile quando hai bisogno di più spazio per l'editor. Lo stato viene memorizzato tra le sessioni. Dopo aver mostrato/nascosto, CodeMirror aggiorna automaticamente la propria larghezza.
Sotto ogni editor (CSS, JS, codice dell'azione) c'è una barra orizzontale con una maniglia da trascinare verticalmente. Afferra con il mouse e tira verso il basso per ingrandire l'editor. Altezza minima 80px, massima illimitata — la pagina scorre naturalmente con il contenuto.
Sopra ogni editor di codice CodeMirror — CSS e JavaScript nella scheda del set e „Codice JS" nell'editor dell'azione — si trova una barra di ricerca: un campo di testo e un pulsante con l'icona della lente.
n / totale.| Scorciatoia | Azione |
|---|---|
Enter | Cerca (nuova query) o passa al risultato successivo (quando la query è invariata) |
Shift+Enter | Risultato precedente |
Ctrl+Alt+→ / Ctrl+Alt+← | Risultato successivo / precedente — funziona dall'editor e dal campo di ricerca |
Ctrl+Alt+F | Dall'editor di codice sposta il focus al campo di ricerca |
Esc | Svuota il campo di ricerca |
Il pattern URL definisce su quali pagine la cartella si attiva.
| Pattern | Corrisponde a |
|---|---|
https://justzix.com/admin | Solo questo URL esatto |
https://justzix.com/* | Tutte le pagine su justzix.com |
https://*.justzix.com/* | Tutti i sottodomini e le pagine |
*://localhost:*/* | Tutte le applicazioni locali |
https://example.com/admin/* | Solo la sezione /admin/ e le sottopagine |
*example* | Qualsiasi URL contenente "example" |
?id=123) e l'hash (#section), a meno che non li inserisca nel pattern.
Ogni set ha due flag indipendenti:
| Flag | Significato |
|---|---|
| Attivo ● | Indica se questo set è controllato dall'interruttore della cartella e del gruppo (entrambi i livelli cascano verso le active rules). Abilitare la cartella o il gruppo abilita tutti i set attivi all'interno. |
| Abilitato ✓ | Stato corrente: indica se il set è attualmente iniettato sulle pagine. |
Toggle della cartella → cambia enabled di tutte le active rule nei suoi gruppi
Toggle del gruppo → cambia enabled di tutte le active rule di questo gruppo
Toggle del set → cambia solo enabled di questo set
Le regole con Attivo: NO (badge ○) vengono ignorate nelle cascate — le controlli solo manualmente, indipendentemente dallo stato della cartella e del gruppo.
Attivo: NO • Abilitato: controllato manualmente
Il set non reagisce all'abilitazione dell'intera cartella. Lo controlli solo manualmente. Ideale per modifiche sperimentali che non vuoi attivare in blocco.
Attivo: SÌ • Abilitato: SÌ
Impostazione standard. L'abilitazione/disabilitazione della cartella controlla anche questo set.
Attivo: SÌ • Abilitato: NO
Il set è "collegato" alla cartella, ma momentaneamente disabilitato. Il prossimo clic sull'interruttore principale della cartella lo riattiverà.
| Azione | Effetto |
|---|---|
| Clic sinistro | Toggle di tutte le cartelle corrispondenti (abilita/disabilita) |
| Clic destro | Apre il pannello con l'elenco di cartelle e set |
| Trascinamento | Spostamento della posizione (memorizzato per finestra) |
Nel pannello a tendina (clic destro) puoi:
actionBar.enabled (persistente, si propaga al pannello di modifica)Il pannello mostra solo i set attivi (●) — quelli indipendenti (○) sono nascosti per concisione. Quando la cartella ha un solo gruppo chiamato "Predefinito", l'intestazione del gruppo viene omessa — si vedono solo i set.
Il clic sull'icona JustZix nella barra delle estensioni di Chrome apre il widget popup — un pannello di controllo compatto per la scheda corrente. Dall'alto:
actionBar.enabled).In un singolo workspace puoi avere più barre di azioni — ciascuna con il proprio nome, orientamento, colore di sfondo, proprio set di pulsanti e posizione indipendente per finestra del browser. Una barra può essere assegnata a una cartella, a un gruppo o a un singolo set (questo determina la visibilità e la cascata).
Nell'editor di cartella, gruppo o set si trova il pulsante „Barre di azioni (N)". Il clic apre la modale di gestione delle barre. Nella modale:
barId).Ogni azione nella scheda „Azioni" della scheda del set ha un dropdown „Barra di azioni" — scegli la barra di destinazione dall'elenco di quelle visibili per quel set (barre proprie del set + barre del gruppo + barre della cartella).
Durante il trascinamento di una barra, l'estensione rileva i bordi delle barre adiacenti e del pulsante flottante a una distanza ≤ 12 px. Appare un indicatore visivo sticky e, dopo il rilascio, le barre si uniscono in un gruppo di connessioni. Quindi:
__float come pseudo-bar).Clic destro sulla maniglia di trascinamento della barra → menu contestuale:
In modalità di modifica della barra questo menu è disattivato; il clic destro su un'etichetta dà allora l'opzione „Elimina etichetta".
Per abilitare/disabilitare in modo permanente le barre di azioni (senza F5) l'estensione offre tre punti di accesso, tutti mappati sullo stesso actionBar.enabled nello storage — una modifica da un punto si propaga al pannello di modifica e alle altre UI:
actionBar.enabled.actionBar.enabled = false — la barra non viene affatto renderizzata, lo stato si sincronizza tra dispositivi (sync), è visibile nel pannello di modifica.barsHidden[barId] = true per finestra del browser — la barra scompare fino a F5 / chiusura della finestra. L'abilitazione dal popup/floating panel azzera automaticamente questo runtime hide.La modalità di modifica della barra di azioni si attiva in tre modi: con la scorciatoia Ctrl+Alt+S (funziona da qualsiasi punto della pagina), con l'interruttore nel widget popup dell'estensione e dal menu contestuale di Chrome (clic destro → „Modalità di modifica della barra di azioni"). In cima allo schermo appare una barra informativa; usando di nuovo uno qualsiasi degli interruttori si esce dalla modalità.
In modalità di modifica il normale funzionamento degli elementi è sospeso (il clic non esegue codice, i campi non ricevono il focus) — gli elementi possono invece essere disposti e ridimensionati:
Ctrl+clic = aggiungi/rimuovi dalla selezione; clic su un'area vuota o Esc = deseleziona tutto. Shift+trascinamento su un'area vuota = selezione a intervallo (rettangolo).Delete elimina tutte le etichette selezionate in una volta; il clic destro su un'etichetta dà l'opzione „Elimina etichetta"; c'è anche un pulsante „Elimina" nell'editor dell'etichetta. Gli elementi azione si eliminano nel pannello di modifica (appartengono alle regole).flow): elimina le posizioni e le dimensioni personalizzate degli elementi e tutte le etichette (con conferma).Ctrl+Z annulla l'ultima modifica (spostamento, ridimensionamento, aggiunta/modifica/eliminazione di etichetta, reset). La cronologia copre la sessione di modifica corrente.La modalità di modifica è „rigida": lo spostamento e il ridimensionamento si agganciano alla griglia da 8 px, un elemento non può essere tirato fuori dalla barra né posato su un altro — in caso di collisione entrambi gli elementi (quello spostato e quello sottostante) ricevono un riquadro rosso e, dopo il rilascio, l'elemento torna alla posizione precedente. La barra non può essere rimpicciolita al punto da far finire un elemento all'esterno; quando un nuovo elemento o un'etichetta non entra nella barra, il canvas della barra si ingrandisce automaticamente. Il clic destro del mouse sulla barra in modalità di modifica non mostra il menu „nascondi/scollega barra".
Modalità di layout della barra: la barra parte in modalità flow (flexbox classico — elementi uno dopo l'altro, verticalmente o orizzontalmente). Il primo spostamento o ridimensionamento di un elemento converte la barra in modalità custom (canvas con posizionamento libero) — visivamente senza cambiamenti, perché il layout corrente viene salvato come snapshot punto di partenza.
custom (bar.layoutMode, bar.size, action.layout, action.size) vengono salvate in modo permanente e sincronizzate tra dispositivi — a differenza della posizione di „fluttuazione" della barra sulla pagina, che resta per finestra del browser.
Ogni azione ha un tipo — selezionato con un dropdown all'inizio di ciascuna azione nella scheda del set. Sono disponibili 6 tipi:
| Tipo | UI | Quando esegue il codice |
|---|---|---|
| BUTTON | Pulsante cliccabile con label di max 6 caratteri | clic dell'utente |
| SELECT static | Dropdown personalizzato in stile barra — le opzioni si configurano nella modale | scelta di un'opzione (value = option.value) |
| SELECT js | Elemento nativo <select> — il tuo codice popola le opzioni e collega l'handler | UNA volta al render ($el = <select>) |
| INPUT | Campo di testo con placeholder (single line) | change (Enter o blur) |
| SLIDER | Cursore <input type="range"> con label + value display | change (rilascio del mouse / Enter), value = numero |
| TEXTAREA | Campo multiriga — Enter è un newline reale (NON esegue il codice) | change (blur — uscita dal campo) |
| TOGGLE3 | Segmented control a 3 stati (radio-like) — 3 mini-pulsanti, uno attivo | clic su uno stato non attivo, value = state.value dell'attivo, più stateIdx e stateLabel nello scope |
Le etichette di testo statiche non sono un tipo di azione — si aggiungono direttamente sulla barra in modalità di modifica (vedi „Modalità di modifica della barra" → etichette).
value, $el (elemento DOM), $action ({ id, label, type, el }); per TOGGLE3 anche stateIdx (0-2) e stateLabel.Il clic su „Opzioni (N)" nella scheda dell'azione di tipo SELECT apre la modale:
<select> nativo).{ name, value }. name = ciò che vede l'utente, value = ciò che arriva al JS come variabile value.<option> (variante js)action.id completo con pulsante copy + un selettore JS di esempio.::placeholder non è stilizzabile inline).min < max.(min+max)/2.change (rilascio del mouse / Tab / Enter). value = valore numerico.\n per i newline).change (blur, NON Enter — Enter in una textarea è un newline reale). L'utente esce dal campo → il valore viene salvato e il codice eseguito. value = stringa con newline.value). Label predefinite: OFF / MID / ON.colorText).value (state.value, fallback a state.label), stateIdx (0-2), stateLabel, $el (div contenitore).La scelta / il valore / la posizione del cursore / il contenuto della textarea / lo stato attivo del toggle3 vengono memorizzati automaticamente per azione. Dopo F5 il valore torna; anche dopo aver chiuso la scheda e riaperta (su una pagina che corrisponde alla regola). Singleton per action.id — un unico valore indipendente dallo specifico URL.
Formato del valore in memory per tipo:
Storage:
sessionStorage — sincrono, F5-safe, per scheda.chrome.storage.local.actionMemory[id] — cross-tab, durevole.Nessuna sincronizzazione cross-device: la memory resta locale. Due computer possono avere valori diversi (es. un filtro diverso per utente).
sessionStorage è leggibile dagli script della pagina (same origin). Per dati sensibili non usare INPUT — scrivi invece il valore direttamente nel campo „Codice JS" del set.
Ogni azione ha un action.id immutabile (formato a_<base36>_<random>). Nella scheda del set, accanto a ogni azione, c'è un badge con il numero di riga — il clic copia l'ID completo negli appunti, il tooltip mostra l'ID completo.
In user-JS fai riferimento tramite data-jz-action-id:
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');
el.value = 'nuovo valore';
el.dispatchEvent(new Event('change'));
Oppure tramite gli helper window.JZ — vedi Invocazione programmatica delle azioni da JS.
Clic destro su una qualsiasi pagina → JustZix:
Ctrl+Alt+S e all'interruttore nel popup.actionBar.enabled.I sottomenu delle finestre vengono ricostruiti su: tabs.onActivated, tabs.onUpdated (URL change) e storage.onChanged per folders/groups/rules/actionBars/cssPanes/jsPanes/jsConsoles/outputConsoles/floatingHidden. Il sottomenu TEMP è statico (sempre 4 voci).
L'estensione offre quattro tipi di finestre flottanti iniettate sulle pagine, accanto alle barre di azioni. Ogni finestra è assegnata a una cartella, a un gruppo o a un set (eredita la visibilità a cascata, come le barre di azioni) e appare sulle pagine corrispondenti per URL.
Gestione: nell'editor di cartella / gruppo / set trovi il pulsante „Finestre ▾ (N)". Il clic apre un menu con 4 tipi — scegli il tipo, si apre una modale con l'elenco delle finestre di quel livello (più le finestre ereditate dai livelli superiori). Aggiungi, dai un nome, colori, elimini.
| Tipo | Colore | A cosa serve |
|---|---|---|
| CSS pane | verde | Textarea CSS iniettata in tempo reale come <style> |
| JS pane | amber | Textarea JS eseguita a ogni modifica del codice |
| JS Console | viola | REPL — digiti il codice, Ctrl+Enter lo esegue, l'output sotto |
| Output Console | smeraldo | Anteprima in sola lettura dei log della pagina (console.* + errori) |
Finestra flottante con un campo di testo per il CSS. Ogni modifica (dopo una breve pausa) aggiorna lo <style> iniettato — vedi l'effetto in tempo reale. Il contenuto è memorizzato per scheda del browser (sopravvive a F5, scompare con la chiusura della scheda). Ideale per testare rapidamente il CSS senza salvarlo in una regola.
Un campo di testo per il JavaScript eseguito nel contesto della pagina. Il codice viene eseguito dopo una modifica (con un ritardo) oppure manualmente con il pulsante ▶ Run / la scorciatoia Ctrl+Enter. Gli errori di esecuzione appaiono in una barra rossa sotto il codice. Quando il codice è stato modificato dall'ultima esecuzione, il pulsante Run si illumina di giallo (stato „dirty").
Una console a tutti gli effetti dentro la pagina. Digiti il codice nel campo inferiore, Ctrl+Enter (o ▶) lo esegue, il risultato viene aggiunto all'area dei log sopra. Funzioni:
console.log/warn/error/info durante l'esecuzione vengono mostrate nel log (colorate per tipo).Input, output e cronologia sono memorizzati per scheda. La console esegue il codice nel MAIN world della pagina — hai accesso a tutte le variabili e funzioni della pagina.
Anteprima dei log in sola lettura — intercetta automaticamente tutto ciò che accade sulla pagina: console.log/warn/error/info/debug, eccezioni non catturate, Promise rejection non gestite, traffico di rete e push verso dataLayer, oltre al tuo logger personalizzato window.JUSTZIX.*. A differenza della JS Console (dove digiti tu il codice) — qui i log scorrono da soli.
La finestra è divisa in 6 schede, ciascuna con un contatore di voci (badge):
| Scheda | Contenuto |
|---|---|
| All | Tutte le voci da tutte le sorgenti, in ordine cronologico |
| JZconsole | Solo il tuo logger window.JUSTZIX.* |
| Console | Solo i console.log/info/warn/error/debug standard della pagina |
| Network | Le richieste di rete della pagina (tramite chrome.webRequest) |
| Errors | Eccezioni non catturate e Promise rejection — con dettagli espandibili |
| DataLayer | Push verso window.dataLayer (GTM) + anteprima live dell'oggetto |
Tra le schede e il campo di ricerca c'è una barra dei filtri che cambia in base alla scheda selezionata:
log, info, warn, error, debug. Deseleziona un livello → le righe scompaiono dall'anteprima.Sotto la barra dei filtri c'è un campo di ricerca sempre visibile. Filtra in tempo reale le voci della scheda attiva (corrispondenza parziale, senza distinzione tra maiuscole e minuscole). Esc svuota il campo.
Le voci console.* sono per default compresse — mostrano un'anteprima abbreviata (es. [PickupMap][2026-05-16T15:25Z] AUTO_SELECTION_SKIPPED: {reason: 'Lower priority source', …}). Il clic espande gli argomenti completi (oggetti/array come albero JSON espandibile), analogamente alla console di DevTools.
Network intercetta le richieste tramite chrome.webRequest (permesso webRequest nel manifest). Ogni voce mostra tra l'altro il metodo, l'URL, lo stato, il tipo di risorsa, la dimensione, la durata, l'indirizzo remoto (Remote address) e l'iniziatore (Initiator). Il buffer delle richieste è mantenuto in background, quindi appaiono anche le voci precedenti all'apertura della finestra.
La finestra DataLayer è divisa in due colonne:
dataLayer.push(...) nell'ordine degli eventi.window.dataLayer come albero JSON indicizzato (0:, 1:, …) espandibile — entri in profondità nei dati annidati, analogamente all'ispettore di oggetti di DevTools. Lo snapshot si aggiorna dopo ogni push. Nell'intestazione della colonna destra ci sono i pulsanti espandi tutto / comprimi tutto — agiscono ricorsivamente su tutto l'albero.I clic sull'interfaccia propria di JustZix (espansione dei nodi dell'albero, pulsanti della finestra) non vengono inviati a questa scheda. Se la pagina raccogliesse gli eventi click (ad es. l'auto-event di GTM), un clic nella finestra genererebbe un push verso dataLayer e reimposterebbe l'espansione dell'albero — l'estensione riconosce questi push e non li riporta (il vero window.dataLayer della pagina rimane intatto).
La Output Console mette a disposizione un'API globale per il logging dal tuo codice (JS pane, azioni, codice della pagina):
JUSTZIX.log('log normale');
JUSTZIX.warn('avviso');
JUSTZIX.error(new Error('errore')); // mostrerà lo stack trace
JUSTZIX.info({ obj: 1, arr: [2,3] });
JUSTZIX.debug('dettagli'); // nascosto per default (filtro)
Alias disponibili:
window.JUSTZIX — principale, funziona semprewindow.__JUSTZIX__ — alias sempre disponibilewindow.JZ — alias solo se la pagina non ha un proprio window.JZ (alcune pagine, es. Google Ads, occupano questo nome)Dopo la comparsa della Output Console, nel log vedrai una riga di benvenuto che indica quale alias è disponibile su quella pagina.
console.log/warn/error/info/debug(...) dalla pagina — passano anche alla normale console di DevTools (non li blocchiamo)window.JUSTZIX.*(...) — il tuo canale dedicato (non va a DevTools)throw new Error(...)) — mostrate in rosso con il punto dell'errorePromise.reject(...) senza .catchGli errori delle richieste fetch/XHR non finiscono nella scheda Errors (non sono eccezioni JS) — li trovi nella scheda Network con stato 4xx/5xx. Non catturiamo violazioni CSP né avvisi interni di Chrome.
Ctrl+Shift+H apre una finestra spostabile di guida rapida — una guida all'uso di JustZix sulla pagina: scorciatoie globali, scorciatoie dentro le finestre, la Console Output, gestione delle finestre col mouse, la modalità modifica barra e il logging nella Console Output. Funziona su qualsiasi pagina. Trascini la finestra per l'intestazione; Esc / clic fuori / × / nuovo Ctrl+Shift+H la chiude.
Colori: nella modale di gestione (pannello di modifica) ogni finestra ha un color picker — il puntino dell'intestazione, lo sfondo e il testo dell'intestazione, lo sfondo e il testo del body, il colore dei pulsanti azione.
Font e dimensione: clic destro sulla barra dell'intestazione della finestra → menu con la scelta del font (Consolas, Menlo, Monaco, Courier New e altri monospace) e della dimensione (10–24 px).
Ogni finestra si trascina per la barra dell'intestazione. Avvicinando un bordo a un'altra finestra / barra di azioni / pulsante flottante (≤ 12 px) appare un'attrazione magnetica — le finestre si agganciano in un gruppo. Il trascinamento di un gruppo agganciato sposta tutti gli elementi insieme. Le posizioni sono memorizzate per finestra del browser.
Ogni finestra ha 8 maniglie di resize: 4 negli angoli (cambio di larghezza e altezza contemporaneamente) e 4 sui bordi (cambio di un solo asse). La maniglia trascinata mantiene il bordo opposto al suo posto. Intervallo: larghezza 180–1200 px, altezza 120–900 px. La nuova dimensione (pane.size) viene salvata — per le finestre persistenti sincronizzata tra dispositivi, per le finestre TEMP per scheda.
Lo scorrimento con la rotellina del mouse all'interno di una finestra fa scorrere solo il contenuto di quella finestra — la pagina sottostante non scorre. Questo vale anche quando l'area della finestra raggiunge la fine dello scorrimento o quando il cursore si trova su una parte non scorrevole (l'intestazione, la barra dei filtri).
Ogni finestra (sia temporanea TEMP sia persistente) ha un pulsante × di chiusura nell'angolo destro dell'intestazione. Le TEMP vengono nascoste (riaprile dal menu contestuale della pagina o con una scorciatoia), le persistenti — disattivate (riattivale con la casella nel popup). Doppio clic sulla barra dell'intestazione:
Quando il bordo di una finestra si avvicina a un'altra finestra JustZix (soglia 12 px), appare un bordo rosso sul lato di aggancio (su entrambe le finestre). Rilasciare il cursore in questa posizione esegue lo snap — le finestre si muovono poi come gruppo. Tutte le finestre dell'estensione partecipano a questo meccanismo: barre di azioni, FAB, pannelli persistenti (CSS/JS/Console/Output), TEMP e l'AI Helper.
Puoi creare una finestra temporanea su qualsiasi pagina — anche una per cui non hai nessuna cartella. I TEMP pane sono uno strumento ad-hoc rapido: testi CSS/JS su una pagina estranea senza configurare regole.
Caratteristiche dei TEMP pane:
<style> in tempo reale viene aggiornato immediatamente.Creazione / chiusura (toggle):
L'AI Helper è un assistente IA integrato nell'estensione che aiuta a preparare e implementare una soluzione CSS/JS per un compito specifico sulla pagina corrente. Il modello può esaminare la pagina, testare il codice in tempo reale nelle finestre TEMP e — dopo la tua accettazione — creare una cartella, un gruppo e un set pronti.
Nel menu Impostazioni della sidebar la voce „AI Helper" apre la modale di configurazione:
chrome.storage.local). Una chiave arriva su altri dispositivi solo se selezioni il checkbox „sincronizza" accanto ad essa — in tal caso viene sincronizzata tramite il cloud di JustZix (lo stesso canale con cui l'estensione sincronizza cartelle, gruppi e set). Le chiavi senza la selezione non lasciano mai il dispositivo. Le chiamate API passano attraverso il service worker dell'estensione, quindi la chiave non finisce nel contesto della pagina.
La finestra dell'AI Helper è una finestra flottante (per scheda, come le finestre TEMP — trascinabile, ridimensionabile con 8 maniglie, croce di chiusura, una sola istanza). La apri / chiudi:
Nella finestra: scelta del provider (quando hai più di una chiave) e del modello (elenco recuperato in tempo reale), cronologia della conversazione, pulsante per svuotare la conversazione e un campo di testo (invio con un pulsante o con Ctrl+Enter). Il modello riceve automaticamente il contesto della pagina corrente — URL, titolo e un frammento di HTML.
L'AI Helper conduce la conversazione secondo un workflow stabilito:
query_page (selettori, struttura DOM) prima di scrivere il codice.read_temp_pane e read_console controlla che il codice testato non segnali errori prima di mostrarti il risultato.Il modello usa gli strumenti tramite un semplice protocollo testuale (blocco @@JZ_TOOL@@ … @@END@@) che funziona in modo identico per OpenAI, Anthropic e Gemini. Le chiamate degli strumenti e i loro risultati appaiono nella finestra come „chip" separati. Strumenti disponibili:
| Strumento | Azione |
|---|---|
query_page | Restituisce il numero di corrispondenze del selettore e l'HTML fino a 5 elementi |
list_structure | Restituisce le cartelle / gruppi / set esistenti con i loro id |
open_temp_pane | Apre una finestra temporanea TEMP (CSS o JS) |
set_temp_pane_code | Inserisce il codice nella finestra TEMP — serve per i test in tempo reale |
read_temp_pane | Verifica la finestra TEMP — per il JS esegue il codice e restituisce errore o successo |
read_console | Apre una finestra TEMP Output Console e restituisce le voci console catturate della pagina |
create_folder | Crea una cartella + il gruppo predefinito (richiede conferma) |
create_group | Crea un gruppo nella cartella (richiede conferma) |
create_rule | Crea un set con codice CSS/JS (richiede conferma) |
create_bar | Crea una barra di azioni associata a cartella/gruppo/set (richiede conferma) |
create_action | Crea un'azione (button/select/input/slider/textarea/toggle3) su una barra (richiede conferma) |
request_user_input | Mostra all'utente un form inline nella finestra di chat (campi testo / numero / colore / select / checkbox) e attende la risposta |
list_bars / list_actions / list_panes / list_all | Restituiscono elenchi di barre di azioni / azioni / finestre (CSS/JS/Console/Output) esistenti — opzionalmente filtrate per genitore |
read_folder / read_group / read_rule / read_bar / read_action | Restituiscono i dati completi di un'entità specifica (prima di una modifica pianificata) |
update_folder / update_group / update_rule / update_bar / update_action | Modificano un'entità esistente — richiede conferma (con un diff dei campi) |
create_css_pane / create_js_pane / create_js_console / create_output_console | Creano una finestra persistente sul frontend (richiede conferma) |
read_*_pane / read_*_console + update_*_pane / update_*_console | Lettura e modifica dei metadati delle finestre persistenti (nome, colore, posizione, dimensione, stile) |
read_pane_code / update_pane_code | Lettura e inserimento del codice CSS/JS in una finestra persistente (per scheda del browser) — richiede conferma |
screenshot_page | Cattura della vista corrente della pagina come immagine — l'interfaccia di JustZix viene nascosta automaticamente; per modelli compatibili vision |
read_temp_pane + read_console), chiederti dati tramite un form inline (request_user_input) e fare screenshot della pagina (screenshot_page) come immagini allegate alla richiesta successiva.
Un clic destro sulla barra dell'intestazione della finestra AI Helper apre un menu con le opzioni «Porta avanti» / «Porta dietro» (cambiare l'ordine delle finestre JustZix quando si sovrappongono), «Scollega da: X» (quando AI Helper è agganciato a un'altra finestra) e «Aspetto…». Il pannello «Aspetto…» permette di stilizzare separatamente quattro ruoli nella conversazione: i tuoi messaggi, le risposte dell'IA, i risultati degli strumenti, i form inline — ciascuno con font, dimensione, colore del testo e di sfondo propri. I valori sono salvati per dispositivo.
La finestra AI Helper partecipa allo stesso meccanismo di aggancio delle barre di azioni, delle finestre persistenti (CSS / JS / Console / Output) e delle finestre TEMP. Trascinare un bordo vicino a un'altra finestra JustZix (soglia 12 px) → attrazione magnetica, un bordo rosso indica il lato di aggancio su entrambe le finestre. Le finestre agganciate si muovono come gruppo.
Quando le finestre si sovrappongono, le opzioni «Porta avanti» / «Porta dietro» nel menu contestuale di ogni finestra (clic destro sull'intestazione) fanno un salto unico — la finestra passa sopra / sotto tutti i vicini in sovrapposizione, non serve cliccare più volte.
Lo strumento screenshot_page cattura la vista corrente della pagina e la invia al modello come immagine. L'intera interfaccia di JustZix viene nascosta automaticamente prima della cattura (FAB, barre di azioni, AI Helper, pannelli persistenti, TEMP). Un buffer dei 3 screenshot più recenti, allegati una sola volta alla richiesta successiva (dopo l'invio — rimossi dal buffer per risparmiare token). Richiede un modello compatibile vision (es. gpt-4o, claude-3+/4, gemini-1.5+/2). Sotto il chip di risultato nella chat, viene mostrata una miniatura — un clic apre la vista a schermo intero.
| Scorciatoia | Azione |
|---|---|
Ctrl+Alt+G | Crea / chiudi TEMP CSS pane |
Ctrl+Alt+H | Crea / chiudi TEMP JS pane |
Ctrl+Alt+J | Crea / chiudi TEMP JS Console |
Ctrl+Alt+K | Crea / chiudi TEMP Output Console |
Ctrl+Alt+I | Apri il pannello di modifica (finestra separata), primo set attivo su questa pagina, scheda CSS |
Ctrl+Alt+O | Come sopra, scheda JS |
Ctrl+Alt+P | Come sopra, scheda Azioni |
Ctrl+Alt+\ | Apri / chiudi la finestra AI Helper |
Ctrl+Alt+S | Modalità di modifica della barra di azioni — abilita / disabilita |
Ctrl+Z | Annulla l'ultima modifica (solo in modalità di modifica della barra) |
Delete | Elimina le etichette selezionate (solo in modalità di modifica della barra) |
Esc | Deseleziona tutti gli elementi (solo in modalità di modifica della barra) |
Ctrl+Shift+L | Svuota la scheda attiva di ogni Output Console |
Ctrl+Shift+H | Guida rapida — scorciatoie e finestre sulla pagina (ovunque) |
| Scorciatoia | Azione | Finestra |
|---|---|---|
Ctrl+Enter | Esegui il codice / invia il messaggio | JS pane, JS Console, AI Helper |
↑ / ↓ | Cronologia dei comandi | JS Console (input) |
Ctrl+L | Svuota l'output | JS Console |
Esc | Svuota il campo di ricerca | Output Console |
| Scorciatoia | Azione |
|---|---|
Ctrl+Alt+F | Focus sul campo di ricerca sopra l'editor |
Ctrl+Alt+→ / Ctrl+Alt+← | Risultato di ricerca successivo / precedente |
Enter / Shift+Enter | Cerca / risultato successivo / precedente (nel campo di ricerca) |
Ctrl+Alt+I / O / P | Cambia la scheda del set attivo a CSS / JS / Azioni (quando la card del set è renderizzata) |
Ctrl+Alt+G/H/J/K sono tasti vicini tra loro (layout Vim), tutti liberi su tutti i browser e sistemi. Ctrl+Alt+L è stato volutamente omesso — su Linux blocca lo schermo. Ctrl+Alt+S (modalità di modifica) e Ctrl+Alt+\ (AI Helper) sono nella stessa famiglia di modificatori. Le scorciatoie della Output Console (Ctrl+Shift+...) non collidono, perché si distinguono per modificatore.
L'estensione offre cinque formati di esportazione (completo, parziale, cartella, gruppo, set) con rilevamento automatico del tipo di file all'importazione, per evitare la sovrascrittura accidentale.
Nel menu Impostazioni della sidebar: Esporta impostazioni. La modale apre due modalità:
I file di esportazione parziale hanno il nome justzix-partial-DATA.json (vs. justzix-backup-DATA.json per quello completo) e all'interno il flag partial: true e il campo groups[].
Nella barra della cartella: Esporta — apre una modale con l'albero di gruppi e set (analogamente all'esportazione parziale, ma limitata a quella cartella). Vengono esportati solo i set selezionati e i gruppi a cui appartengono — i gruppi vuoti non finiscono nel file.
Formato justzix-folder — il file contiene un campo groups[] con la gerarchia di gruppi e set della cartella.
Nella barra del gruppo: Esporta — una modale con l'elenco dei set del gruppo (checkbox). File: justzix-grupa-<nome>-<data>.json, formato justzix-group.
Nella vista del set: Esporta set — scarica subito il file (senza modale). Formato justzix-rule, nome: justzix-zestaw-<nome>-<data>.json.
justzix-full — backup completo di tuttojustzix-full con partial: true — elementi selezionati dell'esportazione principalejustzix-folder — una singola cartella con l'albero di selezionejustzix-group — un gruppo + i set selezionatijustzix-rule — un singolo setDopo aver caricato un file/incollato il JSON, l'estensione riconosce automaticamente il tipo e mostra un pannello di rilevamento colorato:
| Colore | Significato | Azione |
|---|---|---|
| Teal (turchese) | Backup completo valido | Mostra il numero di cartelle/set, la data di esportazione, un avviso di sovrascrittura |
| Viola | Backup parziale (partial: true) | Scelta della modalità: Unisci con le attuali o Sostituisci tutto |
| Arancione | Tipo di file errato in questa modale | Messaggio che indirizza alla modale corretta, pulsante Importa bloccato |
| Rosso | Errore di parsing del JSON / formato non valido | Pulsante Importa bloccato |
1 / nadpisz — sovrascrivi le cartelle esistenti (eliminerà i loro gruppi e set)2 / kopia (predefinita) — importa come copie con nuovi ID, "(import)" nel nome della cartella, nessuna perdita di dati esistentiNella barra della cartella: Importa. Controlla i conflitti per ID e per nome:
Nella barra del gruppo: Importa — accetta 3 formati:
justzix-group — inserisce tutti i set del gruppo dal filejustzix-folder — inserisce tutti i set di tutti i gruppi della cartellajustzix-rule — inserisce un setTutti i set del file finiscono nel gruppo corrente con nuovi ID (l'operazione è sempre di tipo "aggiungi copia" — nessun conflitto).
Nella vista del set: Importa set — accetta solo justzix-rule. Prompt con 3 opzioni:
1 / zastap — sostituisci il contenuto del set corrente (id e groupId conservati)2 / kopia (predefinita) — aggiungi come nuovo set accanto a quello corrente, nello stesso gruppo, con l'aggiunta di "(import)"Impostazioni → Sincronizzazione cloud apre la modale dell'account di sincronizzazione. L'estensione mantiene la tua libreria (cartelle, gruppi, set, azioni, barre di azioni, finestre sul front-end) nel cloud di justzix.com e la mantiene coerente tra i dispositivi. La sincronizzazione funziona solo dopo l'accesso — senza un account l'estensione funziona solo in locale.
Durante l'accesso, l'estensione confronta i dati locali con i dati nel cloud:
| Scelta | Cosa fa |
|---|---|
| Usa i dati del cloud | Svuota la libreria locale e ricostruisce lo stato dell'account dal server |
| Invia i miei dati locali | I dati locali diventano canonici — elimina ciò che era nel cloud |
| Unisci | Combina entrambi gli insiemi — aggiunge le entità mancanti, mantenendo quelle esistenti |
Puoi anche fare Annulla — l'estensione esegue allora la disconnessione e non cambia nulla.
Dopo la prima riconciliazione, la sincronizzazione gira in background: l'estensione invia le modifiche e scarica le nuove entità circa una volta al minuto. Una modifica fatta su un dispositivo compare sugli altri dopo poco tempo. Il pallino di stato accanto alla voce "Sincronizzazione cloud" indica se l'account è connesso.
La scheda Stato della modale di sincronizzazione mostra lo stato dell'account e offre i pulsanti delle azioni:
Contatori delle entità presenti sull'account: cartelle, gruppi, set, azioni, barre di azioni, finestre sul front-end. Vengono conteggiate solo le entità raggiungibili nell'albero (un gruppo deve avere una cartella esistente, un set — un gruppo, una barra/finestra — un genitore esistente) — in modo coerente con i contatori del Pannello. Si aggiornano all'apertura del pannello e dopo una sincronizzazione manuale.
Un registro locale al dispositivo delle ultime sincronizzazioni. La pagina mostra le ultime 10 voci; il pulsante "Mostra cronologia completa" apre una finestra con l'elenco completo (fino a 100 voci). Ogni voce contiene:
Il registro è locale — non viene sincronizzato tra i dispositivi. Una voce viene creata dopo ogni ciclo di sincronizzazione che ha realmente cambiato qualcosa; un "Sincronizza ora" manuale lascia sempre una voce, anche senza alcuna modifica.
Le statistiche d'uso (applicazioni CSS, esecuzioni JS, visualizzazioni di finestre) sono sincronizzate come entità separate per-dispositivo — la scheda del Pannello le somma da tutti i dispositivi accoppiati. Il tema e la lingua sono sincronizzati come impostazione comune dell'account e applicati alla successiva apertura del pannello sull'altro dispositivo.
Un'alternativa all'invio di un file JSON su una chat. Generi un link pubblico con una durata di vita (1h / 6h / 12h / 24h / 48h) e lo passi al destinatario. Il backend justzix.com conserva il payload nel cloud fino alla scadenza, poi viene eliminato.
Richiede un account di sincronizzazione (Sync) connesso. Il token stesso è un secret pubblico — chiunque abbia il link può scaricare, quindi non inviarlo su canali pubblici se il contenuto è sensibile.
JZS-XXXX-XXXX-XXXX-XXXX (16 caratteri Crockford base32, ~80-bit di entropia). Viene accettato anche l'intero URL https://www.justzix.com/s/JZS-... — l'estensione lo analizza e normalizza (lettere ambigue I/L→1, O→0, U→V).
Il superamento del limite = un errore con un messaggio. Revoca i link inutilizzati nel pannello I miei share.
Il pulsante „Condividi URL" in quattro punti di accesso, accanto a „Scarica file":
justzix-full)justzix-folder)justzix-group)justzix-rule)Il clic apre la modale di generazione del link: subject + summary di cosa condividi, radio con il TTL (predefinito 24h), „Genera link". Dopo il successo la modale passa alla vista del risultato con due valori copiabili:
https://www.justzix.com/s/JZS-... — da inviare a qualcuno senza l'estensione (mostrerà una pagina landing)JZS-XXXX-XXXX-XXXX-XXXX — da incollare nell'estensione del destinatario in „Importa da URL"Ognuno ha il proprio pulsante „Copia". È mostrato anche l'orario di scadenza nel fuso orario locale.
Impostazioni → I miei share (una modale separata, non parte della sincronizzazione — sono due funzionalità diverse). Mostra l'elenco dei link attivi: un counter nell'intestazione X/20 attivi · Y MB / 50 MB e, per ogni share, una scheda con:
X cartelle · Y gruppi · Z set · N righe di JS · A KBLa revoca non ritira il contenuto già scaricato. Se qualcuno ha fatto in tempo a scaricare il payload, lo ha localmente. Lo share è un "best-effort time-limit", non un DRM.
Impostazioni → Importa da URL (tra „Importa impostazioni" e „Sincronizzazione cloud", icona della catena). La modale ha due passaggi:
Passo 1 — input. Incolli il link o solo il token. Validazione client-side: il token viene estratto dall'URL, normalizzato Crockford-base32, vengono verificati 16 caratteri + il formato. Formato errato → un messaggio con un suggerimento sul formato corretto.
Passo 2 — preview. L'estensione mostra il riepilogo dello share:
Se lo share contiene JavaScript (jsLines > 0) — appare un banner di avviso rosso con il link „Mostra codice JavaScript". Apre un overlay con il codice JS completo di ogni regola e azione — controllalo prima di importare, perché il codice verrà eseguito sulle pagine corrispondenti.
Passo 3 — importazione. Clic su „Importa" → il backend restituisce il payload completo → l'estensione crea nuove entità con ID sempre nuovi (non sovrascrive mai quelle esistenti per ID):
| Tipo | Cosa accade |
|---|---|
justzix-rule | Crea una nuova cartella + il gruppo „Predefinito" + il set importato |
justzix-group | Crea una nuova cartella + il gruppo importato + i set |
justzix-folder | Aggiunge come nuova cartella top-level |
justzix-full | Merge: aggiunge tutti i folders/groups/rules con ID nuovi |
Nome del nuovo container: <nome-del-mittente o "Import"> <data PL> — puoi poi rinominarlo / spostarlo a piacere.
| Errore | Messaggio |
|---|---|
| Token non valido | „Il token non è valido. Verifica di aver copiato l'intero link." |
404 not_found | „Questo link è scaduto o è stato revocato dal mittente. Chiedine uno nuovo." |
429 rate_limited | „Troppi tentativi. Attendi un momento e riprova." |
| 5xx / network | „Problema con il server. Riprova." |
Il backend non distingue un 404 „non è mai esistito" da un 404 „scaduto / revocato" — volutamente, per non rivelare se un token sia mai esistito.
Ogni azione (dalla scheda „Azioni" nella scheda del set) può essere invocata programmaticamente dal JS del set o dal codice di un'altra azione. Il namespace globale window.JZ viene installato nel MAIN world automaticamente prima di ogni esecuzione di user-JS.
| Chiamata | Cosa fa |
|---|---|
JZ.click(labelOrId) | Clicca programmaticamente. Semantica per tipo di azione: BUTTON → el.click(). SELECT static (pulsante con dropdown) → el.click() (apre il popup; l'utente sceglierà l'opzione manualmente). SELECT js (<select> nativo) → imposta value sulla prima opzione non-disabled e fa il dispatch di change. INPUT / TEXTAREA / SLIDER → el.click() — attenzione: non cambia il valore né esegue l'handler change. Per impostare il valore: const el = JZ.action('LBL'); el.value = 'X'; el.dispatchEvent(new Event('change')). TOGGLE3 — el.click() colpisce il contenitore; per attivare uno stato specifico usa el.querySelector('.jz-toggle3-state[data-jz-state-idx="1"]').click(). Restituisce true/false. |
JZ.value(labelOrId) | Getter unificato del valore corrente. INPUT / TEXTAREA → el.value nativo. SLIDER → wrap.dataset.jzValue (wrap è un DIV, il renderer imposta il data attr dall'iniziale + su input/change). SELECT(js) → el.value nativo. SELECT(static) → el.dataset.jzValue (il renderer lo imposta a ogni scelta). TOGGLE3 → el.dataset.jzValue (state.value dell'attivo; fallback a state.label). BUTTON → null. Elemento non trovato → null. |
JZ.setValue(labelOrId, value) | Setter programmatico. INPUT/TEXTAREA → el.value = String(v) + dispatch input+change. SLIDER → imposta il <input.jz-action-slider> nativo + dispatch. SELECT(js) → el.value = String(v) + dispatch change. SELECT(static) + TOGGLE3 → invia un CustomEvent 'jz-set-value', un listener in content.js esegue l'intero flow (memory + UI + esegue il codice). Lookup TOGGLE3: per state.value → fallback a state.label → fallback all'idx numerico 0-2. BUTTON → false. Restituisce true/false. |
JZ.action(labelOrId) | Restituisce l'elemento dell'azione (button / select / input / textarea / slider / contenitore toggle3) o null. Lookup: prima per data-jz-action-id, poi case-insensitive per data-jz-key (label in MAIUSCOLO). Funziona per tutti i 6 tipi di azione. |
JZ.actionById(id) | Lookup esclusivamente per il action.id stabile (es. 'a_mp1deeq3_uimd8l'). Consigliato per azioni senza label o quando vuoi certezza. |
JZ.actions() | Array di tutti gli elementi azione visibili (button + select + input + textarea + slider + toggle3) sulla pagina corrente. |
JZ.labels() | Array delle etichette originali (case conservato come l'hai digitato). |
// === Lettura ===
const filter = JZ.value('FILT'); // INPUT/TEXTAREA — string
const opacity = JZ.value('OPAC'); // SLIDER — string numeric ("75")
const mode = JZ.value('MODE'); // SELECT static — string (option.value)
const theme = JZ.value('THM'); // TOGGLE3 — state.value dello stato attivo
// === Impostazione ===
JZ.setValue('FILT', 'nuovo valore'); // 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 esegue il flow (memory + UI + codice)
JZ.setValue('THM', 'dark'); // TOGGLE3 — lookup per state.value (fallback a label, poi idx)
JZ.setValue('THM', 2); // TOGGLE3 — equivalente; anche l'idx numerico funziona
| Chiamata | Cosa fa |
|---|---|
JZ.bars() | Tutti i contenitori .jz-actions-bar (ActionBar) visibili sulla pagina. |
JZ.barById(id) | L'elemento della barra per data-jz-bar-id. |
JZ.floatingBtn() | Il pulsante flottante principale #justzix-floating-btn o null (quando nascosto). |
JZ.click / JZ.action è case-insensitive per label, ma esatto per il action.id stabile. Per le azioni senza label (tipicamente INPUT) usa JZ.actionById('a_...').
Nel campo „Codice JS" dell'azione hai automaticamente a disposizione delle variabili — iniettate come const dal background service worker prima dell'esecuzione:
| Variabile | Cosa contiene | Quando disponibile |
|---|---|---|
$el | L'elemento DOM di questa azione (input / select / button / textarea / contenitore toggle3) | sempre quando esiste action.id |
$action | { id, label, type, el } | sempre |
value | Il valore corrente per tipo: SELECT static → option.value; INPUT/TEXTAREA → contenuto del campo; SLIDER → numero; TOGGLE3 → state.value dello stato attivo (fallback a state.label quando value è vuoto). | SELECT static, INPUT, TEXTAREA, SLIDER, TOGGLE3. SELECT js: il codice viene eseguito UNA volta al render — value è vuoto. |
stateIdx | Integer 0-2 — indice dello stato attivo (lo stato da cui è partito il clic). | solo TOGGLE3 |
stateLabel | String — label dello stato attivo (max 5 caratteri). | solo TOGGLE3 |
Nella modale di configurazione dell'azione di tipo SELECT e INPUT il pannello „ID stabile dell'azione" mostra il action.id completo con un pulsante copy e un selettore JS di esempio (document.querySelector('[data-jz-action-id="..."]')). Sotto l'elenco dei BUTTON si vedono i chip JZ.click('LBL') — il clic su un chip copia lo snippet negli appunti.
visible: true, la barra è visibile nell'albero + l'URL della pagina corrisponde alle regole).JZ.click() restituirà false, JZ.action() restituirà null.JZ.click().// Codice dell'azione "AUTO"
JZ.click('LOAD'); // clic sull'azione LOAD (es. carica i dati)
setTimeout(() => JZ.click('PROC'), 500); // 500ms dopo PROC (elabora)
setTimeout(() => JZ.click('SAVE'), 1500); // 1500ms dopo SAVE (salva)
Dopo la comparsa di un elemento dinamico, clicca l'azione che lo rimuove:
// Codice JS del set — observer su un modal che appare dinamicamente
const observer = new MutationObserver(() => {
if (document.querySelector('.cookie-banner')) {
JZ.click('CCK'); // clicca l'azione che rimuove il banner
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
// JZ.click su un INPUT non cambia il valore — usa il pattern con il dispatch di 'change':
const el = JZ.action('SRCH'); // o JZ.actionById('a_mp1deeq3_uimd8l')
if (el) {
el.value = 'nuovo filtro';
el.dispatchEvent(new Event('change'));
}
Se preferisci lavorare con il DOM direttamente (es. cambi uno stile, non invochi):
// Lookup per ID stabile (consigliato — resistente al cambio di label):
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');
// Lookup per label (case-insensitive — MAIUSCOLO in data-jz-key):
const btn = document.querySelector('[data-jz-key="MYBT"]');
btn.style.opacity = '0.5'; // attenua
btn.dataset.busy = 'true'; // attributo personalizzato
Dove vivono gli elementi azione nel DOM:
| Tipo di azione | Contenitore | Selettore dell'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 = valore attualmente selezionato) |
| 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); il cursore stesso: .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="..."] (contenitore; data-jz-value = state.value dell'attivo); i pulsanti di stato: .jz-toggle3-state[data-jz-state-idx="0|1|2"], l'attivo ha la classe .active |
Tutti gli elementi hanno l'attributo data-jz-action-id (identificatore stabile unico). Il selettore .jz-actions-bar è sicuro — non collide con il DOM della pagina.
data-jz-key) funziona per tutti i tipi di azione. Ogni elemento azione ha sia data-jz-label (case originale) sia data-jz-key (MAIUSCOLO). Per sicurezza (es. quando la label può cambiare) usa il data-jz-action-id stabile o JZ.actionById().
Il campo "Cerca" filtra l'albero delle cartelle. Logica di corrispondenza:
Il match è case-insensitive, l'evidenziazione in giallo mostra il punto della corrispondenza.
Dopo aver cliccato l'icona dell'estensione nella toolbar di Chrome appare il widget popup con un grande interruttore verde/grigio „Plugin enabled". In modalità disabilitata nessun CSS/JS viene iniettato su nessuna pagina, indipendentemente dalle impostazioni delle cartelle. Il pulsante flottante è allora disabilitato (Halt Red, opacity 0.7). Lo stato sopravvive al riavvio di Chrome.
Un pulsante accanto al campo del pattern URL — inserisce protocol://host/* dalla scheda attiva. Creazione di una cartella in 2 secondi. L'indirizzo della pagina delle opzioni dell'estensione viene ignorato — viene presa la scheda esterna più recente.
Inline, sul lato destro del campo URL, appare l'informazione "Corrisponde a X schede aperte" o un avviso. Cattura i refusi immediatamente.
Uno snapshot del CSS e del JS viene creato 3 secondi dopo l'ultima modifica (debounce). Limite di 5 versioni — la più vecchia viene espulsa. Al ripristino di una versione il contenuto corrente viene aggiunto alla cronologia come snapshot più recente, quindi puoi sempre annullare l'annullamento.
Nell'intestazione della scheda del set c'è un campo per i tag — inseriscili separati da virgole. Appaiono come piccole etichette nella sidebar accanto al nome del set. La ricerca trova anche per tag.
Ogni cartella può avere una propria etichetta sul pulsante flottante (max 3 lettere, MAIUSCOLO) e un colore (color picker). L'etichetta e il colore aiutano a riconoscere visivamente quale progetto è attivo su una pagina.
Ogni pulsante azione conta quante volte è stato cliccato. Aiuta a vedere quali sono davvero usati.
Sotto l'editor CSS appare una barra con l'elenco dei problemi di sintassi:
/* ... */})} (con il numero di riga)È una semplice validazione sintattica — non verifica la correttezza di properties/values. Il CSS con un errore viene comunque iniettato (il browser ignorerà semplicemente le regole errate).
Nella modale di importazione di una singola cartella, dopo aver caricato il file, appare un elenco di set con una metrica:
Contenuto del file (3 set):
Auto-login CSS: 0L • JS: 4L JS
Nascondi banner cookie CSS: 8L • JS: 0L
Debug GTM CSS: 0L • JS: 12L • 2 azioni (8L) JS
Un avviso con il numero di righe di JS, se ce ne sono. Il clic sul pulsante JS mostra il codice completo da controllare prima dell'importazione.
Ogni set JS viene eseguito separatamente, con il proprio try/catch. Un errore in un set non blocca l'esecuzione degli altri. Gli errori vengono loggati nella console con il nome del set/azione e lo stack trace completo.
Un indicatore dell'uso della memoria nel menu Impostazioni della sidebar (es. 1.2 MB / 10 MB). Rosso sopra l'80%.
Un checkbox sopra l'elenco — nasconde i set contrassegnati come indipendenti (○) e mostra solo quelli attivi nella cartella (●). Aiuta a filtrare i set "manuali" quando la cartella ne ha molti. Reagisce immediatamente ai cambiamenti degli interruttori.
L'estensione ha una chiave fissa nel manifest (la build Firefox — un gecko.id fisso), il che significa che l'ID dell'estensione è immutabile tra gli aggiornamenti — i dati (cartelle, regole, impostazioni) vengono conservati. JustZix viene distribuito per quattro browser: Chrome, Edge, Opera e Firefox.
Nel menu Impostazioni (accanto al numero di versione) compare un banner verde "È disponibile una nuova versione" quando il server pubblica un pacchetto più recente di quello installato. Il banner contiene un link di download. Il controllo è silenzioso — senza rete il banner semplicemente non viene mostrato.
chrome://extensions/ (Edge: edge://extensions/) trova l'estensione e clicca l'icona di aggiornamento sul riquadroLa build Firefox si carica tramite about:debugging → "Questo Firefox" → "Carica componente aggiuntivo temporaneo" (puntando a manifest.json nella cartella justzix_firefox/). Un aggiornamento = ricaricare dopo aver sovrascritto i file.
"key" nel manifest (Chromium) / gecko.id (Firefox)/* Nascondi le pubblicità tipiche */
.ad, .ads, .advertisement,
.banner-ad, [class*="ad-banner"],
[id*="google_ads"] {
display: none !important;
}
/* Nascondi il cookie banner */
.cookie-banner, #cookie-notice {
display: none !important;
}
html {
filter: invert(0.92) hue-rotate(180deg);
}
img, video, picture, iframe, [style*="background-image"] {
filter: invert(1) hue-rotate(180deg);
}
Trucco: invertire l'intera pagina e re-invertire le immagini. Funziona sorprendentemente bene sulla maggior parte delle pagine.
/* Colora tutti gli elementi 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;
}
/* Aumenta la leggibilità delle tabelle admin */
table.admin-list td, table.admin-list th {
padding: 8px 12px !important;
font-size: 14px !important;
}
/* Header sticky della tabella */
table.admin-list thead {
position: sticky;
top: 0;
background: white;
z-index: 10;
}
/* Righe alternate */
table.admin-list tbody tr:nth-child(odd) {
background: #f9fafb;
}
/* Spesso le pagine hanno un max-width rigido di 1200px - forza la larghezza */
.container, .main-content, main {
max-width: 95% !important;
width: 95% !important;
}
body::before {
content: "AMBIENTE 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; }
Ottimo per il pattern https://dev.example.com/* per non confondere gli ambienti.
// Solo per dev! Non salvare mai password reali
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';
});
// Intercetta 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);
};
}
// Intercetta 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);
};
}
Ideale per fare il debug della configurazione delle analitiche in produzione senza toccare il codice.
// Ogni 500ms per 10s controlla e clicca i pulsanti "Accetta"
let attempts = 0;
const interval = setInterval(() => {
if (++attempts > 20) return clearInterval(interval);
const buttons = [...document.querySelectorAll('button, a')];
const target = buttons.find(b =>
/akceptuj|zgoda|accept all/i.test(b.textContent || '')
);
if (target) {
target.click();
clearInterval(interval);
}
}, 500);
document.addEventListener('keydown', (e) => {
// Ctrl+Shift+S - salva il modulo
if (e.ctrlKey && e.shiftKey && e.key === 'S') {
e.preventDefault();
document.querySelector('button[type="submit"]')?.click();
}
// Ctrl+Shift+E - passa alla modifica (esempio non testato)
if (e.ctrlKey && e.shiftKey && e.key === 'E') {
e.preventDefault();
document.querySelector('a.edit-link')?.click();
}
});
// Salta i fastidiosi confirm e beforeunload durante i test
window.confirm = () => true;
window.alert = (msg) => console.log('[alert soppresso]', msg);
window.onbeforeunload = null;
window.addEventListener('beforeunload', e => {
e.stopImmediatePropagation();
}, true);
// Ricorda - il CSS puro non lo fa quando il genitore ha display:none
window.addEventListener('load', () => {
const target = document.querySelector('.important-info');
const newParent = document.querySelector('.sidebar');
if (target && newParent) {
newParent.prepend(target);
}
});
// Mostra tutti gli input type="hidden" nascosti
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);
});
Scorciatoia: CLR Colore: rosso
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 }));
});
Scorciatoia: FILL Colore: verde
const data = {
email: 'test@example.com',
phone: '600000000',
firstName: 'Mario',
lastName: 'Test',
street: 'Via Test 1',
city: 'Roma',
zip: '00100'
};
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 }));
}
});
Scorciatoia: CART Colore: arancione
// Per un negozio tipico — clicca il primo "aggiungi al carrello"
const btn = document.querySelector('.add-to-cart, [data-action="add-to-cart"]');
if (btn) btn.click();
else alert('Pulsante aggiungi al carrello non trovato');
Scorciatoia: COPY Colore: viola
navigator.clipboard.writeText(location.href).then(() => {
console.log('Copiato:', location.href);
});
Scorciatoia: TKN Colore: giallo
// Estrae il token JWT da localStorage / cookies per il debugging
const token = localStorage.getItem('authToken')
|| document.cookie.match(/token=([^;]+)/)?.[1];
if (token) {
navigator.clipboard.writeText(token);
alert('Token copiato. Primi caratteri: ' + token.slice(0, 20) + '...');
} else {
alert('Nessun token');
}
Scorciatoia: SQL Colore: blu
// Intercetta tutte le fetch e mostrale nella console
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('Logging delle fetch abilitato. Ogni chiamata apparirà nella console.');
Scorciatoia: ENV Colore: grigio
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));
Ogni progetto ha una propria cartella con un proprio pattern URL. Puoi avere cartelle:
https://dev.justzix.com/* con un banner rosso "DEV"Nel pannello laterale le cartelle private si possono abilitare/disabilitare rapidamente. L'esportazione di una singola cartella consente di condividere la configurazione con il team.
Su ogni dev/staging aggiungi un banner e l'auto-login. Un set CSS (banner) e un set JS (auto-fill). Crei una cartella separata per ogni ambiente, si combinano con un semplice checkbox.
Un pannello di azioni con pulsanti: FILL (dati di test), CART (acquisto di test), CLR (svuota il modulo), STATE (mostra lo stato dell'applicazione in un alert). Senza programmatore, senza console, con un clic.
I blog/le documentazioni preferiti con migliore leggibilità — contenitore più largo, font, modalità scura. Ogni pagina in una cartella separata, "Attivo" lasciato sempre abilitato.
Un set per ogni dominio con JS che intercetta dataLayer.push e gtag. Lo abiliti quando un cliente segnala un problema con le analitiche, senza toccare il codice della pagina.
Il pattern *://*.justzix.com/admin/* e CSS che migliora tabelle, elenchi, moduli. Più un'azione "Filtro di test" che imposta automaticamente i filtri per un workflow tipico.
L'azione RO (read-only) inietta CSS che nasconde tutti i pulsanti "Elimina", "Salva", "Invia" — una temporanea "modalità di sola lettura" per non sbagliare.
// Nascondi i pulsanti pericolosi
document.querySelectorAll(
'button[type="submit"], .delete-btn, .danger-btn, [class*="delete"]'
).forEach(b => b.style.display = 'none');
console.warn('MODALITÀ READ-ONLY abilitata');
[JustZix] JS error!important o selettori più specifici.css-1abcd che cambiano. Usa attributi ([data-testid]) o selettori stabiliL'estensione ha una chiave fissa nel manifest — gli aggiornamenti successivi conservano i dati. Se nonostante ciò i dati sono spariti:
chrome://extensions/ usa il pulsante di aggiornamento, non rimuovere e reinstallareÈ normale — le posizioni sono per finestra del browser e conservate nella memoria di sessione (chrome.storage.session). Dopo la chiusura della finestra le posizioni scompaiono, in una nuova finestra parti da quelle predefinite. La posizione sopravvive alla navigazione tra schede nella stessa finestra.
Sì — l'esportazione parziale contiene solo le cartelle e i set selezionati più le relative impostazioni di visibilità. Non contiene le posizioni dei pannelli flottanti (sono per finestra) né altre preferenze globali. Per un backup completo usa la modalità "Tutto".
La modalità "Unisci" abbina le cartelle per ID. Se il file importato aveva un ID in conflitto con una cartella esistente (es. lo stesso file era già stato importato una volta), appare un prompt: 1 sovrascrivi / 2 copia (predefinita, sicura) / Annulla. Scegliendo 2 ottieni copie con nuovi ID e l'aggiunta di "(import)" nel nome della cartella — non perdi nulla.
La freccia di espansione appare solo se la cartella ha dei set. Una cartella vuota ha un puntino grigio invece della freccia. Lo stato di espansione di ogni cartella viene memorizzato in chrome.storage.local.
Questi pulsanti sono nella barra della cartella (in cima all'area di modifica), accanto al pulsante "Elimina cartella". Da non confondere con i pulsanti nel menu Impostazioni, che riguardano l'insieme di tutte le impostazioni.
Il JS di regole e azioni viene eseguito nel contesto della pagina con una strategia a livelli resistente alle regole rigide della Content Security Policy. La maggior parte delle pagine — inclusi grandi servizi come Facebook — funziona subito, senza configurazione.
Le pagine con una CSP molto rigida (alcune banche, siti aziendali) possono bloccare l'esecuzione. Affinché il JS funzioni su ogni pagina, abilita per JustZix l'opzione «Consenti script utente»: apri chrome://extensions, vai ai dettagli di JustZix e attiva l'interruttore (i browser più vecchi richiedono anche la modalità sviluppatore). Quando una pagina blocca l'esecuzione, la finestra JavaScript / la Console JS mostra un messaggio adeguato.
JustZix — manuale