JustZix — manuel d'utilisation

Injection de styles CSS personnalisés, de code JavaScript et de boutons d'action sur n'importe quelle page

Table des matières

Concept et notions principales

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).

Hiérarchie des données

Dossier
Niveau le plus élevé — groupe de règles pour un seul motif d'URL. Par exemple le dossier « justzix.com » avec le motif https://justzix.com/*. On peut activer/désactiver tout un dossier d'un seul clic.
Groupe
Niveau intermédiaire entre le dossier et les règles — il aide à organiser les projets plus volumineux (par ex. « Admin », « Frontend », « QA »). Chaque dossier possède au moins un groupe. Un groupe a son propre interrupteur avec cascade vers les règles actives.
Règle
Une modification individuelle : un morceau de CSS, un morceau de JS, plus une liste de boutons d'action et, en option, ses propres motifs d'URL qui la limitent à des sous-pages précises. Chaque règle appartient à un seul groupe.
CSS
Styles appliqués en direct — les changements sont visibles immédiatement après l'enregistrement, sans recharger la page.
JavaScript
Code exécuté une fois à chaque chargement d'une page correspondant au motif. Il faut recharger la page pour qu'il se relance.
Boutons d'action
Ils exécutent du JavaScript seulement après un clic, dans une barre flottante. Parfaits pour les outils de diagnostic et les opérations fréquentes.

Motifs d'URL au niveau de la règle et du groupe

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 dossierMotifs de la règleFonctionne 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)
Les motifs d'URL par règle sont un filtre additionnel — ils ne remplacent pas le motif du dossier. La règle s'active uniquement quand l'URL correspond aux deux : le motif du dossier et au moins un des motifs de la règle (s'il y en a).

Tutoriel — introduction interactive

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 :

Interface et navigation

Mode édition

Accessible via un clic droit sur l'icône de l'extension → « Options », ou un clic sur l'icône → bouton « Panneau d'édition ».

Bouton flottant (sur les pages correspondantes)

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.

Tableau de bord

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 :

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.

Navigation

ÉlémentAction
Flèche de déploiementDé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ègleOuvre la vue d'une règle individuelle (éditeur de règle)
Case à cocher du dossierActive/désactive tout le dossier (cascade vers les groupes et leurs règles actives)
Case à cocher du groupeActive/désactive le groupe (cascade vers ses règles actives)
Case à cocher de la règlePilote indépendamment une règle individuelle
Statut ●/○ à côté du dossier/groupe/règleActif : ● 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 à gaucheLa 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époserSaisissez à la souris et faites glisser pour réordonner
État par défaut après une nouvelle installation : tous les dossiers et groupes sont repliés. Le premier clic déploie, le clic suivant sur le même élément replie. L'état de déploiement est mémorisé entre les sessions (stockage expandedFolders, expandedGroups).

Réorganisation (glisser-déposer)

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 :

Dossiers

Groupes

Règles

Le glisser-déposer respecte la sélection — si vous faites glisser la règle actuellement sélectionnée entre les dossiers, la sélection la suit et le dossier cible se déploie automatiquement.
Quand vous voyez une règle individuelle, une barre apparaît en haut de l'éditeur avec un lien « Afficher tout dans le dossier » pour revenir rapidement à la vue du dossier complet.

Bascule de la barre latérale

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.

Redimensionnement des éditeurs

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.

Raccourcis

RaccourciAction
EnterRechercher (nouvelle requête) ou passer au résultat suivant (quand la requête est inchangée)
Shift+EnterRé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+FDepuis l'éditeur de code, déplace le focus vers le champ de recherche
EscEfface le champ de recherche

Motifs d'URL

Un motif d'URL définit sur quelles pages le dossier s'active.

