Injection de styles CSS personnalisés, de code JavaScript et de boutons d'action sur n'importe quelle page
JustZix permet d'injecter automatiquement votre propre CSS et JavaScript sur des pages choisies, ainsi que de définir des boutons d'action (raccourcis exécutant des fragments de code à la demande).
https://justzix.com/*. On peut activer/désactiver tout un dossier d'un seul clic.Chaque règle ainsi que chaque groupe peut recevoir sa propre liste de motifs d'URL supplémentaires (chip-input). Quand la liste est vide — l'élément fonctionne partout où le motif du dossier correspond. Quand vous définissez par ex. https://justzix.com/admin/* — l'élément ne fonctionnera que sur les sous-pages de l'admin.
| Motif du dossier | Motifs de la règle | Fonctionne sur |
|---|---|---|
https://justzix.com/* | (vide) | tout le domaine justzix.com |
https://justzix.com/* | https://justzix.com/admin/* | uniquement la section /admin/ |
https://justzix.com/* | https://justzix.com/produkty/*https://justzix.com/koszyk | uniquement les sous-pages produits + panier |
*://localhost:*/* | *://localhost:3000/* | uniquement le port 3000 (dev) |
Pour les nouveaux utilisateurs, JustZix dispose d'un tutoriel interactif intégré qui vous guide pas à pas dans la création d'une solution complète — d'un dossier, en passant par un groupe et un jeu de règles, jusqu'au code CSS/JS et un bouton d'action. Les conseils apparaissent sous forme de bulles à côté des éléments successifs du panneau.
Comment le lancer :
Dans la fenêtre « Centre de tutoriels », vous choisissez un tutoriel et cliquez sur Commencer. Pendant le tutoriel :
Accessible via un clic droit sur l'icône de l'extension → « Options », ou un clic sur l'icône → bouton « Panneau d'édition ».
Un petit bouton rond apparaît automatiquement sur les pages correspondant à n'importe quel dossier. Par défaut il affiche le texte ZIX, mais chaque dossier peut avoir son propre libellé.
Libellé du dossier : dans la barre du dossier, à l'extrême gauche (à côté du sélecteur de couleur) se trouve un champ de texte pour le libellé du bouton. Limites imposées : 3 caractères max, toujours en MAJUSCULES (la conversion en majuscules se fait immédiatement pendant la saisie). Le champ accepte lettres et chiffres — exemples : ZIX, QA, DEV, ADM, X. Lorsque plusieurs dossiers correspondent, le libellé est pris du premier qui en a un de défini ; les autres sont ignorés (champ vide = repli sur ZIX).
État indiqué par la couleur (palette de marque) :
Couleur du dossier : si vous définissez le sélecteur de couleur sur un dossier, le bouton flottant sur les pages correspondantes prendra cette couleur. Les états « mixte » et « off » modulent automatiquement la saturation. Lorsque plusieurs dossiers correspondent, la couleur du premier dossier ayant une couleur définie est utilisée.
En accédant au panneau d'édition, l'extension ouvre le Tableau de bord — une page d'accueil avec un récapitulatif de la bibliothèque et des raccourcis rapides. Auparavant, le panneau sélectionnait automatiquement le premier dossier de la liste ; vous voyez désormais une vue d'ensemble à la place.
Le Tableau de bord est accessible par un clic sur le logo dans la barre latérale et par l'icône « maison » de la barre de fil d'Ariane de chaque éditeur (dossier, groupe, règle). L'en-tête du Tableau de bord lui-même possède également une icône « maison » — son clic actualise les données (recharge la bibliothèque depuis le stockage et reconstruit le Tableau de bord).
Le Tableau de bord est organisé en rangées fixes de cartes :
chrome.storage.local ainsi que la date de la dernière sauvegarde cloud.Les cartes « Derniers exemples » et « Du blog » récupèrent leur contenu depuis le site du projet ; lorsque le point de terminaison est indisponible (par ex. hors ligne), les deux cartes sont masquées. La version de l'extension est revérifiée à chaque ouverture du tableau de bord.
Le panneau de gauche en mode édition affiche les dossiers de manière hiérarchique — on peut déployer chaque dossier pour voir ses règles et accéder à l'édition d'une règle précise.
| Élément | Action |
|---|---|
| Flèche de déploiement | Déploie/replie la liste des règles ou des groupes (mémorisé entre les sessions) |
| Clic sur le nom d'un dossier (replié) | Sélectionne le dossier, ouvre l'éditeur de dossier et déploie ses groupes/règles |
| Clic sur un dossier déjà sélectionné | Bascule : replie (un clic suivant le redéploie) — idem pour un groupe |
| Clic sur le nom d'un groupe (replié) | Sélectionne le groupe, ouvre l'éditeur de groupe et déploie ses règles |
| Clic sur le nom d'une règle | Ouvre la vue d'une règle individuelle (éditeur de règle) |
| Case à cocher du dossier | Active/désactive tout le dossier (cascade vers les groupes et leurs règles actives) |
| Case à cocher du groupe | Active/désactive le groupe (cascade vers ses règles actives) |
| Case à cocher de la règle | Pilote indépendamment une règle individuelle |
| Statut ●/○ à côté du dossier/groupe/règle | Actif : ● actif, ○ inactif (désactivation imposée) |
| C J A U à côté de la règle | Étiquettes de contenu : C = a du CSS, J = a du JavaScript, A = a des actions, U = a ses propres motifs d'URL. Elles n'apparaissent que lorsque le champ correspondant n'est pas vide. |
| Barre de couleur à gauche | La couleur du dossier est dessinée par box-shadow inset — elle ne décale pas la position du nom du dossier (les dossiers avec et sans couleur sont alignés) |
| Poignée de glisser-déposer | Saisissez à la souris et faites glisser pour réordonner |
expandedFolders, expandedGroups).
Survolez un dossier, un groupe ou une règle — une poignée de glisser-déposer apparaît à gauche. Saisissez à la souris et faites glisser :
Une barre verticale entre la barre latérale et l'éditeur masque le panneau de gauche — utile quand vous avez besoin de plus de place pour l'éditeur. L'état est mémorisé entre les sessions. Après affichage/masquage, CodeMirror met automatiquement à jour sa largeur.
Sous chaque éditeur (CSS, JS, code d'action) se trouve une barre horizontale avec une poignée à tirer verticalement. Saisissez à la souris et tirez vers le bas pour agrandir l'éditeur. Hauteur min. 80 px, max. illimitée — la page défile naturellement avec son contenu.
Au-dessus de chaque éditeur de code CodeMirror — CSS et JavaScript dans la carte de règle ainsi que le « Code JS » dans l'éditeur d'action — se trouve une barre de recherche : un champ de texte et un bouton avec une icône de loupe.
n / total.| Raccourci | Action |
|---|---|
Enter | Rechercher (nouvelle requête) ou passer au résultat suivant (quand la requête est inchangée) |
Shift+Enter | Résultat précédent |
Ctrl+Alt+→ / Ctrl+Alt+← | Résultat suivant / précédent — fonctionne depuis l'éditeur et depuis le champ de recherche |
Ctrl+Alt+F | Depuis l'éditeur de code, déplace le focus vers le champ de recherche |
Esc | Efface le champ de recherche |
Un motif d'URL définit sur quelles pages le dossier s'active.
| Motif | Correspond à |
|---|---|
https://justzix.com/admin | Uniquement cette URL exacte |
https://justzix.com/* | Toutes les pages de justzix.com |
https://*.justzix.com/* | Tous les sous-domaines et pages |
*://localhost:*/* | Toutes les applications locales |
https://example.com/admin/* | Uniquement la section /admin/ et ses sous-pages |
*example* | Toute URL contenant « example » |
?id=123) et le hash (#section), sauf si vous les incluez dans le motif.
Chaque règle a deux indicateurs indépendants :
| Indicateur | Signification |
|---|---|
| Actif ● | Indique si cette règle est pilotée par l'interrupteur du dossier et du groupe (les deux niveaux cascadent vers les règles actives). Activer un dossier ou un groupe active toutes les règles actives qu'il contient. |
| Activé ✓ | État actuel : si la règle est en ce moment injectée sur les pages. |
Bascule du dossier → change le statut « activé » de toutes les règles actives de ses groupes
Bascule du groupe → change le statut « activé » de toutes les règles actives de ce groupe
Bascule de la règle → change uniquement le statut « activé » de cette règle
Les règles avec Actif : NON (badge ○) sont ignorées lors des cascades — vous les pilotez uniquement manuellement, indépendamment de l'état du dossier et du groupe.
Actif : NON • Activé : contrôlé manuellement
La règle ne réagit pas à l'activation de tout le dossier. Vous la pilotez uniquement manuellement. Idéal pour les modifications expérimentales que vous ne voulez pas activer en bloc.
Actif : OUI • Activé : OUI
Réglage standard. Activer/désactiver le dossier pilote aussi cette règle.
Actif : OUI • Activé : NON
La règle est « rattachée » au dossier mais momentanément désactivée. Le prochain clic sur l'interrupteur principal du dossier la réactivera.
| Action | Effet |
|---|---|
| Clic gauche | Bascule de tous les dossiers correspondants (activer/désactiver) |
| Clic droit | Ouvre un panneau avec la liste des dossiers et règles |
| Glissement | Déplace la position (mémorisée par fenêtre) |
Dans le panneau déroulant (clic droit) vous pouvez :
actionBar.enabled (persistant, se propage au panneau d'édition)Le panneau n'affiche que les règles actives (●) — les indépendantes (○) sont masquées pour la concision. Quand le dossier n'a qu'un seul groupe nommé « Par défaut », l'en-tête de groupe est omis — on voit uniquement les règles.
Un clic sur l'icône JustZix dans la barre des extensions de Chrome ouvre le widget du popup — un panneau de contrôle compact pour l'onglet courant. De haut en bas :
actionBar.enabled).Dans un même espace de travail vous pouvez avoir plusieurs barres d'action — chacune avec son propre nom, orientation, couleur de fond, son propre jeu de boutons et une position indépendante par fenêtre de navigateur. Une barre peut être assignée à un dossier, un groupe ou une règle individuelle (cela détermine la visibilité et la cascade).
Dans l'éditeur de dossier, de groupe ou de règle se trouve un bouton « Barres d'action (N) ». Un clic ouvre la fenêtre modale de gestion des barres. Dans la modale :
barId).Chaque action dans l'onglet « Actions » de la carte de règle a un menu déroulant « Barre d'action » — vous choisissez la barre cible dans la liste de celles visibles pour cette règle (barres propres de la règle + barres du groupe + barres du dossier).
Pendant le glissement d'une barre, l'extension détecte les bords des barres voisines et du bouton flottant à une distance ≤ 12 px. Un indicateur visuel d'accrochage apparaît, et au relâchement les barres se connectent en un groupe de connexions. Ensuite :
__float comme pseudo-barre).Clic droit sur la poignée de glissement d'une barre → menu contextuel :
En mode édition de la barre, ce menu est désactivé ; le clic droit sur une étiquette donne alors l'option « Supprimer l'étiquette ».
Pour activer/désactiver de manière permanente les barres d'action (sans F5), l'extension offre trois points d'entrée, tous mappés sur le même actionBar.enabled du stockage — un changement depuis un endroit se propage au panneau d'édition et aux autres interfaces :
actionBar.enabled.actionBar.enabled = false — la barre n'est pas rendue du tout, l'état se synchronise entre les appareils (sync), visible dans le panneau d'édition.barsHidden[barId] = true par fenêtre de navigateur — la barre disparaît jusqu'à F5 / fermeture de la fenêtre. L'activation depuis le popup/panneau flottant efface automatiquement ce masquage runtime.Le mode édition de la barre d'action s'active de trois manières : par le raccourci Ctrl+Alt+S (fonctionne depuis n'importe quel endroit de la page), par l'interrupteur dans le widget du popup de l'extension, et depuis le menu contextuel de Chrome (clic droit → « Mode édition de la barre d'action »). En haut de l'écran apparaît une barre d'information ; utiliser de nouveau l'un des interrupteurs quitte le mode.
En mode édition, le fonctionnement normal des éléments est suspendu (le clic ne déclenche pas de code, les champs n'acceptent pas le focus) — à la place les éléments peuvent être disposés et redimensionnés :
Ctrl+clic = ajouter/retirer de la sélection ; clic dans le vide ou Esc = tout désélectionner. Shift+glissement sur une zone vide = sélection par zone (rectangle).Delete supprime toutes les étiquettes sélectionnées d'un coup ; le clic droit sur une étiquette donne l'option « Supprimer l'étiquette » ; il y a aussi un bouton « Supprimer » dans l'éditeur d'étiquette. Les éléments d'action se suppriment dans le panneau d'édition (ils appartiennent aux règles).flow) : il supprime les positions et tailles personnalisées des éléments ainsi que toutes les étiquettes (avec confirmation).Ctrl+Z annule le dernier changement (déplacement, redimensionnement, ajout/édition/suppression d'étiquette, réinitialisation). L'historique couvre la session d'édition courante.Le mode édition est « strict » : le déplacement et le redimensionnement s'accrochent à une grille de 8 px, un élément ne peut pas être sorti de la barre ni posé sur un autre — en cas de collision, les deux éléments (celui déplacé et celui en dessous) reçoivent un cadre rouge, et au relâchement l'élément revient à sa place précédente. La barre ne peut pas être réduite au point qu'un élément se retrouve à l'extérieur ; quand un nouvel élément ou une étiquette ne tient pas dans la barre, le canevas de la barre s'agrandit automatiquement. Le clic droit sur la barre en mode édition n'affiche pas le menu « masquer/déconnecter la barre ».
Modes de disposition de la barre : la barre démarre en mode flow (flexbox classique — éléments les uns après les autres, verticalement ou horizontalement). Le premier déplacement ou redimensionnement d'un élément convertit la barre en mode custom (canevas avec positionnement libre) — visuellement sans changement, car la disposition courante est capturée comme point de départ.
custom (bar.layoutMode, bar.size, action.layout, action.size) sont enregistrées de manière permanente et synchronisées entre les appareils — contrairement à la position de « flottement » de la barre sur la page, qui reste par fenêtre de navigateur.
Chaque action a un type — choisi via un menu déroulant au début de chaque action dans la carte de règle. 6 types sont disponibles :
| Type | UI | Quand le code se déclenche |
|---|---|---|
| BUTTON | Bouton cliquable avec un libellé de 6 caractères max | clic de l'utilisateur |
| SELECT static | Menu déroulant personnalisé dans le style de la barre — options configurées dans une modale | choix d'une option (value = option.value) |
| SELECT js | Élément <select> natif — votre code remplit les options et y attache un handler | UNE FOIS au rendu ($el = <select>) |
| INPUT | Champ de texte avec placeholder (une seule ligne) | change (Enter ou blur) |
| SLIDER | Curseur <input type="range"> avec libellé + affichage de la valeur | change (relâchement de la souris / Enter), value = nombre |
| TEXTAREA | Champ multiligne — Enter est un vrai saut de ligne (ne déclenche PAS le code) | change (blur — sortie du champ) |
| TOGGLE3 | Contrôle segmenté à 3 états (de type radio) — 3 mini-boutons, un actif | clic sur un état inactif, value = state.value de l'actif, plus stateIdx et stateLabel dans le scope |
Les étiquettes de texte statiques ne sont pas un type d'action — on les ajoute directement sur la barre en mode édition (voir « Mode édition de la barre » → étiquettes).
value, $el (élément DOM), $action ({ id, label, type, el }) ; pour TOGGLE3 en plus stateIdx (0-2) et stateLabel.Un clic sur « Options (N) » dans la carte d'une action de type SELECT ouvre une modale :
<select> natif).{ name, value }. name = ce que voit l'utilisateur, value = ce qui arrive au JS comme variable value.<option> (variante js)action.id complet avec un bouton de copie + un exemple de sélecteur JS.::placeholder n'est pas stylisable en inline).min < max.(min+max)/2.change (relâchement de la souris / Tab / Enter). value = valeur numérique.\n pour les sauts de ligne).change (blur, PAS Enter — Enter dans une textarea est un vrai saut de ligne). L'utilisateur sort du champ → la valeur est enregistrée et le code déclenché. value = chaîne avec sauts de ligne.value). Libellés par défaut : OFF / MID / ON.colorText).value (state.value, repli sur state.label), stateIdx (0-2), stateLabel, $el (le div conteneur).Le choix / la valeur / la position du curseur / le contenu de la textarea / l'état actif du toggle3 sont automatiquement mémorisés par action. Après F5 la valeur revient ; après fermeture de l'onglet et sa réouverture (sur une page correspondant à la règle) aussi. Singleton par action.id — une valeur unique indépendante de l'URL précise.
Format des valeurs en mémoire par type :
Stockage :
sessionStorage — synchrone, résistant au F5, par onglet.chrome.storage.local.actionMemory[id] — inter-onglets, durable.Pas de synchronisation entre appareils : la mémoire reste locale. Deux ordinateurs peuvent avoir des valeurs différentes (par ex. un filtre différent par utilisateur).
sessionStorage est lisible par les scripts de la page (même origine). Pour des données sensibles n'utilisez pas INPUT — à la place, écrivez la valeur directement dans le champ « Code JS » de la règle.
Chaque action a un action.id immuable (format a_<base36>_<random>). Dans la carte de règle, à côté de chaque action se trouve un badge avec le numéro de ligne — un clic copie l'ID complet dans le presse-papiers, l'infobulle affiche l'ID complet.
Dans le user-JS, référez-vous via data-jz-action-id :
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');
el.value = 'nouvelle valeur';
el.dispatchEvent(new Event('change'));
Ou via les helpers window.JZ — voir Appel programmatique des actions depuis le JS.
Clic droit sur n'importe quelle page → JustZix :
Ctrl+Alt+S et de l'interrupteur du popup.actionBar.enabled.Les sous-menus de fenêtres se reconstruisent sur : tabs.onActivated, tabs.onUpdated (changement d'URL) et storage.onChanged pour folders/groups/rules/actionBars/cssPanes/jsPanes/jsConsoles/outputConsoles/floatingHidden. Le sous-menu TEMP est statique (toujours 4 entrées).
L'extension propose quatre types de fenêtres flottantes injectées sur les pages, à côté des barres d'action. Chaque fenêtre est assignée à un dossier, un groupe ou une règle (elle hérite de la visibilité en cascade, comme les barres d'action) et apparaît sur les pages correspondant par l'URL.
Gestion : dans l'éditeur de dossier / groupe / règle vous trouverez un bouton « Fenêtres ▾ (N) ». Un clic déploie un menu avec les 4 types — vous choisissez un type, une modale s'ouvre avec la liste des fenêtres de ce niveau (plus les fenêtres héritées des niveaux supérieurs). Vous ajoutez, nommez, colorez, supprimez.
| Type | Couleur | À quoi ça sert |
|---|---|---|
| CSS pane | vert | Textarea CSS injectée en direct comme <style> |
| JS pane | ambre | Textarea JS exécutée à chaque changement du code |
| JS Console | violet | REPL — vous saisissez du code, Ctrl+Enter l'exécute, la sortie en dessous |
| Output Console | émeraude | Aperçu en lecture seule des journaux de la page (console.* + erreurs) |
Fenêtre flottante avec un champ de texte pour le CSS. Chaque changement (après une courte pause) met à jour le <style> injecté — vous voyez l'effet en direct. Le contenu est mémorisé par onglet de navigateur (il survit au F5, disparaît à la fermeture de l'onglet). Idéal pour tester rapidement du CSS sans l'enregistrer dans une règle.
Champ de texte pour du JavaScript exécuté dans le contexte de la page. Le code s'exécute après un changement (avec un délai) ou manuellement via le bouton ▶ Run / le raccourci Ctrl+Enter. Les erreurs d'exécution s'affichent dans une barre rouge sous le code. Quand le code a changé depuis la dernière exécution, le bouton Run s'éclaire en jaune (état « dirty »).
Une console à part entière dans la page. Vous saisissez du code dans le champ du bas, Ctrl+Enter (ou ▶) l'exécute, le résultat s'ajoute à la zone de journaux au-dessus. Fonctions :
console.log/warn/error/info pendant l'exécution sont affichés dans le journal (colorés selon le type).L'input, la sortie et l'historique sont mémorisés par onglet. La console exécute le code dans le MAIN world de la page — vous avez accès à toutes les variables et fonctions de la page.
Un aperçu des journaux en lecture seule — il intercepte automatiquement tout ce qui se passe sur la page : console.log/warn/error/info/debug, les exceptions non capturées, les rejets de Promise non gérés, le trafic réseau ainsi que les pushes dans dataLayer, et aussi votre propre logger window.JUSTZIX.*. Contrairement à la JS Console (où vous saisissez vous-même le code) — ici les journaux affluent d'eux-mêmes.
La fenêtre est divisée en 6 onglets, chacun avec un compteur d'entrées (badge) :
| Onglet | Contenu |
|---|---|
| All | Toutes les entrées de toutes les sources, chronologiquement |
| JZconsole | Uniquement votre logger window.JUSTZIX.* |
| Console | Uniquement les console.log/info/warn/error/debug standard de la page |
| Network | Requêtes réseau de la page (via chrome.webRequest) |
| Errors | Exceptions non capturées et rejets de Promise — avec détails déroulables |
| DataLayer | Pushes dans window.dataLayer (GTM) + aperçu en direct de l'objet |
Entre les onglets et le champ de recherche se trouve une barre de filtres qui change selon l'onglet sélectionné :
log, info, warn, error, debug. Décochez un niveau → les lignes disparaissent de l'aperçu.Sous la barre de filtres, un champ de recherche est toujours visible. Il filtre les entrées de l'onglet actif en direct (correspondance partielle, sans tenir compte de la casse). Esc efface le champ.
Les entrées console.* sont par défaut repliées — elles montrent un aperçu abrégé (par ex. [PickupMap][2026-05-16T15:25Z] AUTO_SELECTION_SKIPPED: {reason: 'Lower priority source', …}). Un clic déploie les arguments complets (objets/tableaux comme arbre JSON déroulable), comme dans la console des DevTools.
Network intercepte les requêtes via chrome.webRequest (permission webRequest dans le manifeste). Chaque entrée montre entre autres la méthode, l'URL, le statut, le type de ressource, la taille, la durée, l'adresse distante (Remote address) et l'initiateur (Initiator). Un buffer de requêtes est maintenu en arrière-plan, donc les entrées antérieures à l'ouverture de la fenêtre apparaissent aussi.
La fenêtre DataLayer est divisée en deux colonnes :
dataLayer.push(...) dans l'ordre des événements.window.dataLayer comme arbre JSON indexé (0:, 1:, …) déroulable — vous descendez dans les données imbriquées, comme dans l'inspecteur d'objet des DevTools. L'instantané se met à jour après chaque push. Dans l'en-tête de la colonne de droite se trouvent des boutons tout déployer / tout replier — ils agissent récursivement sur tout l'arbre.Les clics sur l'interface propre de JustZix (déploiement des nœuds de l'arbre, boutons de la fenêtre) ne sont pas transmis à cet onglet. Si la page collectait les événements click (par ex. l'auto-event de GTM), un clic dans la fenêtre générerait un push vers dataLayer et réinitialiserait le déploiement de l'arbre — l'extension reconnaît ces pushes et ne les rapporte pas (le véritable window.dataLayer de la page reste intact).
L'Output Console expose une API globale pour journaliser depuis votre code (JS pane, actions, code de la page) :
JUSTZIX.log('journal ordinaire');
JUSTZIX.warn('avertissement');
JUSTZIX.error(new Error('erreur')); // affichera la stack trace
JUSTZIX.info({ obj: 1, arr: [2,3] });
JUSTZIX.debug('détails'); // masqué par défaut (filtre)
Alias disponibles :
window.JUSTZIX — le principal, fonctionne toujourswindow.__JUSTZIX__ — alias toujours disponiblewindow.JZ — alias uniquement si la page n'a pas son propre window.JZ (certaines pages, par ex. Google Ads, occupent ce nom)Après l'apparition de l'Output Console, vous verrez dans le journal une ligne de bienvenue indiquant quel alias est disponible sur cette page.
console.log/warn/error/info/debug(...) de la page — ils passent aussi par la console normale des DevTools (nous ne les bloquons pas)window.JUSTZIX.*(...) — votre canal dédié (il ne va pas aux DevTools)throw new Error(...)) — affichées en rouge avec l'emplacement de l'erreurPromise.reject(...) sans .catchLes erreurs des requêtes fetch/XHR ne vont pas dans l'onglet Errors (ce ne sont pas des exceptions JS) — vous les trouverez dans l'onglet Network via le statut 4xx/5xx. Nous n'interceptons pas les violations de CSP ni les avertissements internes de Chrome.
Ctrl+Shift+H ouvre une fenêtre déplaçable d'aide rapide — un guide pour utiliser JustZix sur la page : raccourcis globaux, raccourcis dans les fenêtres, la Console Output, manipulation des fenêtres à la souris, le mode édition de barre et la journalisation vers la Console Output. Elle fonctionne sur n'importe quelle page. Vous faites glisser la fenêtre par son en-tête ; Esc / clic en dehors / × / nouveau Ctrl+Shift+H la ferme.
Couleurs : dans la modale de gestion (panneau d'édition), chaque fenêtre a un sélecteur de couleur — le point de l'en-tête, le fond et le texte de l'en-tête, le fond et le texte du corps, la couleur des boutons d'action.
Police et taille : clic droit sur la barre d'en-tête de la fenêtre → menu avec choix de police (Consolas, Menlo, Monaco, Courier New et autres monospace) ainsi que de taille (10–24 px).
Chaque fenêtre se fait glisser par sa barre d'en-tête. En rapprochant le bord d'une autre fenêtre / barre d'action / bouton flottant (≤ 12 px), un accrochage magnétique apparaît — les fenêtres se collent en un groupe. Faire glisser un groupe collé déplace tous les éléments ensemble. Les positions sont mémorisées par fenêtre de navigateur.
Chaque fenêtre a 8 poignées de redimensionnement : 4 aux coins (changement de largeur et de hauteur en même temps) et 4 sur les bords (changement d'un seul axe). La poignée tirée maintient le bord opposé en place. Plage : largeur 180–1200 px, hauteur 120–900 px. La nouvelle taille (pane.size) est enregistrée — pour les fenêtres permanentes synchronisée entre les appareils, pour les fenêtres TEMP par onglet.
Le défilement avec la molette de la souris à l'intérieur d'une fenêtre fait défiler uniquement le contenu de cette fenêtre — la page en dessous ne défile pas. Cela s'applique également lorsque la zone de la fenêtre atteint la fin du défilement ou lorsque le curseur se trouve au-dessus d'une partie non défilable (l'en-tête, la barre de filtre).
Chaque fenêtre (aussi bien temporaire TEMP que persistante) a un bouton × de fermeture dans le coin droit de l'en-tête. Les TEMP sont masquées (réouverture via le menu contextuel de la page ou un raccourci), les persistantes — désactivées (réactivation via une case à cocher dans le popup). Double-clic sur la barre d'en-tête :
Quand le bord d'une fenêtre s'approche d'une autre fenêtre JustZix (seuil de 12 px), un bord rouge apparaît du côté du collage (sur les deux fenêtres). Relâcher le curseur dans cette position effectue le snap — les fenêtres se déplacent ensuite en groupe. Toutes les fenêtres de l'extension participent à ce mécanisme : barres d'action, FAB, panneaux persistants (CSS/JS/Console/Output), TEMP et l'AI Helper.
Vous pouvez créer une fenêtre temporaire sur n'importe quelle page — même une page pour laquelle vous n'avez aucun dossier. Les panneaux TEMP sont un outil rapide et ad hoc : vous testez du CSS/JS sur une page étrangère sans configurer de règles.
Caractéristiques des panneaux TEMP :
<style> en direct est mis à jour immédiatement.Création / fermeture (bascule) :
AI Helper est un assistant IA intégré à l'extension, qui aide à préparer et déployer une solution CSS/JS pour une tâche précise sur la page courante. Le modèle peut examiner la page, tester le code en direct dans des fenêtres TEMP et — après votre validation — créer un dossier, un groupe et une règle prêts à l'emploi.
Dans le menu Paramètres de la barre latérale, l'entrée « AI Helper » ouvre une modale de configuration :
chrome.storage.local). Une clé n'arrive sur d'autres appareils que si vous cochez la case « synchroniser » à côté — elle est alors synchronisée via le cloud JustZix (le même canal par lequel l'extension synchronise les dossiers, groupes et règles). Les clés sans coche ne quittent jamais l'appareil. Les appels API passent par le service worker de l'extension, donc la clé n'arrive pas dans le contexte de la page.
La fenêtre AI Helper est une fenêtre flottante (par onglet, comme les fenêtres TEMP — déplaçable, redimensionnable avec 8 poignées, croix de fermeture, une seule instance). Vous l'ouvrez / la fermez :
Dans la fenêtre : choix du fournisseur (quand vous avez plus d'une clé) et du modèle (liste récupérée en direct), historique de conversation, bouton pour effacer la conversation ainsi qu'un champ de texte (envoi par bouton ou Ctrl+Enter). Le modèle reçoit automatiquement le contexte de la page courante — URL, titre et fragment HTML.
AI Helper mène la conversation selon un workflow établi :
query_page (sélecteurs, structure du DOM) avant d'écrire du code.read_temp_pane et read_console, il vérifie que le code testé ne signale aucune erreur avant de vous montrer le résultat.Le modèle utilise les outils via un protocole texte simple (bloc @@JZ_TOOL@@ … @@END@@) fonctionnant de manière identique pour OpenAI, Anthropic et Gemini. Les appels d'outils et leurs résultats apparaissent dans la fenêtre comme des « puces » distinctes. Outils disponibles :
| Outil | Action |
|---|---|
query_page | Renvoie le nombre de correspondances du sélecteur et le HTML de jusqu'à 5 éléments |
list_structure | Renvoie les dossiers / groupes / règles existants avec leurs id |
open_temp_pane | Ouvre une fenêtre temporaire TEMP (CSS ou JS) |
set_temp_pane_code | Insère du code dans une fenêtre TEMP — sert aux tests en direct |
read_temp_pane | Vérifie la fenêtre TEMP — pour le JS exécute le code et renvoie une erreur ou un succès |
read_console | Ouvre une fenêtre TEMP Output Console et renvoie les entrées console capturées de la page |
create_folder | Crée un dossier + un groupe par défaut (nécessite une confirmation) |
create_group | Crée un groupe dans un dossier (nécessite une confirmation) |
create_rule | Crée une règle avec du code CSS/JS (nécessite une confirmation) |
create_bar | Crée une barre d'action attachée à un dossier/groupe/règle (nécessite une confirmation) |
create_action | Crée une action (button/select/input/slider/textarea/toggle3) sur une barre (nécessite une confirmation) |
request_user_input | Affiche à l'utilisateur un formulaire intégré dans la fenêtre de chat (champs texte / nombre / couleur / select / case à cocher) et attend la réponse |
list_bars / list_actions / list_panes / list_all | Retournent les listes des barres d'action / actions / fenêtres (CSS/JS/Console/Output) existantes — optionnellement filtrées par parent |
read_folder / read_group / read_rule / read_bar / read_action | Retournent les données complètes d'une entité spécifique (avant un changement planifié) |
update_folder / update_group / update_rule / update_bar / update_action | Modifient une entité existante — nécessite une confirmation (avec un diff des champs) |
create_css_pane / create_js_pane / create_js_console / create_output_console | Créent une fenêtre persistante sur la page (nécessite une confirmation) |
read_*_pane / read_*_console + update_*_pane / update_*_console | Lecture et modification des métadonnées des fenêtres persistantes (nom, couleur, position, taille, style) |
read_pane_code / update_pane_code | Lecture et insertion du code CSS/JS dans une fenêtre persistante (par onglet de navigateur) — nécessite une confirmation |
screenshot_page | Capture de la vue actuelle de la page sous forme d'image — l'interface de JustZix est automatiquement masquée ; pour les modèles compatibles vision |
read_temp_pane + read_console), vous demander des données via un formulaire intégré (request_user_input) et faire des captures d'écran de la page (screenshot_page) comme images jointes à la requête suivante.
Un clic droit sur la barre d'en-tête de la fenêtre AI Helper ouvre un menu avec les options « Mettre devant » / « Mettre derrière » (modifier l'ordre des fenêtres JustZix quand elles se superposent), « Déconnecter de : X » (quand AI Helper est collé à une autre fenêtre) et « Apparence… ». Le panneau « Apparence… » permet de styliser séparément quatre rôles dans la conversation : vos messages, réponses de l'IA, résultats des outils, formulaires intégrés — chacun avec sa propre police, taille, couleur de texte et de fond. Les valeurs sont enregistrées par appareil.
La fenêtre AI Helper participe au même mécanisme de collage que les barres d'action, les fenêtres persistantes (CSS / JS / Console / Output) et les fenêtres TEMP. Glisser un bord près d'une autre fenêtre JustZix (seuil de 12 px) → attraction magnétique, un bord rouge indique le côté du collage sur les deux fenêtres. Les fenêtres collées se déplacent en groupe.
Quand les fenêtres se chevauchent, les options « Mettre devant » / « Mettre derrière » dans le menu contextuel de chaque fenêtre (clic droit sur l'en-tête) font un saut unique — la fenêtre passe au-dessus / en-dessous de tous les voisins qui se chevauchent, pas besoin de cliquer plusieurs fois.
L'outil screenshot_page capture la vue actuelle de la page et l'envoie au modèle comme image. Toute l'interface de JustZix est automatiquement masquée avant la capture (FAB, barres d'action, AI Helper, panneaux persistants, TEMP). Un tampon des 3 captures les plus récentes, joint en une fois à la requête suivante (après envoi — supprimé du tampon, pour économiser les tokens). Nécessite un modèle compatible vision (par ex. gpt-4o, claude-3+/4, gemini-1.5+/2). Sous la puce de résultat dans le chat, une vignette s'affiche — un clic ouvre la vue en plein écran.
| Raccourci | Action |
|---|---|
Ctrl+Alt+G | Créer / fermer le panneau TEMP CSS |
Ctrl+Alt+H | Créer / fermer le panneau TEMP JS |
Ctrl+Alt+J | Créer / fermer la Console TEMP JS |
Ctrl+Alt+K | Créer / fermer la Console TEMP Output |
Ctrl+Alt+I | Ouvrir le panneau d'édition (fenêtre séparée), première règle active sur cette page, onglet CSS |
Ctrl+Alt+O | Comme ci-dessus, onglet JS |
Ctrl+Alt+P | Comme ci-dessus, onglet Actions |
Ctrl+Alt+\ | Ouvrir / fermer la fenêtre AI Helper |
Ctrl+Alt+S | Mode édition de la barre d'action — activer / désactiver |
Ctrl+Z | Annuler le dernier changement (uniquement en mode édition de la barre) |
Delete | Supprimer les étiquettes sélectionnées (uniquement en mode édition de la barre) |
Esc | Désélectionner tous les éléments (uniquement en mode édition de la barre) |
Ctrl+Shift+L | Effacer l'onglet actif de chaque Output Console |
Ctrl+Shift+H | Aide rapide — raccourcis et fenêtres sur la page (partout) |
| Raccourci | Action | Fenêtre |
|---|---|---|
Ctrl+Enter | Exécuter le code / envoyer le message | JS pane, JS Console, AI Helper |
↑ / ↓ | Historique des commandes | JS Console (input) |
Ctrl+L | Effacer la sortie | JS Console |
Esc | Effacer le champ de recherche | Output Console |
| Raccourci | Action |
|---|---|
Ctrl+Alt+F | Focus sur le champ de recherche au-dessus de l'éditeur |
Ctrl+Alt+→ / Ctrl+Alt+← | Résultat de recherche suivant / précédent |
Enter / Shift+Enter | Rechercher / résultat suivant / précédent (dans le champ de recherche) |
Ctrl+Alt+I / O / P | Basculer l'onglet de la règle active sur CSS / JS / Actions (quand la carte de la règle est rendue) |
Ctrl+Alt+G/H/J/K sont des touches côte à côte (disposition Vim), toutes libres dans tous les navigateurs et systèmes. Ctrl+Alt+L est volontairement omis — sous Linux il verrouille l'écran. Ctrl+Alt+S (mode édition) et Ctrl+Alt+\ (AI Helper) sont dans la même famille de modificateurs. Les raccourcis de l'Output Console (Ctrl+Shift+...) n'entrent pas en conflit, car ils diffèrent par le modificateur.
L'extension propose cinq formats d'export (complet, partiel, dossier, groupe, règle) avec détection automatique du type de fichier à l'import, pour éviter un écrasement accidentel.
Dans le menu Paramètres de la barre latérale : Export des paramètres. La modale propose deux modes :
Les fichiers d'export partiel portent le nom justzix-partial-DATE.json (vs. justzix-backup-DATE.json pour l'export complet), et contiennent un indicateur partial: true et un champ groups[].
Dans la barre du dossier : Export — ouvre une modale avec l'arborescence des groupes et règles (comme dans l'export partiel, mais limitée à ce dossier). Seules les règles sélectionnées et les groupes auxquels elles appartiennent sont exportés — les groupes vides ne sont pas inclus dans le fichier.
Format justzix-folder — le fichier contient un champ groups[] avec la hiérarchie des groupes et règles du dossier.
Dans la barre du groupe : Export — une modale avec la liste des règles du groupe (cases à cocher). Fichier : justzix-grupa-<nom>-<date>.json, format justzix-group.
Dans la vue d'une règle : Export de la règle — télécharge immédiatement le fichier (sans modale). Format justzix-rule, nom : justzix-zestaw-<nom>-<date>.json.
justzix-full — sauvegarde complète de toutjustzix-full avec partial: true — éléments sélectionnés depuis l'export principaljustzix-folder — un seul dossier avec arborescence de sélectionjustzix-group — un groupe + les règles sélectionnéesjustzix-rule — une seule règleAprès le chargement d'un fichier / le collage du JSON, l'extension reconnaît automatiquement le type et affiche un panneau de détection coloré :
| Couleur | Signification | Action |
|---|---|---|
| Teal (turquoise) | Sauvegarde complète valide | Affiche le nombre de dossiers/règles, la date d'export, un avertissement d'écrasement |
| Violet | Sauvegarde partielle (partial: true) | Choix du mode : Fusionner avec l'existant ou Remplacer tout |
| Orange | Type de fichier inapproprié dans cette modale | Message orientant vers la bonne modale, bouton Importer bloqué |
| Rouge | Erreur d'analyse JSON / format invalide | Bouton Importer bloqué |
1 / nadpisz — écrase les dossiers existants (supprime leurs groupes et règles)2 / kopia (par défaut) — importer comme copies avec de nouveaux ID, « (import) » dans le nom du dossier, aucune perte de données existantesDans la barre du dossier : Import. Vérifie les conflits par ID et par nom :
Dans la barre du groupe : Import — accepte 3 formats :
justzix-group — insère toutes les règles du groupe du fichierjustzix-folder — insère toutes les règles de tous les groupes du dossierjustzix-rule — insère une seule règleToutes les règles du fichier arrivent dans le groupe courant avec de nouveaux ID (l'opération est toujours du type « ajouter une copie » — aucun conflit).
Dans la vue d'une règle : Import de la règle — accepte uniquement justzix-rule. Prompt avec 3 options :
1 / zastap — remplace le contenu de la règle courante (id et groupId conservés)2 / kopia (par défaut) — ajoute comme nouvelle règle à côté de la courante, dans le même groupe, avec la mention « (import) »Paramètres → Synchronisation cloud ouvre la modale du compte de synchronisation. L'extension conserve votre bibliothèque (dossiers, groupes, règles, actions, barres d'action, fenêtres in-page) dans le cloud justzix.com et la maintient cohérente entre les appareils. La synchronisation fonctionne uniquement lorsque vous êtes connecté — sans compte, l'extension fonctionne uniquement en local.
Lors de la connexion, l'extension compare les données locales avec celles du cloud :
| Choix | Ce que cela fait |
|---|---|
| Utiliser les données du cloud | Vide la bibliothèque locale et reconstruit l'état du compte à partir du serveur |
| Envoyer mes données locales | Les données locales deviennent canoniques — cela supprime ce qui se trouvait dans le cloud |
| Fusionner | Combine les deux ensembles — ajoute les entités manquantes en conservant celles existantes |
Vous pouvez aussi Annuler — l'extension se déconnecte alors et ne change rien.
Après la première réconciliation, la synchronisation s'exécute en arrière-plan : l'extension envoie les modifications et récupère les nouvelles entités environ une fois par minute. Une modification faite sur un appareil apparaît sur les autres après un court instant. Le point d'état à côté de l'entrée « Synchronisation cloud » indique si le compte est connecté.
L'onglet Statut de la modale de synchronisation affiche l'état du compte et propose des boutons d'action :
Compteurs des entités présentes sur le compte : dossiers, groupes, règles, actions, barres d'action, fenêtres in-page. Seules les entités atteignables dans l'arbre sont comptées (un groupe doit avoir un dossier existant, une règle — un groupe, une barre/fenêtre — un parent existant) — de façon cohérente avec les compteurs du Tableau de bord. Ils s'actualisent à l'ouverture du panneau et après une synchronisation manuelle.
Un journal local à l'appareil des dernières synchronisations. La page affiche les 10 dernières entrées ; le bouton « Voir l'historique complet » ouvre une fenêtre avec la liste complète (jusqu'à 100 entrées). Chaque entrée contient :
Le journal est local — il n'est pas synchronisé entre les appareils. Une entrée est créée après chaque cycle de synchronisation qui a réellement changé quelque chose ; un « Synchroniser maintenant » manuel laisse toujours une entrée, même sans aucune modification.
Les statistiques d'utilisation (applications de CSS, exécutions de JS, affichages de fenêtres) sont synchronisées en tant qu'entités distinctes par appareil — la tuile du Tableau de bord les cumule sur tous les appareils appairés. Le thème et la langue sont synchronisés en tant que paramètre de compte partagé et appliqués lors de la prochaine ouverture du panneau sur un autre appareil.
Une alternative à l'envoi d'un fichier JSON sur une messagerie. Vous publiez un lien public avec une durée de vie (1h / 6h / 12h / 24h / 48h) et le transmettez au destinataire. Le backend justzix.com conserve le payload dans le cloud jusqu'à expiration, après quoi il est supprimé.
Nécessite un compte de synchronisation (Sync) connecté. Le jeton lui-même est un secret public — quiconque a le lien peut télécharger, donc ne l'envoyez pas sur des canaux publics si le contenu est sensible.
JZS-XXXX-XXXX-XXXX-XXXX (16 caractères Crockford base32, ~80 bits d'entropie). L'URL entière https://www.justzix.com/s/JZS-... est aussi acceptée — l'extension l'analyse et la normalise (lettres ambiguës I/L→1, O→0, U→V).
Dépasser une limite = erreur avec un message en polonais. Révoquez les liens inutilisés dans le panneau Mes partages.
Le bouton « Partager l'URL » dans quatre points d'entrée, à côté de « Télécharger le fichier » :
justzix-full)justzix-folder)justzix-group)justzix-rule)Un clic ouvre la modale de génération de lien : sujet + résumé de ce que vous partagez, boutons radio de TTL (24h par défaut), « Générer le lien ». En cas de succès, la modale bascule sur la vue du résultat avec deux valeurs copiables :
https://www.justzix.com/s/JZS-... — à envoyer à quelqu'un sans l'extension (affiche une landing page)JZS-XXXX-XXXX-XXXX-XXXX — à coller dans l'extension du destinataire dans « Importer depuis une URL »Chacun a son bouton « Copier ». La date d'expiration est également affichée dans le fuseau horaire local.
Paramètres → Mes partages (une modale distincte, ne fait pas partie de la synchronisation — ce sont deux fonctionnalités différentes). Il affiche la liste des liens actifs : un compteur dans l'en-tête X/20 actifs · Y Mo / 50 Mo, et pour chaque partage une carte avec :
X dossiers · Y groupes · Z règles · N lignes JS · A KoLa révocation ne retire pas le contenu déjà téléchargé. Si quelqu'un a eu le temps de télécharger le payload, il l'a localement chez lui. Le partage est une « limite temporelle au mieux », pas du DRM.
Paramètres → Importer depuis une URL (entre « Import des paramètres » et « Synchronisation cloud », icône de chaîne ). La modale a deux étapes :
Étape 1 — saisie. Vous collez le lien ou le jeton seul. Validation côté client : le jeton est extrait de l'URL, normalisé en Crockford-base32, les 16 caractères + le format sont vérifiés. Format erroné → message avec un indice sur le format correct.
Étape 2 — aperçu. L'extension affiche le résumé du partage :
Si le partage contient du JavaScript (jsLines > 0) — une bannière d'avertissement rouge apparaît avec un lien « Afficher le code JavaScript ». Il ouvre une surimpression avec le code JS complet de chaque règle et action — examinez-le avant d'importer, car le code s'exécutera sur les pages correspondantes.
Étape 3 — import. Un clic sur « Importer » → le backend renvoie le payload complet → l'extension crée de nouvelles entités avec toujours des ID frais (ne remplace jamais les existants par ID) :
| Type | Ce qui se passe |
|---|---|
justzix-rule | Crée un nouveau dossier + un groupe « Par défaut » + la règle importée |
justzix-group | Crée un nouveau dossier + le groupe importé + les règles |
justzix-folder | Ajoute comme nouveau dossier de premier niveau |
justzix-full | Fusion : ajoute tous les folders/groups/rules avec des ID frais |
Nom du nouveau conteneur : <nom-de-l-expéditeur ou "Import"> <date PL> — vous pouvez ensuite le renommer / le déplacer à volonté.
| Erreur | Message |
|---|---|
| Jeton invalide | « Le jeton est invalide. Vérifiez que vous avez copié le lien entier. » |
404 not_found | « Ce lien a expiré ou a été révoqué par l'expéditeur. Demandez-en un nouveau. » |
429 rate_limited | « Trop de tentatives. Patientez un instant et réessayez. » |
| 5xx / réseau | « Problème avec le serveur. Réessayez. » |
Le backend ne distingue pas le 404 « n'a jamais existé » du 404 « expiré / révoqué » — volontairement, pour ne pas révéler si un jeton a jamais existé.
Chaque action (de l'onglet « Actions » dans la carte de règle) peut être appelée de manière programmatique depuis le JS de la règle ou le code d'une autre action. L'espace de noms global window.JZ est installé dans le MAIN world automatiquement avant chaque exécution de user-JS.
| Appel | Ce qu'il fait |
|---|---|
JZ.click(labelOrId) | Clique de manière programmatique. Sémantique par type d'action : BUTTON → el.click(). SELECT static (bouton avec menu déroulant) → el.click() (ouvre le popup ; l'utilisateur choisira une option manuellement). SELECT js (<select> natif) → définit value sur la première option non-disabled et dispatch change. INPUT / TEXTAREA / SLIDER → el.click() — attention : ne change pas la valeur et ne déclenche pas le handler change. Pour définir une valeur : const el = JZ.action('LBL'); el.value = 'X'; el.dispatchEvent(new Event('change')). TOGGLE3 — el.click() atteint le conteneur ; pour activer un état précis, utilisez el.querySelector('.jz-toggle3-state[data-jz-state-idx="1"]').click(). Renvoie true/false. |
JZ.value(labelOrId) | Getter uniforme de la valeur actuelle. INPUT / TEXTAREA → el.value natif. SLIDER → wrap.dataset.jzValue (wrap est un DIV, le moteur de rendu définit l'attribut data depuis l'initiale + sur input/change). SELECT(js) → el.value natif. SELECT(static) → el.dataset.jzValue (défini par le moteur de rendu à chaque choix). TOGGLE3 → el.dataset.jzValue (state.value de l'actif ; repli sur state.label). BUTTON → null. Élément non trouvé → null. |
JZ.setValue(labelOrId, value) | Setter programmatique. INPUT/TEXTAREA → el.value = String(v) + dispatch input+change. SLIDER → définit le <input.jz-action-slider> natif + dispatch. SELECT(js) → el.value = String(v) + dispatch change. SELECT(static) + TOGGLE3 → envoie un CustomEvent 'jz-set-value', le listener de content.js exécute le flux complet (mémoire + UI + déclenche le code). Recherche TOGGLE3 : par state.value → repli sur state.label → repli sur l'index numérique 0-2. BUTTON → false. Renvoie true/false. |
JZ.action(labelOrId) | Renvoie l'élément de l'action (button / select / input / textarea / slider / conteneur toggle3) ou null. Recherche : d'abord par data-jz-action-id, puis sans tenir compte de la casse par data-jz-key (libellé en MAJUSCULES). Fonctionne pour les 6 types d'action. |
JZ.actionById(id) | Recherche exclusivement par l'action.id stable (par ex. 'a_mp1deeq3_uimd8l'). Recommandé pour les actions sans libellé ou quand vous voulez être sûr. |
JZ.actions() | Tableau de tous les éléments d'action visibles (button + select + input + textarea + slider + toggle3) sur la page courante. |
JZ.labels() | Tableau des libellés d'origine (casse conservée comme vous l'avez saisie). |
// === Lecture ===
const filter = JZ.value('FILT'); // INPUT/TEXTAREA — chaîne
const opacity = JZ.value('OPAC'); // SLIDER — chaîne numérique ("75")
const mode = JZ.value('MODE'); // SELECT static — chaîne (option.value)
const theme = JZ.value('THM'); // TOGGLE3 — state.value de l'état actif
// === Définition ===
JZ.setValue('FILT', 'nouvelle valeur'); // INPUT/TEXTAREA — chaîne + dispatch input+change
JZ.setValue('OPAC', 75); // SLIDER — clamp aux min/max, dispatch input+change
JZ.setValue('SRT', 'prod'); // SELECT(js) — select natif + dispatch change
JZ.setValue('MODE', 'staging'); // SELECT static — content.js exécute le flux (mémoire + UI + code)
JZ.setValue('THM', 'dark'); // TOGGLE3 — recherche par state.value (repli sur label, puis idx)
JZ.setValue('THM', 2); // TOGGLE3 — équivalent ; l'index numérique fonctionne aussi
| Appel | Ce qu'il fait |
|---|---|
JZ.bars() | Tous les conteneurs .jz-actions-bar (ActionBars) visibles sur la page. |
JZ.barById(id) | L'élément de la barre par data-jz-bar-id. |
JZ.floatingBtn() | Le bouton flottant principal #justzix-floating-btn ou null (quand masqué). |
JZ.click / JZ.action est insensible à la casse pour le libellé, mais exacte pour l'action.id stable. Pour les actions sans libellé (typiquement INPUT), utilisez JZ.actionById('a_...').
Dans le champ « Code JS » d'une action, vous avez automatiquement accès à des variables — injectées comme const par le service worker d'arrière-plan avant l'exécution :
| Variable | Ce qu'elle contient | Quand disponible |
|---|---|---|
$el | L'élément DOM de cette action (input / select / button / textarea / conteneur toggle3) | toujours quand action.id existe |
$action | { id, label, type, el } | toujours |
value | La valeur actuelle par type : SELECT static → option.value ; INPUT/TEXTAREA → contenu du champ ; SLIDER → nombre ; TOGGLE3 → state.value de l'état actif (repli sur state.label quand value est vide). | SELECT static, INPUT, TEXTAREA, SLIDER, TOGGLE3. SELECT js : le code est exécuté UNE FOIS au rendu — value est vide. |
stateIdx | Entier 0-2 — l'index de l'état actif (l'état depuis lequel le clic a commencé). | uniquement TOGGLE3 |
stateLabel | Chaîne — le libellé de l'état actif (5 caractères max). | uniquement TOGGLE3 |
Dans la modale de configuration d'une action de type SELECT et INPUT, le panneau « ID stable de l'action » affiche l'action.id complet avec un bouton de copie ainsi qu'un exemple de sélecteur JS (document.querySelector('[data-jz-action-id="..."]')). Sous la liste des BUTTON, on voit des puces JZ.click('LBL') — un clic sur une puce copie le snippet dans le presse-papiers.
visible: true, la barre est visible dans l'arborescence + l'URL de la page correspond aux règles).JZ.click() renvoie false, JZ.action() renvoie null.JZ.click().// Code de l'action "AUTO"
JZ.click('LOAD'); // clic sur l'action LOAD (par ex. charge des données)
setTimeout(() => JZ.click('PROC'), 500); // 500 ms plus tard PROC (traite)
setTimeout(() => JZ.click('SAVE'), 1500); // 1500 ms plus tard SAVE (enregistre)
Après l'apparition d'un élément dynamique, cliquez sur l'action qui le supprime :
// Code JS de la règle — observer sur un modal qui apparaît dynamiquement
const observer = new MutationObserver(() => {
if (document.querySelector('.cookie-banner')) {
JZ.click('CCK'); // clique sur l'action qui supprime la bannière
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
// JZ.click sur un INPUT ne change pas la valeur — utilisez le motif avec dispatch 'change' :
const el = JZ.action('SRCH'); // ou JZ.actionById('a_mp1deeq3_uimd8l')
if (el) {
el.value = 'nouveau filtre';
el.dispatchEvent(new Event('change'));
}
Si vous préférez travailler directement avec le DOM (par ex. vous changez un style, vous n'appelez pas) :
// Recherche par l'ID stable (recommandé — résistant au changement de libellé) :
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');
// Recherche par libellé (insensible à la casse — MAJUSCULES dans data-jz-key) :
const btn = document.querySelector('[data-jz-key="MYBT"]');
btn.style.opacity = '0.5'; // assombrir
btn.dataset.busy = 'true'; // attribut personnalisé
Où vivent les éléments d'action dans le DOM :
| Type d'action | Conteneur | Sélecteur de l'élément |
|---|---|---|
| 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"] (bouton avec popup ; data-jz-value = la valeur actuellement choisie) |
| SELECT (js) | .jz-actions-bar | .jz-action-select.jz-variant-js (<select> natif) |
| INPUT | .jz-actions-bar | .jz-action-input[data-jz-action-id="..."] |
| SLIDER | .jz-actions-bar | .jz-action-slider-wrap[data-jz-action-id="..."] (wrap) ; le slider lui-même : .jz-action-slider (<input type="range"> natif) |
| TEXTAREA | .jz-actions-bar | .jz-action-textarea[data-jz-action-id="..."] |
| TOGGLE3 | .jz-actions-bar | .jz-action-toggle3[data-jz-action-id="..."] (conteneur ; data-jz-value = state.value de l'actif) ; boutons d'état : .jz-toggle3-state[data-jz-state-idx="0|1|2"], l'actif a la classe .active |
Tous les éléments ont un attribut data-jz-action-id (identifiant stable unique). Le sélecteur .jz-actions-bar est sûr — il n'entre pas en conflit avec le DOM de la page.
data-jz-key) fonctionne pour tous les types d'action. Chaque élément d'action a à la fois data-jz-label (casse d'origine) et data-jz-key (MAJUSCULES). Pour être sûr (par ex. quand le libellé peut changer), utilisez l'data-jz-action-id stable ou JZ.actionById().
Le champ « Rechercher » filtre l'arborescence des dossiers. Logique de correspondance :
La correspondance est insensible à la casse, un surlignage en jaune montre l'emplacement de la correspondance.
Après un clic sur l'icône de l'extension dans la barre d'outils de Chrome, le widget du popup apparaît avec un grand interrupteur vert/gris « Plugin enabled ». En mode désactivé, aucun CSS/JS n'est injecté sur aucune page, indépendamment des paramètres des dossiers. Le bouton flottant est alors désactivé (Halt Red, opacité 0,7). L'état survit au redémarrage de Chrome.
Un bouton à côté du champ de motif d'URL — il insère protocol://host/* de l'onglet actif. Création d'un dossier en 2 secondes. L'adresse de la page d'options de l'extension est ignorée — il prend l'onglet externe le plus récent.
En ligne, à droite du champ d'URL, apparaît l'information « Correspond à X onglets ouverts » ou un avertissement. Repère les fautes de frappe immédiatement.
Un instantané du CSS et du JS est créé 3 secondes après la dernière édition (debounce). Limite de 5 versions — la plus ancienne est éliminée. Lors de la restauration d'une version, le contenu actuel est ajouté à l'historique comme instantané le plus récent, vous pouvez donc toujours annuler l'annulation.
Dans l'en-tête de la carte de règle se trouve un champ pour les tags — saisissez-les séparés par des virgules. Ils apparaissent comme de petites étiquettes dans la barre latérale à côté du nom de la règle. La recherche trouve aussi par tags.
Chaque dossier peut avoir son propre libellé sur le bouton flottant (3 lettres max, MAJUSCULES) et une couleur (sélecteur de couleur). Le libellé et la couleur aident à reconnaître visuellement quel projet est actif sur une page donnée.
Chaque bouton d'action compte combien de fois il a été cliqué. Cela aide à voir lesquels sont vraiment utilisés.
Sous l'éditeur CSS s'affiche une barre avec la liste des problèmes de syntaxe :
/* ... */ non fermé})} en trop (avec le numéro de ligne)C'est une validation syntaxique simple — elle ne vérifie pas la justesse des propriétés/valeurs. Le CSS avec une erreur est quand même injecté (le navigateur ignorera simplement les règles erronées).
Dans la modale d'import d'un seul dossier, après le chargement du fichier, une liste des règles apparaît avec une métrique :
Contenu du fichier (3 règles) :
Auto-login CSS : 0L • JS : 4L JS
Masquer la bannière cookie CSS : 8L • JS : 0L
Debug GTM CSS : 0L • JS : 12L • 2 actions (8L) JS
Un avertissement avec le nombre de lignes JS si des lignes sont présentes. Un clic sur le bouton JS affiche le code complet à examiner avant l'import.
Chaque règle JS est exécutée séparément, avec son propre try/catch. Une erreur dans une règle ne bloque pas l'exécution des autres. Les erreurs sont journalisées dans la console avec le nom de la règle/action et la stack trace complète.
Un indicateur de consommation de mémoire dans le menu Paramètres de la barre latérale (par ex. 1.2 MB / 10 MB). Rouge au-dessus de 80 %.
Une case à cocher au-dessus de la liste — elle masque les règles marquées comme indépendantes (○) et n'affiche que celles actives dans le dossier (●). Cela aide à filtrer les règles « manuelles » quand un dossier en a beaucoup. Réagit immédiatement aux changements des interrupteurs.
L'extension a une clé fixe dans le manifeste (le build Firefox — un gecko.id fixe), ce qui signifie que l'ID de l'extension est invariable entre les mises à jour — les données (dossiers, règles, paramètres) sont conservées. JustZix est livré pour quatre navigateurs : Chrome, Edge, Opera et Firefox.
Dans le menu Paramètres (à côté du numéro de version) une bannière verte « Une nouvelle version est disponible » apparaît lorsque le serveur publie un paquet plus récent que celui installé. La bannière contient un lien de téléchargement. La vérification est silencieuse — sans réseau, la bannière ne s'affiche tout simplement pas.
chrome://extensions/ (Edge : edge://extensions/) trouvez l'extension et cliquez sur l'icône de rafraîchissement sur la tuileLe build Firefox se charge via about:debugging → « Ce Firefox » → « Charger un module complémentaire temporaire » (en pointant vers manifest.json dans le dossier justzix_firefox/). Une mise à jour = recharger après avoir écrasé les fichiers.
"key" dans le manifeste (Chromium) / gecko.id (Firefox)/* Masquer les publicités courantes */
.ad, .ads, .advertisement,
.banner-ad, [class*="ad-banner"],
[id*="google_ads"] {
display: none !important;
}
/* Masquer la bannière cookie */
.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);
}
Astuce : inverser toute la page puis ré-inverser les images. Ça fonctionne étonnamment bien sur la plupart des pages.
/* Colorer tous les éléments avec 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;
}
/* Augmenter la lisibilité des tableaux de l'admin */
table.admin-list td, table.admin-list th {
padding: 8px 12px !important;
font-size: 14px !important;
}
/* En-tête de tableau collant */
table.admin-list thead {
position: sticky;
top: 0;
background: white;
z-index: 10;
}
/* Lignes alternées */
table.admin-list tbody tr:nth-child(odd) {
background: #f9fafb;
}
/* Souvent les pages ont un max-width rigide de 1200px - forcer la largeur */
.container, .main-content, main {
max-width: 95% !important;
width: 95% !important;
}
body::before {
content: "ENVIRONNEMENT 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; }
Parfait pour un motif https://dev.example.com/* afin de ne pas confondre les environnements.
// Uniquement pour le dev ! N'enregistrez jamais de vrais mots de passe
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';
});
// Intercepter 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);
};
}
// Intercepter 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);
};
}
Idéal pour déboguer la configuration de l'analytique en production sans toucher au code.
// Toutes les 500 ms pendant 10 s, vérifier et cliquer les boutons "Accepter"
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 - enregistrer le formulaire
if (e.ctrlKey && e.shiftKey && e.key === 'S') {
e.preventDefault();
document.querySelector('button[type="submit"]')?.click();
}
// Ctrl+Shift+E - passer en édition (exemple non testé)
if (e.ctrlKey && e.shiftKey && e.key === 'E') {
e.preventDefault();
document.querySelector('a.edit-link')?.click();
}
});
// Ignorer les confirm et beforeunload agaçants pendant les tests
window.confirm = () => true;
window.alert = (msg) => console.log('[alert supprimé]', msg);
window.onbeforeunload = null;
window.addEventListener('beforeunload', e => {
e.stopImmediatePropagation();
}, true);
// Rappel - le CSS pur ne le fera pas quand le parent a display:none
window.addEventListener('load', () => {
const target = document.querySelector('.important-info');
const newParent = document.querySelector('.sidebar');
if (target && newParent) {
newParent.prepend(target);
}
});
// Afficher tous les input type="hidden" masqués
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);
});
Raccourci : CLR Couleur : rouge
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 }));
});
Raccourci : FILL Couleur : vert
const data = {
email: 'test@example.com',
phone: '600000000',
firstName: 'Jan',
lastName: 'Testowy',
street: 'Testowa 1',
city: 'Warszawa',
zip: '00-001'
};
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 }));
}
});
Raccourci : CART Couleur : orange
// Pour une boutique typique — cliquer le premier "ajouter au panier"
const btn = document.querySelector('.add-to-cart, [data-action="add-to-cart"]');
if (btn) btn.click();
else alert('Bouton ajouter au panier introuvable');
Raccourci : COPY Couleur : violet
navigator.clipboard.writeText(location.href).then(() => {
console.log('Copié :', location.href);
});
Raccourci : TKN Couleur : jaune
// Extrait le jeton JWT du localStorage / des cookies pour le débogage
const token = localStorage.getItem('authToken')
|| document.cookie.match(/token=([^;]+)/)?.[1];
if (token) {
navigator.clipboard.writeText(token);
alert('Jeton copié. Premiers caractères : ' + token.slice(0, 20) + '...');
} else {
alert('Aucun jeton');
}
Raccourci : SQL Couleur : bleu
// Intercepter tous les fetch et les afficher dans la 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('Journalisation des fetch activée. Chaque appel apparaîtra dans la console.');
Raccourci : ENV Couleur : 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));
Chaque projet a son propre dossier avec son propre motif d'URL. Vous pouvez avoir des dossiers :
https://dev.justzix.com/* avec une bannière rouge « DEV »Dans le panneau de droite, les dossiers privés peuvent être rapidement activés/désactivés. L'export d'un seul dossier permet de partager une configuration avec l'équipe.
Sur chaque dev/staging, ajoutez une bannière et un auto-login. Une règle CSS (bannière) et une JS (auto-fill). Vous créez un dossier distinct pour chaque environnement, ils s'activent par une simple case à cocher.
Un panneau d'action avec des boutons : FILL (données de test), CART (achat de test), CLR (vider le formulaire), STATE (afficher l'état de l'application dans une alerte). Sans développeur, sans console, en un clic.
Vos blogs/documentations préférés avec une meilleure lisibilité — conteneur plus large, police, mode sombre. Chaque page dans un dossier distinct, « Actif » laissé toujours activé.
Une règle par domaine avec du JS interceptant dataLayer.push et gtag. Vous l'activez quand un client signale un problème d'analytique, sans toucher au code de la page.
Le motif *://*.justzix.com/admin/* et du CSS améliorant les tableaux, listes, formulaires. Plus une action « Filtre de test » qui définit automatiquement les filtres pour un workflow typique.
L'action RO (read-only) injecte du CSS qui masque tous les boutons « Supprimer », « Enregistrer », « Envoyer » — un « mode lecture seule » temporaire pour ne pas faire d'erreur.
// Masquer les boutons dangereux
document.querySelectorAll(
'button[type="submit"], .delete-btn, .danger-btn, [class*="delete"]'
).forEach(b => b.style.display = 'none');
console.warn('MODE READ-ONLY activé');
[JustZix] JS error!important ou des sélecteurs plus spécifiques.css-1abcd qui changent. Utilisez des attributs ([data-testid]) ou des sélecteurs stablesL'extension a une clé fixe dans le manifeste — les mises à jour suivantes conservent les données. Si malgré tout les données ont disparu :
chrome://extensions/, utilisez le bouton de rafraîchissement, ne supprimez pas et ne réinstallez pasC'est normal — les positions sont par fenêtre de navigateur et stockées dans la mémoire de session (chrome.storage.session). Après la fermeture de la fenêtre, les positions disparaissent ; dans une nouvelle fenêtre vous démarrez avec les positions par défaut. La position survit à la navigation entre les onglets de la même fenêtre.
Oui — l'export partiel contient uniquement les dossiers et règles sélectionnés plus les paramètres de visibilité qui leur sont liés. Il ne contient pas les positions des panneaux flottants (elles sont par fenêtre) ni les autres préférences globales. Pour une sauvegarde complète, utilisez le mode « Tout ».
Le mode « Fusionner » fait correspondre les dossiers par ID. Si le fichier importé avait un ID en conflit avec un dossier existant (par ex. le même fichier avait déjà été importé une fois), un prompt apparaît : 1 écraser / 2 copie (par défaut, sûr) / Annuler. En choisissant 2 vous obtenez des copies avec de nouveaux ID et la mention « (import) » dans le nom du dossier — vous ne perdez rien.
La flèche de déploiement n'apparaît que si le dossier a des règles. Un dossier vide a un point grisé à la place de la flèche. L'état de déploiement de chaque dossier est mémorisé dans chrome.storage.local.
Ces boutons sont dans la barre du dossier (en haut de la zone d'édition), à côté du bouton « Supprimer le dossier ». À ne pas confondre avec les boutons du menu Paramètres, qui concernent l'ensemble des paramètres.
Le JS des règles et des actions s'exécute dans le contexte de la page via une stratégie en couches résistante aux règles strictes de Content Security Policy. La plupart des pages — y compris les grands services comme Facebook — fonctionnent immédiatement, sans configuration.
Les pages avec une CSP très stricte (certaines banques, sites d'entreprise) peuvent bloquer l'exécution. Pour que le JS fonctionne sur toutes les pages, activez l'option « Autoriser les scripts utilisateur » pour JustZix : ouvrez chrome://extensions, accédez aux détails de JustZix et activez le commutateur (les navigateurs plus anciens nécessitent aussi le mode développeur). Lorsqu'une page bloque l'exécution, la fenêtre JavaScript / la Console JS affiche un message approprié.
JustZix — manuel