MotifCorrespond à
https://justzix.com/adminUniquement 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 »
Astuce : la correspondance ignore la query string (?id=123) et le hash (#section), sauf si vous les incluez dans le motif.

États des règles (Actif / Activé)

Chaque règle a deux indicateurs indépendants :

IndicateurSignification
ActifIndique 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.

Cascade des interrupteurs

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.

Exemples pratiques

Règle toujours manuelle

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.

Règle toujours activée avec le dossier

Actif : OUI • Activé : OUI

Réglage standard. Activer/désactiver le dossier pilote aussi cette règle.

Règle temporairement désactivée

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.

Bouton flottant et panneau

ActionEffet
Clic gaucheBascule de tous les dossiers correspondants (activer/désactiver)
Clic droitOuvre un panneau avec la liste des dossiers et règles
GlissementDéplace la position (mémorisée par fenêtre)

Dans le panneau déroulant (clic droit) vous pouvez :

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.

Masquer le bouton flottant pour une page : dans le widget du popup de l'extension — cliquez sur l'icône JustZix à côté de l'adresse et appuyez sur l'icône « eye-off » à côté du nom du dossier. Restauration via le lien « Restaurer le bouton flottant » au même endroit.

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 :

Barres d'action (ActionBars)

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).

Création et édition d'une barre

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 :

Visibilité héritée vers le bas

Assignation d'une action à une barre

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).

Collage des barres (snap & connect)

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 :

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 ».

Afficher/masquer les barres — depuis 3 endroits

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 :

  1. Panneau flottant (clic droit sur le bouton flottant principal de JustZix) — section « Barres d'action » sous la liste des dossiers/groupes/règles. La case à cocher par barre montre l'état persistant. Clic → bascule de actionBar.enabled.
  2. Widget du popup (clic sur l'icône de l'extension à côté de l'adresse) — section « Barres d'action » sous la liste des dossiers. Plus une petite icône « eye-off » par dossier — elle masque le bouton flottant pour la page courante (restauration via le lien « Restaurer le bouton flottant »).
  3. chrome.contextMenus (clic droit sur la page → JustZix → Barres d'action) — un sous-menu dynamique avec une case à cocher par barre. La liste est reconstruite par onglet actif et à chaque changement d'état.
Masquage persistant vs runtime :
Les positions de toutes les barres (et du bouton flottant) sont enregistrées par fenêtre de navigateur dans la mémoire de session. Chaque fenêtre a ses propres positions, indépendamment des autres. Elles se réinitialisent à la fermeture de la fenêtre ou au redémarrage de Chrome.

Mode édition de la barre — disposition libre

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 :

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.

Les positions et tailles en mode 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.

Types d'action : BUTTON / SELECT / INPUT / SLIDER / TEXTAREA / TOGGLE3

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 :

TypeUIQuand le code se déclenche
BUTTONBouton cliquable avec un libellé de 6 caractères maxclic de l'utilisateur
SELECT staticMenu déroulant personnalisé dans le style de la barre — options configurées dans une modalechoix d'une option (value = option.value)
SELECT jsÉlément <select> natif — votre code remplit les options et y attache un handlerUNE FOIS au rendu ($el = <select>)
INPUTChamp de texte avec placeholder (une seule ligne)change (Enter ou blur)
SLIDERCurseur <input type="range"> avec libellé + affichage de la valeurchange (relâchement de la souris / Enter), value = nombre
TEXTAREAChamp multiligne — Enter est un vrai saut de ligne (ne déclenche PAS le code)change (blur — sortie du champ)
TOGGLE3Contrôle segmenté à 3 états (de type radio) — 3 mini-boutons, un actifclic 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).

Champs communs

SELECT — modale des options

Un clic sur « Options (N) » dans la carte d'une action de type SELECT ouvre une modale :

INPUT — modale de configuration

SLIDER — modale de configuration

TEXTAREA — modale de configuration

TOGGLE3 — modale de configuration

Mémoire persistante (SELECT, INPUT, SLIDER, TEXTAREA, TOGGLE3)

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 :

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).

Sécurité : le 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.

ID stable de l'action

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 :

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).

Fenêtres sur la page (CSS / JS / Consoles)

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.

TypeCouleurÀ quoi ça sert
CSS panevertTextarea CSS injectée en direct comme <style>
JS paneambreTextarea JS exécutée à chaque changement du code
JS ConsolevioletREPL — vous saisissez du code, Ctrl+Enter l'exécute, la sortie en dessous
Output ConsoleémeraudeAperçu en lecture seule des journaux de la page (console.* + erreurs)

CSS pane

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.

JS pane

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 »).

JS Console (REPL)

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 :

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.

Output Console

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.

Six onglets avec compteurs

La fenêtre est divisée en 6 onglets, chacun avec un compteur d'entrées (badge) :

OngletContenu
AllToutes les entrées de toutes les sources, chronologiquement
JZconsoleUniquement votre logger window.JUSTZIX.*
ConsoleUniquement les console.log/info/warn/error/debug standard de la page
NetworkRequêtes réseau de la page (via chrome.webRequest)
ErrorsExceptions non capturées et rejets de Promise — avec détails déroulables
DataLayerPushes dans window.dataLayer (GTM) + aperçu en direct de l'objet

Barre de filtres contextuels

Entre les onglets et le champ de recherche se trouve une barre de filtres qui change selon l'onglet sélectionné :

Recherche

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.

Journaux de console — déroulables comme dans les DevTools

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.

Onglet Network

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.

Onglet DataLayer

La fenêtre DataLayer est divisée en deux colonnes :

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).

Logger personnalisé — window.JUSTZIX

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 :

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.

Ce qui est intercepté

Les 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.

Aide rapide — Ctrl+Shift+H

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.

Personnalisation de l'apparence de la fenêtre

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).

Glisser-déposer, accrochage et connexion

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.

Redimensionnement de la fenêtre

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.

Défilement à l'intérieur de la fenêtre

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).

Clic droit sur l'en-tête de la fenêtre

Bouton de fermeture et double-clic sur l'en-tête

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 :

Collage et surlignage du bord

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.

Panneaux TEMP — fenêtres temporaires

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 :

Création / fermeture (bascule) :

AI Helper — assistant IA

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.

Configuration des clés API

Dans le menu Paramètres de la barre latérale, l'entrée « AI Helper » ouvre une modale de configuration :

Sécurité des clés : les clés API sont par défaut stockées uniquement dans la mémoire locale de cet appareil (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.

Fenêtre de chat

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.

Workflow agentique

AI Helper mène la conversation selon un workflow établi :

  1. Il demande des détails — la portée de l'URL, les noms du dossier/groupe/règle, les couleurs, l'objectif exact.
  2. Il examine la page avec l'outil query_page (sélecteurs, structure du DOM) avant d'écrire du code.
  3. Il insère le code CSS/JS préparé dans une fenêtre temporaire TEMP, que vous voyez en direct sur la page.
  4. Il vérifie les erreurs lui-même — avec les outils read_temp_pane et read_console, il vérifie que le code testé ne signale aucune erreur avant de vous montrer le résultat.
  5. Il demande de vérifier l'effet et demande explicitement si le test a réussi.
  6. Quand le test échoue — il corrige le code et teste à nouveau.
  7. Seulement après votre confirmation, il rend la solution permanente : crée un dossier → un groupe → une règle, et au besoin également une barre d'action et des actions. Chaque création d'entité nécessite une confirmation distincte dans l'extension.

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 :

OutilAction
query_pageRenvoie le nombre de correspondances du sélecteur et le HTML de jusqu'à 5 éléments
list_structureRenvoie les dossiers / groupes / règles existants avec leurs id
open_temp_paneOuvre une fenêtre temporaire TEMP (CSS ou JS)
set_temp_pane_codeInsère du code dans une fenêtre TEMP — sert aux tests en direct
read_temp_paneVérifie la fenêtre TEMP — pour le JS exécute le code et renvoie une erreur ou un succès
read_consoleOuvre une fenêtre TEMP Output Console et renvoie les entrées console capturées de la page
create_folderCrée un dossier + un groupe par défaut (nécessite une confirmation)
create_groupCrée un groupe dans un dossier (nécessite une confirmation)
create_ruleCrée une règle avec du code CSS/JS (nécessite une confirmation)
create_barCrée une barre d'action attachée à un dossier/groupe/règle (nécessite une confirmation)
create_actionCrée une action (button/select/input/slider/textarea/toggle3) sur une barre (nécessite une confirmation)
request_user_inputAffiche à 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_allRetournent 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_actionRetournent les données complètes d'une entité spécifique (avant un changement planifié)
update_folder / update_group / update_rule / update_bar / update_actionModifient une entité existante — nécessite une confirmation (avec un diff des champs)
create_css_pane / create_js_pane / create_js_console / create_output_consoleCréent une fenêtre persistante sur la page (nécessite une confirmation)
read_*_pane / read_*_console + update_*_pane / update_*_consoleLecture et modification des métadonnées des fenêtres persistantes (nom, couleur, position, taille, style)
read_pane_code / update_pane_codeLecture et insertion du code CSS/JS dans une fenêtre persistante (par onglet de navigateur) — nécessite une confirmation
screenshot_pageCapture 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
AI Helper peut créer, lire et modifier toute la structure de l'extension (dossiers / groupes / règles / barres / actions / fenêtres persistantes), vérifier lui-même les erreurs du code testé (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.

Apparence de la fenêtre AI Helper

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.

Collage avec d'autres fenêtres et ordre (Z-order)

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.

Capture d'écran de la page (pour les modèles vision)

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.

Raccourcis clavier

Globaux (fonctionnent depuis n'importe quel endroit de la page)

RaccourciAction
Ctrl+Alt+GCréer / fermer le panneau TEMP CSS
Ctrl+Alt+HCréer / fermer le panneau TEMP JS
Ctrl+Alt+JCréer / fermer la Console TEMP JS
Ctrl+Alt+KCréer / fermer la Console TEMP Output
Ctrl+Alt+IOuvrir le panneau d'édition (fenêtre séparée), première règle active sur cette page, onglet CSS
Ctrl+Alt+OComme ci-dessus, onglet JS
Ctrl+Alt+PComme ci-dessus, onglet Actions
Ctrl+Alt+\Ouvrir / fermer la fenêtre AI Helper
Ctrl+Alt+SMode édition de la barre d'action — activer / désactiver
Ctrl+ZAnnuler le dernier changement (uniquement en mode édition de la barre)
DeleteSupprimer les étiquettes sélectionnées (uniquement en mode édition de la barre)
EscDésélectionner tous les éléments (uniquement en mode édition de la barre)
Ctrl+Shift+LEffacer l'onglet actif de chaque Output Console
Ctrl+Shift+HAide rapide — raccourcis et fenêtres sur la page (partout)

À l'intérieur d'une fenêtre (quand elle a le focus)

RaccourciActionFenêtre
Ctrl+EnterExécuter le code / envoyer le messageJS pane, JS Console, AI Helper
/ Historique des commandesJS Console (input)
Ctrl+LEffacer la sortieJS Console
EscEffacer le champ de rechercheOutput Console

Éditeurs de code (panneau d'édition)

RaccourciAction
Ctrl+Alt+FFocus sur le champ de recherche au-dessus de l'éditeur
Ctrl+Alt+→ / Ctrl+Alt+←Résultat de recherche suivant / précédent
Enter / Shift+EnterRechercher / résultat suivant / précédent (dans le champ de recherche)
Ctrl+Alt+I / O / PBasculer l'onglet de la règle active sur CSS / JS / Actions (quand la carte de la règle est rendue)
Pourquoi ces combinaisons ? 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.

Export et import

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.

Export — complet ou des éléments sélectionnés

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[].

Export d'un seul dossier (avec sélection)

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.

Export d'un groupe

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.

Export d'une seule règle

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.

Cinq formats de fichiers :

Import — détection automatique du type (modale d'import complet)

Aprè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é :

CouleurSignificationAction
Teal (turquoise)Sauvegarde complète valideAffiche le nombre de dossiers/règles, la date d'export, un avertissement d'écrasement
VioletSauvegarde partielle (partial: true)Choix du mode : Fusionner avec l'existant ou Remplacer tout
OrangeType de fichier inapproprié dans cette modaleMessage orientant vers la bonne modale, bouton Importer bloqué
RougeErreur d'analyse JSON / format invalideBouton Importer bloqué

Modes d'import partiel (panneau violet)

Import d'un seul dossier

Dans la barre du dossier : Import. Vérifie les conflits par ID et par nom :

Import d'un groupe

Dans la barre du groupe : Import — accepte 3 formats :

Toutes 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).

Import d'une seule règle

Dans la vue d'une règle : Import de la règle — accepte uniquement justzix-rule. Prompt avec 3 options :

L'import complet écrase tous les paramètres (sauf s'il s'agit d'une sauvegarde partielle en mode « Fusionner »). Faites un export avant l'import pour avoir une sauvegarde.

Utilisations pratiques de l'export partiel

Synchronisation cloud

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.

Compte et clé de synchronisation

Première synchronisation — résolution des conflits

Lors de la connexion, l'extension compare les données locales avec celles du cloud :

ChoixCe que cela fait
Utiliser les données du cloudVide la bibliothèque locale et reconstruit l'état du compte à partir du serveur
Envoyer mes données localesLes données locales deviennent canoniques — cela supprime ce qui se trouvait dans le cloud
FusionnerCombine 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.

Synchronisation continue

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é.

Protection contre les fantômes. Un dossier précédemment supprimé sur un appareil pouvait « ressusciter » lors de la connexion sur un autre. L'extension récupère désormais la liste des entités supprimées (tombstones) depuis le serveur et ne renvoie pas quelque chose qui a été supprimé ailleurs.

Onglet Statut — bibliothèque cloud, historique, actions

L'onglet Statut de la modale de synchronisation affiche l'état du compte et propose des boutons d'action :

Bibliothèque cloud

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.

Historique de synchronisation

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.

Ce qui se synchronise et ce qui ne se synchronise pas

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.

Partage par lien (Shares)

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.

Format du jeton

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).

Limites du compte

Dépasser une limite = erreur avec un message en polonais. Révoquez les liens inutilisés dans le panneau Mes partages.

Création d'un lien (expéditeur)

Le bouton « Partager l'URL » dans quatre points d'entrée, à côté de « Télécharger le fichier » :

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 :

Chacun a son bouton « Copier ». La date d'expiration est également affichée dans le fuseau horaire local.

Panneau « Mes partages »

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 :

La 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.

Importer depuis un lien (destinataire)

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) :

TypeCe qui se passe
justzix-ruleCrée un nouveau dossier + un groupe « Par défaut » + la règle importée
justzix-groupCrée un nouveau dossier + le groupe importé + les règles
justzix-folderAjoute comme nouveau dossier de premier niveau
justzix-fullFusion : 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é.

Erreurs du destinataire

ErreurMessage
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é.

Appel programmatique des actions depuis le JS

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.

API — actions

AppelCe qu'il fait
JZ.click(labelOrId)Clique de manière programmatique. Sémantique par type d'action : BUTTONel.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 / SLIDERel.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')). TOGGLE3el.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).

Exemple — lecture et définition de valeurs

// === 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

API — barres et bouton flottant

AppelCe 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é).
La recherche dans 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_...').

Variables de contexte dans le code d'action

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 :

VariableCe qu'elle contientQuand disponible
$elL'élément DOM de cette action (input / select / button / textarea / conteneur toggle3)toujours quand action.id existe
$action{ id, label, type, el }toujours
valueLa 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.
stateIdxEntier 0-2 — l'index de l'état actif (l'état depuis lequel le clic a commencé).uniquement TOGGLE3
stateLabelChaîne — le libellé de l'état actif (5 caractères max).uniquement TOGGLE3

Snippet dans l'UI

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.

Prérequis

Exemple — une action AUTO appelant une séquence

// 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)

Exemple — JS de règle réagissant au DOM

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 });

Exemple — définition programmatique de la valeur d'un INPUT

// 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'));
}

Accès direct via le DOM

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'actionConteneurSé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.

La recherche par libellé (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().

Fonctionnalités sélectionnées

Recherche dans la barre latérale

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.

Interrupteur global

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.

Insérer l'URL de l'onglet

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.

Validation d'URL en direct

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.

Historique des modifications d'une règle

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.

Tags et recherche par tags

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.

Libellé et couleur du dossier

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.

Statistiques de clics des actions

Chaque bouton d'action compte combien de fois il a été cliqué. Cela aide à voir lesquels sont vraiment utilisés.

Validation du CSS

Sous l'éditeur CSS s'affiche une barre avec la liste des problèmes de syntaxe :

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).

Aperçu du JS à l'import

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.

Isolation try/catch du JS

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.

Quota de stockage

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 %.

Filtre « Uniquement actifs »

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.

Mise à jour de l'extension

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.

Notification de nouvelle version

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.

Procédure de mise à jour (Chrome / Edge / Opera)

  1. Téléchargez le nouveau ZIP de mise à jour
  2. Décompressez-le en écrasant le même dossier où se trouvait la version précédente
  3. Dans chrome://extensions/ (Edge : edge://extensions/) trouvez l'extension et cliquez sur l'icône de rafraîchissement sur la tuile
  4. L'extension se recharge avec les nouveaux fichiers, les données restent

Firefox

Le 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.

Ce qui peut causer une perte de données : Faites toujours un export avant toute opération sur l'extension. Si vous utilisez la synchronisation cloud — les données sont aussi dans le cloud du compte.

Exemples CSS

CSS Masquer les publicités et les bannières
/* 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;
}
CSS Mode sombre pour une page sans support du dark mode
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.

CSS Mettre en évidence des éléments pour les tests / e2e
/* 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;
}
CSS Panneau d'administration plus lisible
/* 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;
}
CSS Conteneur de contenu plus large
/* Souvent les pages ont un max-width rigide de 1200px - forcer la largeur */
.container, .main-content, main {
  max-width: 95% !important;
  width: 95% !important;
}
CSS Environnement dev rendu évident (bannière colorée)
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.

Exemples JavaScript

JS Auto-remplissage des champs de connexion (environnement dev)
// 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';
});
JS Journalisation des événements analytiques dans la console
// 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.

JS Auto-skip intro / cookie / publicités
// 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);
JS Ajout de raccourcis clavier
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();
  }
});
JS Désactivation des alerts / confirm / beforeunload
// 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);
JS Déplacement d'un élément ailleurs dans le DOM
// 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);
  }
});
JS Affichage des champs / éléments masqués
// 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);
});

Exemples de boutons d'action

ACTION CLR — vider le formulaire

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 }));
});
ACTION FILL — remplir avec des données de test

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 }));
  }
});
ACTION CART — ajouter un produit de test au panier

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');
ACTION COPY — copier l'URL de la page dans le presse-papiers

Raccourci : COPY   Couleur : violet

navigator.clipboard.writeText(location.href).then(() => {
  console.log('Copié :', location.href);
});
ACTION TKN — afficher le jeton d'authentification

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');
}
ACTION SQL — afficher les requêtes API dans la console

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.');
ACTION ENV — afficher des infos sur l'environnement

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));

Scénarios d'utilisation

1. Travail avec plusieurs clients / projets

Chaque projet a son propre dossier avec son propre motif d'URL. Vous pouvez avoir des dossiers :

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.

2. Environnement de développement avec marquage visuel

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.

3. Outils pour le product manager / la QA

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.

4. Modifications de pages publiques

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é.

5. Débogage de l'analytique / GTM

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.

6. Travail sur les panneaux d'administration

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.

7. Tests sûrs en production

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é');

Problèmes courants et solutions

Le JavaScript ne s'est pas exécuté

Le CSS ne fonctionne pas

Le bouton flottant n'apparaît pas

J'ai perdu des données après une mise à jour de l'extension

L'extension a une clé fixe dans le manifeste — les mises à jour suivantes conservent les données. Si malgré tout les données ont disparu :

Les positions des boutons/panneaux se réinitialisent

C'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.

L'export partiel a omis certains paramètres globaux

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 ».

L'import partiel a écrasé un dossier qui n'existait pas avant

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.

L'arborescence des dossiers ne se déploie pas

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.

Je ne vois pas le bouton Export/Import du dossier

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.

AI Helper ne répond pas

Conflit avec la Content Security Policy

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