Eigene CSS-Styles, JavaScript-Code und Aktionsbuttons auf beliebige Seiten einschleusen
JustZix ermöglicht es, eigenes CSS und JavaScript automatisch auf ausgewählte Seiten einzuschleusen sowie Aktionsbuttons zu definieren (Kürzel, die Code-Fragmente auf Abruf ausführen).
https://justzix.com/*. Das gesamte Verzeichnis lässt sich mit einem Klick ein- und ausschalten.Jeder Satz und jede Gruppe kann eine eigene Liste zusätzlicher URL-Muster erhalten (Chip-Eingabe). Ist die Liste leer, wirkt das Element überall dort, wo das Verzeichnismuster passt. Setzt du z. B. https://justzix.com/admin/*, wirkt das Element nur auf den Admin-Unterseiten.
| Verzeichnismuster | Satzmuster | Wirkt auf |
|---|---|---|
https://justzix.com/* | (leer) | die gesamte Domain justzix.com |
https://justzix.com/* | https://justzix.com/admin/* | nur den Bereich /admin/ |
https://justzix.com/* | https://justzix.com/produkty/*https://justzix.com/koszyk | nur Produkt-Unterseiten + Warenkorb |
*://localhost:*/* | *://localhost:3000/* | nur Port 3000 (dev) |
Für neue Nutzer hat JustZix ein eingebautes interaktives Tutorial, das dich Schritt für Schritt durch den Aufbau einer kompletten Lösung führt — vom Verzeichnis über Gruppe und Regelsatz bis zu CSS/JS-Code und einer Aktionsschaltfläche. Hinweise erscheinen als Sprechblasen an den jeweiligen Elementen des Panels.
So startest du es:
Im Fenster „Tutorial-Zentrum" wählst du ein Tutorial und klickst Starten. Während des Tutorials:
Zugriff per Rechtsklick auf das Erweiterungssymbol → „Optionen" oder per Klick auf das Symbol → Button „Bearbeitungspanel".
Ein kleiner runder Button erscheint automatisch auf Seiten, die zu einem beliebigen Verzeichnis passen. Standardmäßig zeigt er die Aufschrift ZIX, aber jedes Verzeichnis kann ein eigenes Label haben.
Verzeichnis-Label: In der Verzeichnisleiste, ganz links (neben dem Color Picker), gibt es ein Textfeld für das Button-Label. Erzwungene Grenzen: max. 3 Zeichen, immer GROSSBUCHSTABEN (die Umwandlung in Großbuchstaben erfolgt sofort beim Tippen). Das Feld akzeptiert Buchstaben und Ziffern — Beispiele: ZIX, QA, DEV, ADM, X. Bei mehreren passenden Verzeichnissen wird das Label des ersten Verzeichnisses, das eines gesetzt hat, verwendet; die übrigen werden übersprungen (leeres Feld = Fallback auf ZIX).
Zustand per Farbe (Brand-Palette):
Verzeichnisfarbe: Wenn du beim Verzeichnis einen Color Picker setzt, übernimmt der schwebende Button auf passenden Seiten diese Farbe. Die Zustände „mixed" und „off" modulieren die Sättigung automatisch. Bei mehreren passenden Verzeichnissen wird die Farbe des ersten Verzeichnisses mit gesetzter Farbe verwendet.
Beim Betreten des Bearbeitungspanels öffnet die Erweiterung das Dashboard — eine Startseite mit einer Zusammenfassung der Bibliothek und Schnellzugriffen. Früher wählte das Panel automatisch das erste Verzeichnis der Liste aus; jetzt siehst du stattdessen eine Übersicht.
Das Dashboard ist über einen Klick auf das Logo in der Sidebar sowie über das „Haus"-Symbol in der Breadcrumb-Leiste jedes Editors (Verzeichnis, Gruppe, Satz) erreichbar. Die Kopfzeile des Dashboards selbst hat ebenfalls ein „Haus"-Symbol — ein Klick darauf aktualisiert die Daten (lädt die Bibliothek erneut aus dem Storage und rendert das Dashboard von Neuem).
Das Dashboard ist in festen Kartenreihen aufgebaut:
chrome.storage.local-Auslastung sowie das Datum des letzten Cloud-Backups.Die Karten „Neueste Beispiele" und „Aus dem Blog" beziehen ihren Inhalt von der Projektseite; ist der Endpunkt nicht verfügbar (z. B. offline), werden beide Karten ausgeblendet. Die Version der Erweiterung wird bei jedem Aufruf des Dashboards frisch geprüft.
Das linke Panel im Bearbeitungsmodus zeigt die Verzeichnisse in einer Hierarchie — jedes Verzeichnis lässt sich aufklappen, um seine Sätze zu sehen und zur Bearbeitung eines bestimmten Satzes zu wechseln.
| Element | Aktion |
|---|---|
| Aufklapppfeil | Klappt die Liste der Sätze oder Gruppen auf/zu (sitzungsübergreifend gemerkt) |
| Klick auf Verzeichnisnamen (zugeklappt) | Wählt das Verzeichnis aus, öffnet den Folder-Editor und klappt seine Gruppen/Sätze auf |
| Klick auf bereits ausgewähltes Verzeichnis | Umschalten: klappt zu (erneuter Klick klappt wieder auf) — analog für Gruppen |
| Klick auf Gruppennamen (zugeklappt) | Wählt die Gruppe aus, öffnet den Group-Editor und klappt ihre Sätze auf |
| Klick auf Satznamen | Öffnet die Einzelansicht des Satzes (Rule-Editor) |
| Checkbox beim Verzeichnis | Schaltet das gesamte Verzeichnis ein/aus (Kaskade zu den Gruppen und ihren aktiven Sätzen) |
| Checkbox bei der Gruppe | Schaltet die Gruppe ein/aus (Kaskade zu ihren aktiven Sätzen) |
| Checkbox beim Satz | Steuert einen einzelnen Satz unabhängig |
| Status ●/○ neben Verzeichnis/Gruppe/Satz | Aktiv: ● aktiv, ○ inaktiv (zwangsweise ausgeschaltet) |
| C J A U neben dem Satz | Inhalts-Labels: C = hat CSS, J = hat JavaScript, A = hat Aktionen, U = hat eigene URL-Muster. Erscheinen nur, wenn das jeweilige Feld nicht leer ist. |
| Farbleiste links | Die Verzeichnisfarbe wird per box-shadow inset gezeichnet — verschiebt die Position des Verzeichnisnamens nicht (Verzeichnisse mit und ohne Farbe sind ausgerichtet) |
| Drag-&-Drop-Griff | Mit der Maus greifen und ziehen, um die Reihenfolge zu ändern |
expandedFolders, expandedGroups).
Fahre über ein Verzeichnis, eine Gruppe oder einen Satz — links erscheint ein Drag-&-Drop-Griff. Mit der Maus greifen und ziehen:
Die senkrechte Leiste zwischen Sidebar und Editor blendet das linke Panel aus — nützlich, wenn du mehr Platz für den Editor brauchst. Der Zustand wird sitzungsübergreifend gemerkt. Nach dem Ein-/Ausblenden aktualisiert CodeMirror seine Breite automatisch.
Unter jedem Editor (CSS, JS, Aktionscode) gibt es eine horizontale Leiste mit einem Griff zum vertikalen Ziehen. Greife mit der Maus und ziehe nach unten, um den Editor zu vergrößern. Mindesthöhe 80px, Maximum unbegrenzt — die Seite scrollt natürlich mit dem Inhalt mit.
Über jedem CodeMirror-Code-Editor — CSS und JavaScript in der Satzkarte sowie „JS-Code" im Aktionseditor — befindet sich eine Suchleiste: ein Textfeld und ein Button mit Lupensymbol.
n / gesamt.| Kürzel | Aktion |
|---|---|
Enter | Suchen (neue Abfrage) oder zum nächsten Ergebnis springen (bei unveränderter Abfrage) |
Shift+Enter | Vorheriges Ergebnis |
Ctrl+Alt+→ / Ctrl+Alt+← | Nächstes / vorheriges Ergebnis — funktioniert aus dem Editor und aus dem Suchfeld |
Ctrl+Alt+F | Verschiebt den Fokus aus dem Code-Editor in das Suchfeld |
Esc | Leert das Suchfeld |
Ein URL-Muster legt fest, auf welchen Seiten ein Verzeichnis aktiv wird.
| Muster | Passt auf |
|---|---|
https://justzix.com/admin | Nur genau diese URL |
https://justzix.com/* | Alle Seiten auf justzix.com |
https://*.justzix.com/* | Alle Subdomains und Seiten |
*://localhost:*/* | Alle lokalen Anwendungen |
https://example.com/admin/* | Nur den Bereich /admin/ und Unterseiten |
*example* | Jede URL, die „example" enthält |
?id=123) und den Hash (#section), es sei denn, du nimmst sie ins Muster auf.
Jeder Satz hat zwei unabhängige Flags:
| Flag | Bedeutung |
|---|---|
| Aktiv ● | Ob dieser Satz vom Schalter des Verzeichnisses und der Gruppe gesteuert wird (beide Ebenen kaskadieren zu den aktiven Regeln). Das Einschalten eines Verzeichnisses oder einer Gruppe schaltet alle aktiven Sätze darin ein. |
| Eingeschaltet ✓ | Aktueller Zustand: ob der Satz gerade auf die Seiten eingeschleust wird. |
Verzeichnis umschalten → ändert enabled aller aktiven Regeln in seinen Gruppen
Gruppe umschalten → ändert enabled aller aktiven Regeln dieser Gruppe
Satz umschalten → ändert nur enabled dieses Satzes
Regeln mit Aktiv: NEIN (Badge ○) werden bei Kaskaden übersprungen — du steuerst sie nur manuell, unabhängig vom Zustand des Verzeichnisses und der Gruppe.
Aktiv: NEIN • Eingeschaltet: manuell gesteuert
Der Satz reagiert nicht auf das Einschalten des gesamten Verzeichnisses. Du steuerst ihn nur manuell. Ideal für experimentelle Modifikationen, die du nicht en bloc einschalten möchtest.
Aktiv: JA • Eingeschaltet: JA
Standardeinstellung. Das Ein-/Ausschalten des Verzeichnisses steuert auch diesen Satz.
Aktiv: JA • Eingeschaltet: NEIN
Der Satz ist mit dem Verzeichnis „verbunden", aber vorübergehend ausgeschaltet. Der nächste Klick auf den Hauptschalter des Verzeichnisses aktiviert ihn wieder.
| Aktion | Wirkung |
|---|---|
| Linksklick | Schaltet alle passenden Verzeichnisse um (ein/aus) |
| Rechtsklick | Öffnet ein Panel mit der Liste der Verzeichnisse und Sätze |
| Ziehen | Verschiebt die Position (pro Fenster gemerkt) |
Im aufklappenden Panel (Rechtsklick) kannst du:
actionBar.enabled (persistent, propagiert zum Bearbeitungspanel)Das Panel zeigt nur aktive Sätze (●) — unabhängige (○) werden der Kürze halber ausgeblendet. Wenn ein Verzeichnis nur eine Gruppe namens „Standard" hat, wird die Gruppenüberschrift übersprungen — man sieht nur die Sätze.
Ein Klick auf das JustZix-Symbol in der Erweiterungsleiste von Chrome öffnet das Popup-Widget — ein kompaktes Steuerpanel für den aktuellen Tab. Von oben nach unten:
actionBar.enabled).In einem Workspace kannst du mehrere Aktionsleisten haben — jede mit eigenem Namen, eigener Ausrichtung, eigener Hintergrundfarbe, eigenem Button-Satz und unabhängiger Position pro Browserfenster. Eine Leiste kann einem Verzeichnis, einer Gruppe oder einem einzelnen Satz zugeordnet sein (das bestimmt Sichtbarkeit und Kaskade).
Im Editor eines Verzeichnisses, einer Gruppe oder eines Satzes gibt es einen Button „Aktionsleisten (N)". Ein Klick öffnet das Verwaltungs-Modal für Leisten. Im Modal:
barId).Jede Aktion im Reiter „Aktionen" der Satzkarte hat ein Dropdown „Aktionsleiste" — du wählst die Zielleiste aus der Liste der für diesen Satz sichtbaren Leisten (eigene Leisten des Satzes + Gruppenleisten + Verzeichnisleisten).
Beim Ziehen einer Leiste erkennt die Erweiterung die Ränder benachbarter Leisten und des schwebenden Buttons im Abstand ≤ 12 px. Es erscheint ein Sticky-Visual-Indikator, und nach dem Loslassen verbinden sich die Leisten zu einer Verbindungsgruppe. Danach:
__float als Pseudo-Leiste).Rechtsklick auf den Drag-Griff einer Leiste → Kontextmenü:
Im Leisten-Bearbeitungsmodus ist dieses Menü deaktiviert; der Rechtsklick auf ein Label bietet dann die Option „Label löschen".
Zum dauerhaften Ein-/Ausschalten von Aktionsleisten (ohne F5) bietet die Erweiterung drei Einstiegspunkte, die alle auf dasselbe actionBar.enabled im Storage abgebildet werden — eine Änderung von einer Stelle propagiert zum Bearbeitungspanel und zu den übrigen Oberflächen:
actionBar.enabled um.actionBar.enabled = false — die Leiste wird überhaupt nicht gerendert, der Zustand synchronisiert sich zwischen Geräten (Sync), im Bearbeitungspanel sichtbar.barsHidden[barId] = true pro Browserfenster — die Leiste verschwindet bis F5 / Schließen des Fensters. Das Einschalten über Popup/Floating-Panel löscht diesen Runtime-Hide automatisch.Der Bearbeitungsmodus der Aktionsleiste wird auf drei Wegen aktiviert: per Kürzel Ctrl+Alt+S (funktioniert von jeder Stelle der Seite aus), per Schalter im Popup-Widget der Erweiterung sowie über das Chrome-Kontextmenü (Rechtsklick → „Leisten-Bearbeitungsmodus"). Oben am Bildschirm erscheint eine Infoleiste; die erneute Verwendung eines beliebigen Schalters verlässt den Modus.
Im Bearbeitungsmodus ist das normale Verhalten der Elemente ausgesetzt (ein Klick führt keinen Code aus, Felder nehmen keinen Fokus an) — stattdessen lassen sich Elemente anordnen und skalieren:
Ctrl+Klick = zur Auswahl hinzufügen/entfernen; Klick auf leere Fläche oder Esc = alles abwählen. Shift+Ziehen über die leere Fläche = Bereichsauswahl (Rechteck).Delete löscht alle ausgewählten Labels auf einmal; ein Rechtsklick auf ein Label bietet die Option „Label löschen"; es gibt auch einen Button „Löschen" im Label-Editor. Aktionselemente werden im Bearbeitungspanel gelöscht (sie gehören zu den Regeln).flow) wieder her: er entfernt benutzerdefinierte Positionen und Größen der Elemente sowie alle Labels (mit Bestätigung).Ctrl+Z macht die letzte Änderung rückgängig (Verschieben, Größenänderung, Hinzufügen/Bearbeiten/Löschen eines Labels, Zurücksetzen). Die Historie umfasst die aktuelle Bearbeitungssitzung.Der Bearbeitungsmodus ist „hart": Verschieben und Größenänderung rasten an einem 8-px-Raster ein, ein Element lässt sich weder aus der Leiste herausziehen noch über ein anderes legen — bei einer Kollision erhalten beide Elemente (das verschobene und das darunterliegende) einen roten Rahmen, und nach dem Loslassen kehrt das Element an seine vorherige Position zurück. Die Leiste lässt sich nicht so verkleinern, dass ein Element nach außen gerät; wenn ein neues Element oder Label nicht in die Leiste passt, vergrößert sich die Arbeitsfläche der Leiste automatisch. Ein Rechtsklick auf die Leiste im Bearbeitungsmodus zeigt nicht das Menü „Leiste ausblenden/trennen".
Leisten-Layoutmodi: Die Leiste startet im Modus flow (klassisches Flexbox — Elemente hintereinander, vertikal oder horizontal). Das erste Verschieben oder Skalieren eines Elements konvertiert die Leiste in den Modus custom (Arbeitsfläche mit freier Positionierung) — visuell ohne Änderung, da das aktuelle Layout als Ausgangspunkt als Snapshot festgehalten wird.
custom (bar.layoutMode, bar.size, action.layout, action.size) werden dauerhaft gespeichert und zwischen Geräten synchronisiert — im Gegensatz zur „Schwebe"-Position der Leiste auf der Seite, die pro Browserfenster bleibt.
Jede Aktion hat einen Typ — wählbar über ein Dropdown am Anfang jeder Aktion in der Satzkarte. Es stehen 6 Typen zur Verfügung:
| Typ | UI | Wann der Code ausgelöst wird |
|---|---|---|
| BUTTON | Anklickbarer Button mit Label von max. 6 Zeichen | Klick des Benutzers |
| SELECT static | Benutzerdefiniertes Dropdown im Leistenstil — Optionen werden im Modal konfiguriert | Auswahl einer Option (value = option.value) |
| SELECT js | Natives <select> — dein Code befüllt die Optionen und bindet den Handler | EINMAL beim Rendern ($el = <select>) |
| INPUT | Textfeld mit Platzhalter (einzeilig) | change (Enter oder Blur) |
| SLIDER | Schieberegler <input type="range"> mit Label + Wertanzeige | change (Maustaste loslassen / Enter), value = Zahl |
| TEXTAREA | Mehrzeiliges Feld — Enter ist ein echter Zeilenumbruch (löst den Code NICHT aus) | change (Blur — Verlassen des Feldes) |
| TOGGLE3 | 3-stufiger Segmented Control (Radio-artig) — 3 Mini-Buttons, einer aktiv | Klick auf einen inaktiven Zustand, value = state.value des aktiven, plus stateIdx und stateLabel im Scope |
Statische Text-Labels sind kein Aktionstyp — sie werden direkt auf der Leiste im Bearbeitungsmodus hinzugefügt (siehe „Leisten-Bearbeitungsmodus" → Labels).
value, $el (DOM-Element), $action ({ id, label, type, el }); bei TOGGLE3 zusätzlich stateIdx (0-2) und stateLabel.Ein Klick auf „Optionen (N)" in der Karte einer Aktion vom Typ SELECT öffnet ein Modal:
<select>).{ name, value }. name = was der Benutzer sieht, value = was als Variable value ins JS gelangt.<option> (js-Variante)action.id mit Kopier-Button + ein Beispiel-JS-Selektor.::placeholder nicht inline stylebar ist).min < max.(min+max)/2.change ausgeführt (Maustaste loslassen / Tab / Enter). value = der numerische Wert.\n für Zeilenumbrüche enthalten).change ausgeführt (Blur, NICHT Enter — Enter in einem Textarea ist ein echter Zeilenumbruch). Der Benutzer verlässt das Feld → der Wert wird gespeichert und der Code ausgelöst. value = String mit Zeilenumbrüchen.value übergeben wird). Standard-Labels: OFF / MID / ON.colorText).value (state.value, Fallback auf state.label), stateIdx (0-2), stateLabel, $el (Container-Div).Auswahl / Wert / Schiebereglerposition / Textarea-Inhalt / aktiver Toggle3-Zustand werden automatisch pro Aktion gemerkt. Nach F5 kehrt der Wert zurück; nach dem Schließen des Tabs und erneutem Öffnen (auf einer zur Regel passenden Seite) ebenfalls. Singleton pro action.id — ein Wert, unabhängig von der konkreten URL.
Format des Wertes im Memory je nach Typ:
Storage:
sessionStorage — synchron, F5-sicher, pro Tab.chrome.storage.local.actionMemory[id] — tab-übergreifend, dauerhaft.Keine geräteübergreifende Synchronisierung: Das Memory bleibt lokal. Zwei Computer können unterschiedliche Werte haben (z. B. ein anderer Filter pro Benutzer).
sessionStorage ist von den Skripten der Seite lesbar (Same-Origin). Verwende für sensible Daten kein INPUT — schreibe den Wert stattdessen direkt in das Feld „JS-Code" des Satzes.
Jede Aktion hat eine unveränderliche action.id (Format a_<base36>_<random>). In der Satzkarte gibt es neben jeder Aktion ein Badge mit der Zeilennummer — ein Klick kopiert die vollständige ID in die Zwischenablage, der Tooltip zeigt die vollständige ID.
Im User-JS beziehst du dich über data-jz-action-id:
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');
el.value = 'neuer Wert';
el.dispatchEvent(new Event('change'));
Oder über die window.JZ-Helfer — siehe Aktionen programmatisch aus JS aufrufen.
Rechtsklick auf einer beliebigen Seite → JustZix:
Ctrl+Alt+S und dem Schalter im Popup.actionBar.enabled-Zustand.Die Fenster-Untermenüs werden bei folgenden Ereignissen neu aufgebaut: tabs.onActivated, tabs.onUpdated (URL-Wechsel) und storage.onChanged für folders/groups/rules/actionBars/cssPanes/jsPanes/jsConsoles/outputConsoles/floatingHidden. Das TEMP-Untermenü ist statisch (immer 4 Einträge).
Die Erweiterung bietet vier Typen schwebender Fenster, die neben den Aktionsleisten auf die Seiten eingeschleust werden. Jedes Fenster ist einem Verzeichnis, einer Gruppe oder einem Satz zugeordnet (es erbt die Sichtbarkeit kaskadiert, genau wie die Aktionsleisten) und erscheint auf Seiten, die per URL passen.
Verwaltung: Im Editor eines Verzeichnisses / einer Gruppe / eines Satzes findest du einen Button „Fenster ▾ (N)". Ein Klick öffnet ein Menü mit 4 Typen — du wählst einen Typ, es öffnet sich ein Modal mit der Liste der Fenster dieser Ebene (plus von höheren Ebenen geerbte Fenster). Du fügst hinzu, benennst, färbst, löschst.
| Typ | Farbe | Wofür |
|---|---|---|
| CSS-Pane | grün | Ein CSS-Textarea, das live als <style> eingeschleust wird |
| JS-Pane | amber | Ein JS-Textarea, das bei Code-Änderung ausgeführt wird |
| JS-Konsole | violett | REPL — du gibst Code ein, Strg+Enter führt aus, Ausgabe darunter |
| Output-Konsole | smaragdgrün | Nur-Lese-Vorschau der Logs von der Seite (console.* + Fehler) |
Ein schwebendes Fenster mit einem Textfeld für CSS. Jede Änderung (nach einer kurzen Pause) aktualisiert das eingeschleuste <style> — du siehst den Effekt live. Der Inhalt wird pro Browser-Tab gemerkt (überlebt F5, verschwindet beim Schließen des Tabs). Ideal zum schnellen Testen von CSS, ohne es in einer Regel zu speichern.
Ein Textfeld für JavaScript, das im Kontext der Seite ausgeführt wird. Der Code startet nach einer Änderung (mit Verzögerung) oder manuell per Button ▶ Run / Kürzel Strg+Enter. Ausführungsfehler erscheinen in einer roten Leiste unter dem Code. Wenn der Code seit der letzten Ausführung geändert wurde, leuchtet der Run-Button gelb (Zustand „dirty").
Eine vollwertige Konsole in der Seite. Du gibst Code in das untere Feld ein, Strg+Enter (oder ▶) führt aus, das Ergebnis wird dem Log-Bereich darüber hinzugefügt. Funktionen:
console.log/warn/error/info während der Ausführung werden im Log angezeigt (je nach Typ eingefärbt).Eingabe, Ausgabe und Historie werden pro Tab gemerkt. Die Konsole führt Code in der MAIN-World der Seite aus — du hast Zugriff auf alle Variablen und Funktionen der Seite.
Eine Nur-Lese-Vorschau der Logs — erfasst automatisch alles, was auf der Seite geschieht: console.log/warn/error/info/debug, nicht abgefangene Ausnahmen, unbehandelte Promise-Rejections, den Netzwerkverkehr sowie Pushes in den dataLayer und auch deinen eigenen Logger window.JUSTZIX.*. Im Gegensatz zur JS-Konsole (wo du selbst Code eingibst) — hier fließen die Logs von selbst.
Das Fenster ist in 6 Reiter unterteilt, jeder mit einem Zähler für Einträge (Badge):
| Reiter | Inhalt |
|---|---|
| All | Alle Einträge aus allen Quellen, chronologisch |
| JZconsole | Nur dein Logger window.JUSTZIX.* |
| Console | Nur das Standard-console.log/info/warn/error/debug von der Seite |
| Network | Netzwerkanfragen der Seite (über chrome.webRequest) |
| Errors | Nicht abgefangene Ausnahmen und Promise-Rejections — mit aufklappbaren Details |
| DataLayer | Pushes in den window.dataLayer (GTM) + Live-Vorschau des Objekts |
Zwischen den Reitern und dem Suchfeld gibt es eine Filterleiste, die sich je nach gewähltem Reiter ändert:
log, info, warn, error, debug. Level abwählen → die Zeilen verschwinden aus der Vorschau.Unter der Filterleiste befindet sich ein dauerhaft sichtbares Suchfeld. Es filtert die Einträge des aktiven Reiters live (Teilstring-Abgleich, ohne Groß-/Kleinschreibung). Esc leert das Feld.
Einträge von console.* sind standardmäßig zugeklappt — sie zeigen eine gekürzte Vorschau (z. B. [PickupMap][2026-05-16T15:25Z] AUTO_SELECTION_SKIPPED: {reason: 'Lower priority source', …}). Ein Klick klappt die vollständigen Argumente auf (Objekte/Arrays als aufklappbarer JSON-Baum), analog zur DevTools-Konsole.
Network erfasst Anfragen über chrome.webRequest (Berechtigung webRequest im Manifest). Jeder Eintrag zeigt u. a. die Methode, URL, den Status, Ressourcentyp, die Größe, Dauer, die Remote-Adresse (Remote address) und den Initiator (Initiator). Der Anfragenpuffer wird im Hintergrund vorgehalten, sodass auch Einträge von vor dem Öffnen des Fensters erscheinen.
Das DataLayer-Fenster ist in zwei Spalten geteilt:
dataLayer.push(...)-Aufrufe in der Reihenfolge der Ereignisse.window.dataLayer als indizierter (0:, 1:, …) aufklappbarer JSON-Baum — du gehst in verschachtelte Daten hinein, analog zum Objekt-Inspektor in den DevTools. Der Snapshot aktualisiert sich nach jedem Push. In der Kopfzeile der rechten Spalte gibt es die Buttons alle aufklappen / alle zuklappen — sie wirken rekursiv auf den gesamten Baum.Klicks auf die eigene Oberfläche von JustZix (Aufklappen von Baumknoten, Fenster-Buttons) gelangen nicht in diesen Reiter. Würde die Seite click-Ereignisse erfassen (z. B. GTM-Auto-Event), würde ein Klick ins Fenster einen Push an dataLayer erzeugen und das Aufklappen des Baums zurücksetzen — die Erweiterung erkennt solche Pushes und meldet sie nicht (der echte window.dataLayer der Seite bleibt unberührt).
Die Output-Konsole stellt ein globales API zum Loggen aus deinem Code (JS-Pane, Aktionen, Seitencode) bereit:
JUSTZIX.log('normales Log');
JUSTZIX.warn('Warnung');
JUSTZIX.error(new Error('Fehler')); // zeigt den Stack-Trace
JUSTZIX.info({ obj: 1, arr: [2,3] });
JUSTZIX.debug('Details'); // standardmäßig ausgeblendet (Filter)
Verfügbare Aliasse:
window.JUSTZIX — primär, funktioniert immerwindow.__JUSTZIX__ — ein immer verfügbarer Aliaswindow.JZ — ein Alias nur, wenn die Seite kein eigenes window.JZ hat (manche Seiten, z. B. Google Ads, belegen diesen Namen)Nach dem Erscheinen der Output-Konsole siehst du im Log eine Begrüßungszeile, die mitteilt, welcher Alias auf dieser Seite verfügbar ist.
console.log/warn/error/info/debug(...) von der Seite — gelangen auch in die normale DevTools-Konsole (wir blockieren nicht)window.JUSTZIX.*(...) — dein dedizierter Kanal (geht nicht in die DevTools)throw new Error(...)) — rot angezeigt mit der FehlerstellePromise.reject(...) ohne .catchFehler von fetch/XHR-Anfragen gelangen nicht in den Reiter Errors (das sind keine JS-Ausnahmen) — du findest sie im Reiter Network beim Status 4xx/5xx. Wir erfassen weder CSP-Verstöße noch interne Chrome-Warnungen.
Strg+Umschalt+H öffnet ein verschiebbares Schnellhilfe-Fenster — eine Anleitung zur Nutzung von JustZix auf der Seite: globale Kürzel, Kürzel innerhalb der Fenster, die Output-Konsole, Maus-Bedienung der Fenster, der Leisten-Bearbeitungsmodus und das Protokollieren in die Output-Konsole. Es funktioniert auf jeder Seite. Du ziehst das Fenster an der Kopfzeile; Esc / Klick außerhalb / × / erneutes Strg+Umschalt+H schließt es.
Farben: Im Verwaltungs-Modal (Bearbeitungspanel) hat jedes Fenster einen Color Picker — der Punkt der Kopfzeile, Hintergrund und Text der Kopfzeile, Hintergrund und Text des Bodys, die Farbe der Aktionsbuttons.
Schrift und Größe: Rechtsklick auf die Kopfzeilenleiste des Fensters → ein Menü mit der Auswahl der Schrift (Consolas, Menlo, Monaco, Courier New und andere Monospace-Schriften) sowie der Größe (10–24 px).
Jedes Fenster ziehst du an der Kopfzeilenleiste. Beim Annähern eines Rands an ein anderes Fenster / eine Aktionsleiste / den schwebenden Button (≤ 12 px) erscheint eine magnetische Anziehung — die Fenster verbinden sich zu einer Gruppe. Das Ziehen einer verbundenen Gruppe bewegt alle Elemente gemeinsam. Die Positionen werden pro Browserfenster gemerkt.
Jedes Fenster hat 8 Resize-Griffe: 4 in den Ecken (Änderung von Breite und Höhe gleichzeitig) sowie 4 an den Kanten (Änderung nur einer Achse). Der gezogene Griff hält den gegenüberliegenden Rand an Ort und Stelle. Bereich: Breite 180–1200 px, Höhe 120–900 px. Die neue Größe (pane.size) wird gespeichert — für dauerhafte Fenster zwischen Geräten synchronisiert, für TEMP-Fenster pro Tab.
Das Scrollen mit dem Mausrad innerhalb eines Fensters scrollt nur den Inhalt dieses Fensters — die darunterliegende Seite scrollt nicht. Das gilt auch, wenn der Fensterbereich das Ende des Scrollens erreicht oder der Cursor über einem nicht scrollbaren Bereich steht (Kopfzeile, Filterleiste).
Jedes Fenster (sowohl temporäre TEMP als auch persistente) hat in der rechten Ecke der Kopfzeile einen × Schließen-Button. TEMP werden ausgeblendet (öffne sie erneut über das Seiten-Kontextmenü oder ein Kürzel), persistente — deaktiviert (per Checkbox im Popup wieder aktivieren). Doppelklick auf die Kopfleiste:
Wenn sich eine Fensterkante einem anderen JustZix-Fenster nähert (12 px-Schwelle), erscheint eine rote Kante an der Snap-Seite (an beiden Fenstern). Loslassen des Cursors in dieser Position führt den Snap aus — die Fenster bewegen sich danach als Gruppe. Alle Fenster der Erweiterung nehmen an diesem Mechanismus teil: Aktionsleisten, FAB, persistente Panes (CSS/JS/Console/Output), TEMP und der AI Helper.
Du kannst ein temporäres Fenster auf einer beliebigen Seite erstellen — sogar auf einer, für die du kein Verzeichnis hast. TEMP-Panes sind ein schnelles Ad-hoc-Werkzeug: du testest CSS/JS auf einer fremden Seite, ohne Regeln zu konfigurieren.
Eigenschaften von TEMP-Panes:
<style> sofort aktualisiert.Erstellen / Schließen (Umschalten):
Der AI Helper ist ein in die Erweiterung integrierter KI-Assistent, der dabei hilft, eine CSS/JS-Lösung für eine konkrete Aufgabe auf der aktuellen Seite vorzubereiten und umzusetzen. Das Modell kann die Seite untersuchen, Code live in TEMP-Fenstern testen und — nach deiner Zustimmung — ein fertiges Verzeichnis, eine Gruppe und einen Satz erstellen.
Im Einstellungsmenü der Sidebar öffnet der Eintrag „AI Helper" ein Konfigurations-Modal:
chrome.storage.local). Ein Schlüssel gelangt nur dann auf andere Geräte, wenn du bei ihm die Checkbox „synchronisieren" aktivierst — dann wird er über die JustZix-Cloud synchronisiert (denselben Kanal, über den die Erweiterung Verzeichnisse, Gruppen und Sätze synchronisiert). Schlüssel ohne Aktivierung verlassen das Gerät nie. Die API-Aufrufe laufen über den Service Worker der Erweiterung, sodass der Schlüssel nicht in den Kontext der Seite gelangt.
Das AI-Helper-Fenster ist ein schwebendes Fenster (pro Tab, wie die TEMP-Fenster — ziehbar, mit 8 Griffen skalierbar, mit Schließkreuz, eine Instanz). Du öffnest / schließt es:
Im Fenster: die Auswahl des Anbieters (wenn du mehr als einen Schlüssel hast) und des Modells (die Liste wird live abgerufen), der Gesprächsverlauf, ein Button zum Leeren des Gesprächs sowie ein Textfeld (senden per Button oder Ctrl+Enter). Das Modell erhält automatisch den Kontext der aktuellen Seite — URL, Titel und ein HTML-Fragment.
Der AI Helper führt das Gespräch nach einem festgelegten Workflow:
query_page (Selektoren, DOM-Struktur), bevor er Code schreibt.read_temp_pane und read_console prüft er, ob der getestete Code keine Fehler meldet, bevor er dir das Ergebnis zeigt.Das Modell verwendet Werkzeuge über ein einfaches Textprotokoll (der Block @@JZ_TOOL@@ … @@END@@), das für OpenAI, Anthropic und Gemini identisch funktioniert. Werkzeugaufrufe und ihre Ergebnisse erscheinen im Fenster als separate „Chips". Verfügbare Werkzeuge:
| Werkzeug | Wirkung |
|---|---|
query_page | Gibt die Anzahl der Selektor-Übereinstimmungen und HTML für bis zu 5 Elemente zurück |
list_structure | Gibt die vorhandenen Verzeichnisse / Gruppen / Sätze samt ihrer IDs zurück |
open_temp_pane | Öffnet ein temporäres TEMP-Fenster (CSS oder JS) |
set_temp_pane_code | Setzt Code in ein TEMP-Fenster ein — dient zum Live-Test |
read_temp_pane | Prüft das TEMP-Fenster — bei JS führt es den Code aus und meldet Fehler oder Erfolg |
read_console | Öffnet ein TEMP-Output-Console-Fenster und liefert die erfassten console-Einträge der Seite |
create_folder | Erstellt ein Verzeichnis + eine Standardgruppe (erfordert Bestätigung) |
create_group | Erstellt eine Gruppe in einem Verzeichnis (erfordert Bestätigung) |
create_rule | Erstellt einen Satz mit CSS/JS-Code (erfordert Bestätigung) |
create_bar | Erstellt eine Aktionsleiste für ein Verzeichnis/Gruppe/Satz (erfordert Bestätigung) |
create_action | Erstellt eine Aktion (button/select/input/slider/textarea/toggle3) auf einer Leiste (erfordert Bestätigung) |
request_user_input | Zeigt dem Nutzer ein Inline-Formular im Chat-Fenster (Text- / Zahl- / Farb- / Select- / Checkbox-Felder) und wartet auf die Antwort |
list_bars / list_actions / list_panes / list_all | Liefern Listen vorhandener Aktionsleisten / Aktionen / Fenster (CSS/JS/Console/Output) — optional nach Eltern gefiltert |
read_folder / read_group / read_rule / read_bar / read_action | Liefern die vollständigen Daten einer bestimmten Entität (vor einer geplanten Änderung) |
update_folder / update_group / update_rule / update_bar / update_action | Ändern eine bestehende Entität — erfordert Bestätigung (mit Feld-Diff) |
create_css_pane / create_js_pane / create_js_console / create_output_console | Erstellen ein persistentes Frontend-Fenster (erfordert Bestätigung) |
read_*_pane / read_*_console + update_*_pane / update_*_console | Lesen und Ändern der Metadaten persistenter Fenster (Name, Farbe, Position, Größe, Styling) |
read_pane_code / update_pane_code | Lesen und Einfügen von CSS/JS-Code in ein persistentes Fenster (pro Browser-Tab) — erfordert Bestätigung |
screenshot_page | Aufnahme der aktuellen Seitenansicht als Bild — die JustZix-Oberfläche wird automatisch ausgeblendet; für vision-fähige Modelle |
read_temp_pane + read_console), dich per Inline-Formular nach Daten fragen (request_user_input) und Screenshots der Seite (screenshot_page) als Bildanhänge an die nächste Anfrage senden.
Ein Rechtsklick auf die Kopfzeile des AI-Helper-Fensters öffnet ein Menü mit den Optionen „Nach vorne" / „Nach hinten" (Reihenfolge der JustZix-Fenster ändern, wenn sie sich überlappen), „Trennen von: X" (wenn der AI Helper mit einem anderen Fenster verbunden ist) und „Aussehen…". Im Panel „Aussehen…" kannst du vier Rollen im Chat separat stylen: deine Nachrichten, KI-Antworten, Tool-Ergebnisse, Inline-Formulare — jede mit eigener Schrift, Größe, Textfarbe und Hintergrund. Werte werden pro Gerät gespeichert.
Das AI-Helper-Fenster nimmt am gleichen Snap-Mechanismus teil wie Aktionsleisten, persistente Fenster (CSS / JS / Console / Output) und TEMP-Fenster. Ziehen einer Kante in die Nähe eines anderen JustZix-Fensters (12 px-Schwelle) → magnetisches Anziehen, eine rote Kante zeigt die Snap-Seite an beiden Fenstern. Verbundene Fenster bewegen sich als Gruppe.
Wenn sich Fenster überlappen, machen die Optionen „Nach vorne" / „Nach hinten" im Kontextmenü jedes Fensters (Rechtsklick auf die Kopfzeile) einen einmaligen Sprung — das Fenster geht über / unter alle überlappenden Nachbarn, kein wiederholtes Klicken nötig.
Das Werkzeug screenshot_page erfasst die aktuelle Seitenansicht und sendet sie dem Modell als Bild. Die gesamte JustZix-Oberfläche wird vor der Aufnahme automatisch ausgeblendet (FAB, Aktionsleisten, AI Helper, persistente Panes, TEMP). Ein Puffer der 3 letzten Screenshots, einmalig an die nächste Anfrage angehängt (nach dem Senden — aus dem Puffer entfernt, um Tokens zu sparen). Erfordert ein vision-fähiges Modell (z. B. gpt-4o, claude-3+/4, gemini-1.5+/2). Unter dem Tool-Result-Chip im Chat wird ein Miniaturbild angezeigt — Klick öffnet die Vollbildansicht.
| Kürzel | Aktion |
|---|---|
Ctrl+Alt+G | TEMP CSS-Pane erstellen / schließen |
Ctrl+Alt+H | TEMP JS-Pane erstellen / schließen |
Ctrl+Alt+J | TEMP JS-Konsole erstellen / schließen |
Ctrl+Alt+K | TEMP Output-Konsole erstellen / schließen |
Ctrl+Alt+I | Bearbeitungspanel öffnen (eigenes Fenster), erstes aktives Regelwerk auf dieser Seite, Tab CSS |
Ctrl+Alt+O | Wie oben, Tab JS |
Ctrl+Alt+P | Wie oben, Tab Aktionen |
Ctrl+Alt+\ | AI-Helper-Fenster öffnen / schließen |
Ctrl+Alt+S | Leisten-Bearbeitungsmodus — ein / aus |
Ctrl+Z | Letzte Änderung rückgängig machen (nur im Leisten-Bearbeitungsmodus) |
Delete | Ausgewählte Labels löschen (nur im Leisten-Bearbeitungsmodus) |
Esc | Alle Elemente abwählen (nur im Leisten-Bearbeitungsmodus) |
Ctrl+Shift+L | Den aktiven Reiter jeder Output-Konsole leeren |
Ctrl+Shift+H | Schnellhilfe — Kürzel und Fenster auf der Seite (global) |
| Kürzel | Aktion | Fenster |
|---|---|---|
Ctrl+Enter | Code ausführen / Nachricht senden | JS-Pane, JS-Konsole, AI Helper |
↑ / ↓ | Befehlshistorie | JS-Konsole (Eingabe) |
Ctrl+L | Ausgabe leeren | JS-Konsole |
Esc | Suchfeld leeren | Output-Konsole |
| Kürzel | Aktion |
|---|---|
Ctrl+Alt+F | Fokus auf das Suchfeld über dem Editor |
Ctrl+Alt+→ / Ctrl+Alt+← | Nächstes / vorheriges Suchergebnis |
Enter / Shift+Enter | Suchen / nächstes / vorheriges Ergebnis (im Suchfeld) |
Ctrl+Alt+I / O / P | Tab des aktiven Regelwerks umschalten auf CSS / JS / Aktionen (wenn die Regelkarte gerendert ist) |
Ctrl+Alt+G/H/J/K sind nebeneinanderliegende Tasten (Vim-Layout), alle in allen Browsern und Systemen frei. Ctrl+Alt+L wurde bewusst ausgelassen — unter Linux sperrt es den Bildschirm. Ctrl+Alt+S (Bearbeitungsmodus) und Ctrl+Alt+\ (AI Helper) gehören zur selben Modifikatorenfamilie. Die Output-Konsolen-Kürzel (Ctrl+Shift+...) kollidieren nicht, da sie sich im Modifikator unterscheiden.
Die Erweiterung bietet fünf Exportformate (vollständig, partiell, Verzeichnis, Gruppe, Satz) mit automatischer Erkennung des Dateityps beim Import, um ein versehentliches Überschreiben zu vermeiden.
Im Einstellungsmenü der Sidebar: Einstellungen exportieren. Das Modal öffnet zwei Modi:
Dateien des partiellen Exports heißen justzix-partial-DATUM.json (vs. justzix-backup-DATUM.json für den vollständigen) und enthalten das Flag partial: true sowie das Feld groups[].
In der Verzeichnisleiste: Export — öffnet ein Modal mit einem Baum aus Gruppen und Sätzen (analog zum partiellen Export, aber auf dieses Verzeichnis beschränkt). Exportiert werden nur die ausgewählten Sätze sowie die Gruppen, zu denen sie gehören — leere Gruppen gelangen nicht in die Datei.
Format justzix-folder — die Datei enthält das Feld groups[] mit der Hierarchie der Gruppen und Sätze des Verzeichnisses.
In der Gruppenleiste: Export — ein Modal mit der Liste der Sätze der Gruppe (Checkboxen). Datei: justzix-grupa-<name>-<datum>.json, Format justzix-group.
In der Satzansicht: Satz exportieren — lädt die Datei sofort herunter (ohne Modal). Format justzix-rule, Name: justzix-zestaw-<name>-<datum>.json.
justzix-full — ein vollständiges Backup von allemjustzix-full mit partial: true — ausgewählte Elemente aus dem Hauptexportjustzix-folder — ein einzelnes Verzeichnis mit Auswahlbaumjustzix-group — eine Gruppe + ausgewählte Sätzejustzix-rule — ein einzelner SatzNach dem Laden einer Datei / Einfügen von JSON erkennt die Erweiterung automatisch den Typ und zeigt ein farbiges Erkennungspanel:
| Farbe | Bedeutung | Aktion |
|---|---|---|
| Teal (Türkis) | Korrektes vollständiges Backup | Zeigt die Anzahl der Verzeichnisse/Sätze, das Exportdatum, eine Warnung vor dem Überschreiben |
| Violett | Partielles Backup (partial: true) | Auswahl des Modus: Zusammenführen mit den aktuellen oder Ersetzen von allem |
| Orange | Falscher Dateityp in diesem Modal | Eine Meldung, die zum richtigen Modal führt, der Importieren-Button ist gesperrt |
| Rot | JSON-Parsing-Fehler / ungültiges Format | Der Importieren-Button ist gesperrt |
1 / nadpisz — überschreibt vorhandene Verzeichnisse (löscht deren Gruppen und Sätze)2 / kopia (Standard) — importiere als Kopien mit neuen IDs, „(import)" im Verzeichnisnamen, kein Verlust vorhandener DatenIn der Verzeichnisleiste: Import. Prüft Konflikte nach ID und Name:
In der Gruppenleiste: Import — akzeptiert 3 Formate:
justzix-group — fügt alle Sätze der Gruppe aus der Datei einjustzix-folder — fügt alle Sätze aus allen Gruppen des Verzeichnisses einjustzix-rule — fügt einen Satz einAlle Sätze aus der Datei gelangen mit neuen IDs in die aktuelle Gruppe (die Operation ist immer vom Typ „Kopie hinzufügen" — keine Konflikte).
In der Satzansicht: Satz importieren — akzeptiert nur justzix-rule. Ein Prompt mit 3 Optionen:
1 / zastap — den Inhalt des aktuellen Satzes ersetzen (id und groupId bleiben erhalten)2 / kopia (Standard) — als neuen Satz neben dem aktuellen hinzufügen, in derselben Gruppe, mit dem Zusatz „(import)"Einstellungen → Cloud-Synchronisierung öffnet das Modal des Synchronisierungskontos. Die Erweiterung hält deine Bibliothek (Verzeichnisse, Gruppen, Sätze, Aktionen, Aktionsleisten, Fenster im Vordergrund) in der Cloud von justzix.com und hält sie geräteübergreifend konsistent. Die Synchronisierung funktioniert nur bei Anmeldung — ohne Konto arbeitet die Erweiterung ausschließlich lokal.
Bei der Anmeldung vergleicht die Erweiterung die lokalen Daten mit den Daten in der Cloud:
| Auswahl | Was sie bewirkt |
|---|---|
| Cloud-Daten verwenden | Leert die lokale Bibliothek und baut den Kontostand vom Server neu auf |
| Meine lokalen Daten senden | Die lokalen Daten werden kanonisch — sie löschen, was in der Cloud war |
| Zusammenführen | Kombiniert beide Sätze — fügt die fehlenden Entitäten hinzu und behält die vorhandenen |
Du kannst auch Abbrechen — die Erweiterung meldet sich dann ab und ändert nichts.
Nach dem ersten Abgleich läuft die Synchronisierung im Hintergrund: Die Erweiterung sendet Änderungen und ruft neue Entitäten etwa einmal pro Minute ab. Eine auf einem Gerät vorgenommene Änderung erscheint nach kurzer Zeit auf den anderen. Der Statuspunkt neben dem Eintrag „Cloud-Synchronisierung" zeigt an, ob das Konto verbunden ist.
Der Reiter Status des Synchronisierungs-Modals zeigt den Kontostatus und bietet Aktions-Buttons:
Zähler der Entitäten, die sich auf dem Konto befinden: Verzeichnisse, Gruppen, Sätze, Aktionen, Aktionsleisten, Fenster im Vordergrund. Gezählt werden ausschließlich erreichbare Entitäten im Baum (eine Gruppe muss ein vorhandenes Verzeichnis haben, ein Satz — eine Gruppe, eine Leiste/ein Fenster — einen vorhandenen Elternknoten) — konsistent mit den Zählern des Dashboards. Sie aktualisieren sich beim Öffnen des Panels und nach einer manuellen Synchronisierung.
Ein gerätelokales Protokoll der letzten Synchronisierungen. Auf der Seite sind die letzten 10 Einträge sichtbar; der Button „Vollständigen Verlauf anzeigen" öffnet ein Fenster mit der vollständigen Liste (bis zu 100 Einträge). Jeder Eintrag enthält:
Das Protokoll ist lokal — es wird nicht zwischen Geräten synchronisiert. Ein Eintrag entsteht nach jedem Synchronisierungs-Tick, der tatsächlich etwas geändert hat; ein manuelles „Jetzt synchronisieren" hinterlässt immer einen Eintrag, auch bei null Änderungen.
Die Nutzungsstatistik (CSS-Anwendungen, JS-Ausführungen, Fensteranzeigen) wird als separate gerätespezifische Entitäten synchronisiert — die Kachel im Dashboard summiert sie über alle gekoppelten Geräte. Theme und Sprache werden als gemeinsame Kontoeinstellung synchronisiert und beim nächsten Öffnen des Panels auf einem anderen Gerät angewendet.
Eine Alternative zum Versenden einer JSON-Datei per Messenger. Du erstellst einen öffentlichen Link mit einer Lebensdauer (1h / 6h / 12h / 24h / 48h) und gibst ihn dem Empfänger weiter. Das Backend justzix.com hält die Payload bis zum Ablauf in der Cloud, danach wird sie gelöscht.
Erfordert ein angemeldetes Synchronisierungskonto (Sync). Der Token selbst ist ein öffentliches Geheimnis — jeder mit dem Link kann herunterladen, versende ihn also nicht über öffentliche Kanäle, wenn der Inhalt sensibel ist.
JZS-XXXX-XXXX-XXXX-XXXX (16 Zeichen Crockford-Base32, ~80-Bit-Entropie). Akzeptiert wird auch die vollständige URL https://www.justzix.com/s/JZS-... — die Erweiterung parst und normalisiert sie (verwechselbare Buchstaben I/L→1, O→0, U→V).
Eine Überschreitung des Limits = ein Fehler mit einer Meldung. Widerrufe ungenutzte Links im Panel Meine Shares.
Der Button „URL teilen" an vier Einstiegspunkten, neben „Datei herunterladen":
justzix-full)justzix-folder)justzix-group)justzix-rule)Ein Klick öffnet ein Modal zur Linkgenerierung: Betreff + Zusammenfassung dessen, was du teilst, ein Radio mit TTL (Standard 24h), „Link generieren". Nach Erfolg wechselt das Modal zur Ergebnisansicht mit zwei kopierbaren Werten:
https://www.justzix.com/s/JZS-... — zum Senden an jemanden ohne Erweiterung (zeigt eine Landing-Seite)JZS-XXXX-XXXX-XXXX-XXXX — zum Einfügen in der Erweiterung des Empfängers unter „Aus URL importieren"Jeder hat seinen eigenen Button „Kopieren". Es wird auch die Ablaufzeit in der lokalen Zeitzone angezeigt.
Einstellungen → Meine Shares (ein separates Modal, kein Teil der Synchronisierung — das sind zwei verschiedene Funktionen). Es zeigt die Liste der aktiven Links: ein Zähler in der Kopfzeile X/20 aktiv · Y MB / 50 MB und für jeden Share eine Karte mit:
X Verzeichnisse · Y Gruppen · Z Sätze · N JS-Zeilen · A KBEin Widerruf nimmt bereits heruntergeladene Inhalte nicht zurück. Wenn jemand die Payload heruntergeladen hat, hat er sie lokal bei sich. Ein Share ist ein „best-effort time-limit", kein DRM.
Einstellungen → Aus URL importieren (zwischen „Einstellungen importieren" und „Cloud-Synchronisierung", Ketten-Symbol). Das Modal hat zwei Schritte:
Schritt 1 — Eingabe. Du fügst den Link oder nur den Token ein. Client-seitige Validierung: der Token wird aus der URL extrahiert, Crockford-Base32-normalisiert, 16 Zeichen + Format werden geprüft. Falsches Format → eine Meldung mit einem Hinweis auf das korrekte Format.
Schritt 2 — Vorschau. Die Erweiterung zeigt eine Zusammenfassung des Shares:
Wenn der Share JavaScript enthält (jsLines > 0), erscheint ein rotes Warnbanner mit dem Link „JavaScript-Code anzeigen". Er öffnet ein Overlay mit dem vollständigen JS-Code jeder Regel und Aktion — sieh ihn dir vor dem Import an, denn der Code wird auf passenden Seiten ausgeführt.
Schritt 3 — Import. Klick auf „Importieren" → das Backend gibt die vollständige Payload zurück → die Erweiterung erstellt neue Entitäten mit immer frischen IDs (überschreibt nie vorhandene nach ID):
| Typ | Was passiert |
|---|---|
justzix-rule | Erstellt ein neues Verzeichnis + Gruppe „Standard" + den importierten Satz |
justzix-group | Erstellt ein neues Verzeichnis + die importierte Gruppe + Sätze |
justzix-folder | Fügt es als neues Top-Level-Verzeichnis hinzu |
justzix-full | Merge: fügt alle folders/groups/rules mit frischen IDs hinzu |
Name des neuen Containers: <Name-des-Absenders oder "Import"> <Datum> — du kannst ihn danach beliebig umbenennen / verschieben.
| Fehler | Meldung |
|---|---|
| Ungültiger Token | „Der Token ist ungültig. Prüfe, ob du den ganzen Link kopiert hast." |
404 not_found | „Dieser Link ist abgelaufen oder wurde vom Absender widerrufen. Bitte um einen neuen." |
429 rate_limited | „Zu viele Versuche. Warte einen Moment und versuche es erneut." |
| 5xx / network | „Problem mit dem Server. Versuche es erneut." |
Das Backend unterscheidet 404 „hat nie existiert" nicht von 404 „abgelaufen / widerrufen" — bewusst, um nicht preiszugeben, ob ein Token jemals existiert hat.
Jede Aktion (aus dem Reiter „Aktionen" in der Satzkarte) kannst du programmatisch aus dem JS des Satzes oder dem Code einer anderen Aktion aufrufen. Der globale Namespace window.JZ wird automatisch vor jeder Ausführung von User-JS in der MAIN-World installiert.
| Aufruf | Was er tut |
|---|---|
JZ.click(labelOrId) | Klickt programmatisch. Semantik je nach Aktionstyp: BUTTON → el.click(). SELECT static (Button mit Dropdown) → el.click() (öffnet das Popup; der Benutzer wählt die Option manuell). SELECT js (natives <select>) → setzt value auf die erste nicht deaktivierte Option und dispatcht change. INPUT / TEXTAREA / SLIDER → el.click() — Achtung: ändert nicht den Wert und löst den change-Handler nicht aus. Um den Wert zu setzen: const el = JZ.action('LBL'); el.value = 'X'; el.dispatchEvent(new Event('change')). TOGGLE3 — el.click() trifft den Container; um einen bestimmten Zustand zu aktivieren, verwende el.querySelector('.jz-toggle3-state[data-jz-state-idx="1"]').click(). Gibt true/false zurück. |
JZ.value(labelOrId) | Einheitlicher Getter des aktuellen Wertes. INPUT / TEXTAREA → natives el.value. SLIDER → wrap.dataset.jzValue (wrap ist ein DIV, der Renderer setzt das Data-Attribut ab dem Anfangszustand + bei input/change). SELECT(js) → natives el.value. SELECT(static) → el.dataset.jzValue (der Renderer setzt es bei jeder Auswahl). TOGGLE3 → el.dataset.jzValue (state.value des aktiven; Fallback auf state.label). BUTTON → null. Element nicht gefunden → null. |
JZ.setValue(labelOrId, value) | Programmatischer Setter. INPUT/TEXTAREA → el.value = String(v) + dispatch input+change. SLIDER → setzt das native <input.jz-action-slider> + dispatch. SELECT(js) → el.value = String(v) + dispatch change. SELECT(static) + TOGGLE3 → sendet CustomEvent 'jz-set-value', der content.js-Listener führt den vollständigen Ablauf aus (Memory + UI + löst den Code aus). TOGGLE3-Lookup: nach state.value → Fallback auf state.label → Fallback auf den numerischen Index 0-2. BUTTON → false. Gibt true/false zurück. |
JZ.action(labelOrId) | Gibt das Aktionselement zurück (button / select / input / textarea / slider / toggle3-Container) oder null. Lookup: zuerst nach data-jz-action-id, dann case-insensitive nach data-jz-key (Label in GROSSBUCHSTABEN). Funktioniert für alle 6 Aktionstypen. |
JZ.actionById(id) | Lookup ausschließlich nach der stabilen action.id (z. B. 'a_mp1deeq3_uimd8l'). Empfohlen für Aktionen ohne Label oder wenn du Sicherheit möchtest. |
JZ.actions() | Ein Array aller sichtbaren Aktionselemente (button + select + input + textarea + slider + toggle3) auf der aktuellen Seite. |
JZ.labels() | Ein Array der ursprünglichen Labels (Groß-/Kleinschreibung beibehalten, wie du sie eingegeben hast). |
// === Lesen ===
const filter = JZ.value('FILT'); // INPUT/TEXTAREA — String
const opacity = JZ.value('OPAC'); // SLIDER — string-numerisch ("75")
const mode = JZ.value('MODE'); // SELECT static — String (option.value)
const theme = JZ.value('THM'); // TOGGLE3 — state.value des aktiven Zustands
// === Setzen ===
JZ.setValue('FILT', 'neuer Wert'); // INPUT/TEXTAREA — String + dispatch input+change
JZ.setValue('OPAC', 75); // SLIDER — clamp auf min/max, dispatch input+change
JZ.setValue('SRT', 'prod'); // SELECT(js) — natives select + dispatch change
JZ.setValue('MODE', 'staging'); // SELECT static — content.js führt den Ablauf aus (Memory + UI + Code)
JZ.setValue('THM', 'dark'); // TOGGLE3 — Lookup nach state.value (Fallback auf label, dann idx)
JZ.setValue('THM', 2); // TOGGLE3 — gleichwertig; ein numerischer idx funktioniert auch
| Aufruf | Was er tut |
|---|---|
JZ.bars() | Alle Container .jz-actions-bar (ActionBars), die auf der Seite sichtbar sind. |
JZ.barById(id) | Ein Leisten-Element nach data-jz-bar-id. |
JZ.floatingBtn() | Der schwebende Hauptbutton #justzix-floating-btn oder null (wenn ausgeblendet). |
JZ.click / JZ.action ist case-insensitive nach Label, aber exakt nach der stabilen action.id. Für Aktionen ohne Label (typischerweise INPUT) verwende JZ.actionById('a_...').
Im Feld „JS-Code" einer Aktion hast du automatisch verfügbare Variablen — die vom Background-Service-Worker vor der Ausführung als const eingeschleust werden:
| Variable | Was sie enthält | Wann verfügbar |
|---|---|---|
$el | Das DOM-Element dieser Aktion (input / select / button / textarea / toggle3-Container) | immer, wenn action.id existiert |
$action | { id, label, type, el } | immer |
value | Der aktuelle Wert je nach Typ: SELECT static → option.value; INPUT/TEXTAREA → der Feldinhalt; SLIDER → eine Zahl; TOGGLE3 → state.value des aktiven Zustands (Fallback auf state.label, wenn value leer ist). | SELECT static, INPUT, TEXTAREA, SLIDER, TOGGLE3. SELECT js: der Code wird EINMAL beim Rendern ausgeführt — value ist leer. |
stateIdx | Integer 0-2 — der Index des aktiven Zustands (von welchem Zustand der Klick ausging). | nur TOGGLE3 |
stateLabel | String — das Label des aktiven Zustands (max. 5 Zeichen). | nur TOGGLE3 |
Im Konfigurations-Modal einer Aktion vom Typ SELECT und INPUT zeigt das Panel „Stabile Aktions-ID" die vollständige action.id mit Kopier-Button sowie einen Beispiel-JS-Selektor (document.querySelector('[data-jz-action-id="..."]')). Unter der Liste der BUTTON-Aktionen siehst du Chips JZ.click('LBL') — ein Klick auf einen Chip kopiert das Snippet in die Zwischenablage.
visible: true, die Leiste ist im Baum sichtbar + die Seiten-URL passt zu den Regeln).JZ.click() gibt false zurück, JZ.action() gibt null zurück.JZ.click().// Code der Aktion "AUTO"
JZ.click('LOAD'); // Klick auf die Aktion LOAD (z. B. lädt Daten)
setTimeout(() => JZ.click('PROC'), 500); // 500ms später PROC (verarbeitet)
setTimeout(() => JZ.click('SAVE'), 1500); // 1500ms später SAVE (speichert)
Nachdem ein dynamisches Element erscheint, klicke die Aktion an, die es entfernt:
// JS-Code des Satzes — ein Observer für ein Modal, das dynamisch erscheint
const observer = new MutationObserver(() => {
if (document.querySelector('.cookie-banner')) {
JZ.click('CCK'); // klicke die Aktion an, die das Banner entfernt
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
// JZ.click auf ein INPUT ändert den Wert nicht — verwende das Muster mit dispatch 'change':
const el = JZ.action('SRCH'); // oder JZ.actionById('a_mp1deeq3_uimd8l')
if (el) {
el.value = 'neuer Filter';
el.dispatchEvent(new Event('change'));
}
Wenn du lieber direkt mit dem DOM arbeitest (z. B. einen Style änderst, nicht aufrufst):
// Lookup nach der stabilen ID (empfohlen — robust gegenüber einer Label-Änderung):
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');
// Lookup nach Label (case-insensitive — GROSSBUCHSTABEN in data-jz-key):
const btn = document.querySelector('[data-jz-key="MYBT"]');
btn.style.opacity = '0.5'; // abdunkeln
btn.dataset.busy = 'true'; // eigenes Attribut
Wo die Aktionselemente im DOM leben:
| Aktionstyp | Container | Element-Selektor |
|---|---|---|
| BUTTON | .jz-actions-bar[data-jz-bar-id="..."] | .jz-action-btn[data-jz-action-id="..."] |
| SELECT (static) | .jz-actions-bar | .jz-action-select[data-jz-action-variant="static"] (Button mit Popup; data-jz-value = der aktuell gewählte Wert) |
| SELECT (js) | .jz-actions-bar | .jz-action-select.jz-variant-js (natives <select>) |
| INPUT | .jz-actions-bar | .jz-action-input[data-jz-action-id="..."] |
| SLIDER | .jz-actions-bar | .jz-action-slider-wrap[data-jz-action-id="..."] (wrap); der Slider selbst: .jz-action-slider (natives <input type="range">) |
| TEXTAREA | .jz-actions-bar | .jz-action-textarea[data-jz-action-id="..."] |
| TOGGLE3 | .jz-actions-bar | .jz-action-toggle3[data-jz-action-id="..."] (Container; data-jz-value = state.value des aktiven); State-Buttons: .jz-toggle3-state[data-jz-state-idx="0|1|2"], der aktive hat die Klasse .active |
Alle Elemente haben das Attribut data-jz-action-id (eine eindeutige stabile Kennung). Der Selektor .jz-actions-bar ist sicher — er kollidiert nicht mit dem DOM der Seite.
data-jz-key) funktioniert für alle Aktionstypen. Jedes Aktionselement hat sowohl data-jz-label (ursprüngliche Groß-/Kleinschreibung) als auch data-jz-key (GROSSBUCHSTABEN). Verwende der Sicherheit halber (z. B. wenn sich das Label ändern kann) die stabile data-jz-action-id oder JZ.actionById().
Das Feld „Suchen" filtert den Verzeichnisbaum. Abgleichlogik:
Der Abgleich ist case-insensitive, die gelbe Hervorhebung zeigt die Übereinstimmungsstelle.
Nach einem Klick auf das Erweiterungssymbol in der Chrome-Toolbar erscheint das Popup-Widget mit einem großen grün/grauen Schalter „Plugin enabled". Im ausgeschalteten Modus wird auf keiner Seite CSS/JS eingeschleust, unabhängig von den Verzeichniseinstellungen. Der schwebende Button ist dann ausgeschaltet (Halt Red, Opacity 0.7). Der Zustand überlebt einen Neustart von Chrome.
Ein Button neben dem URL-Muster-Feld — fügt protocol://host/* aus dem aktiven Tab ein. Erstellt ein Verzeichnis in 2 Sekunden. Die Adresse der Optionsseite der Erweiterung wird übersprungen — es wird der frischeste externe Tab genommen.
Inline rechts neben dem URL-Feld erscheint die Information „Passt auf X offene Tabs" oder eine Warnung. Fängt Tippfehler sofort ab.
Ein Snapshot von CSS und JS wird 3 Sekunden nach der letzten Bearbeitung erstellt (Debounce). Limit von 5 Versionen — die älteste wird verdrängt. Beim Wiederherstellen einer Version wird der aktuelle Inhalt als neuester Snapshot zur Historie hinzugefügt, sodass du das Rückgängigmachen immer rückgängig machen kannst.
In der Kopfzeile der Satzkarte gibt es ein Feld für Tags — gib sie durch Kommas getrennt ein. Sie erscheinen als kleine Labels in der Sidebar neben dem Satznamen. Die Suche findet auch nach Tags.
Jedes Verzeichnis kann ein eigenes Label auf dem schwebenden Button haben (max. 3 Buchstaben, GROSSBUCHSTABEN) und eine Farbe (Color Picker). Label und Farbe helfen, visuell zu erkennen, welches Projekt auf einer Seite aktiv ist.
Jeder Aktionsbutton zählt, wie oft er angeklickt wurde. Hilft zu sehen, welche wirklich genutzt werden.
Unter dem CSS-Editor wird eine Leiste mit der Liste der Syntaxprobleme angezeigt:
/* ... */})} (mit Zeilennummer)Das ist eine einfache Syntaxvalidierung — sie prüft nicht die Korrektheit von Properties/Values. CSS mit einem Fehler wird trotzdem eingeschleust (der Browser überspringt fehlerhafte Regeln einfach).
Im Modal Import eines einzelnen Verzeichnisses erscheint nach dem Laden der Datei eine Liste der Sätze mit Metriken:
Dateiinhalt (3 Sätze):
Auto-login CSS: 0L • JS: 4L JS
Cookie-Banner ausblenden CSS: 8L • JS: 0L
Debug GTM CSS: 0L • JS: 12L • 2 Aktionen (8L) JS
Eine Warnung mit der Anzahl der JS-Zeilen, falls welche vorhanden sind. Ein Klick auf den JS-Button zeigt den vollständigen Code zur Durchsicht vor dem Import.
Jeder JS-Satz wird separat mit eigenem try/catch ausgeführt. Ein Fehler in einem Satz blockiert die Ausführung anderer nicht. Fehler werden in der Konsole mit dem Namen des Satzes/der Aktion und dem vollständigen Stack-Trace geloggt.
Eine Anzeige des Speicherverbrauchs im Einstellungsmenü der Sidebar (z. B. 1.2 MB / 10 MB). Rot oberhalb von 80%.
Eine Checkbox über der Liste — blendet die als unabhängig (○) markierten Sätze aus und zeigt nur die im Verzeichnis aktiven (●). Hilft, „manuelle" Sätze auszusortieren, wenn ein Verzeichnis viele davon hat. Reagiert sofort auf Änderungen der Schalter.
Die Erweiterung hat einen festen Schlüssel im Manifest (der Firefox-Build — eine feste gecko.id), was bedeutet, dass die Erweiterungs-ID zwischen Aktualisierungen unveränderlich ist — die Daten (Verzeichnisse, Sätze, Einstellungen) bleiben erhalten. JustZix wird für vier Browser ausgeliefert: Chrome, Edge, Opera und Firefox.
Im Menü Einstellungen (neben der Versionsnummer) erscheint ein grünes Banner „Eine neue Version ist verfügbar", wenn der Server ein neueres Paket als das installierte veröffentlicht. Das Banner enthält einen Download-Link. Die Prüfung erfolgt stillschweigend — ohne Netzwerk wird das Banner einfach nicht angezeigt.
chrome://extensions/ (Edge: edge://extensions/) die Erweiterung und klicke auf das Aktualisierungssymbol auf der KachelDer Firefox-Build wird über about:debugging → „Dieser Firefox" → „Temporäres Add-on laden" geladen (dabei auf die manifest.json im Ordner justzix_firefox/ zeigen). Eine Aktualisierung = erneutes Laden nach dem Überschreiben der Dateien.
"key" im Manifest (Chromium) / gecko.id (Firefox)/* Typische Werbung ausblenden */
.ad, .ads, .advertisement,
.banner-ad, [class*="ad-banner"],
[id*="google_ads"] {
display: none !important;
}
/* Cookie-Banner ausblenden */
.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);
}
Trick: die gesamte Seite invertieren und die Bilder erneut invertieren. Funktioniert auf den meisten Seiten erstaunlich gut.
/* Alle Elemente mit data-testid einfärben */
[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;
}
/* Lesbarkeit von Admin-Tabellen erhöhen */
table.admin-list td, table.admin-list th {
padding: 8px 12px !important;
font-size: 14px !important;
}
/* Sticky-Header der Tabelle */
table.admin-list thead {
position: sticky;
top: 0;
background: white;
z-index: 10;
}
/* Abwechselnde Zeilen */
table.admin-list tbody tr:nth-child(odd) {
background: #f9fafb;
}
/* Oft haben Seiten eine starre max-width 1200px - erzwinge die Breite */
.container, .main-content, main {
max-width: 95% !important;
width: 95% !important;
}
body::before {
content: "DEV-UMGEBUNG";
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; }
Hervorragend für das Muster https://dev.example.com/*, um Umgebungen nicht zu verwechseln.
// Nur für dev! Speichere niemals echte Passwörter
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';
});
// dataLayer.push abfangen (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);
};
}
// gtag abfangen
const origGtag = window.gtag;
if (origGtag) {
window.gtag = function(...args) {
console.log('%c[GA4]', 'color:#2563eb;font-weight:bold', args);
return origGtag.apply(window, args);
};
}
Ideal zum Debuggen der Analytics-Konfiguration in der Produktion, ohne den Code zu berühren.
// Alle 500ms für 10s prüfen und „Akzeptieren"-Buttons klicken
let attempts = 0;
const interval = setInterval(() => {
if (++attempts > 20) return clearInterval(interval);
const buttons = [...document.querySelectorAll('button, a')];
const target = buttons.find(b =>
/akzeptieren|zustimmen|accept all/i.test(b.textContent || '')
);
if (target) {
target.click();
clearInterval(interval);
}
}, 500);
document.addEventListener('keydown', (e) => {
// Ctrl+Shift+S - Formular speichern
if (e.ctrlKey && e.shiftKey && e.key === 'S') {
e.preventDefault();
document.querySelector('button[type="submit"]')?.click();
}
// Ctrl+Shift+E - zur Bearbeitung wechseln (ungetestetes Beispiel)
if (e.ctrlKey && e.shiftKey && e.key === 'E') {
e.preventDefault();
document.querySelector('a.edit-link')?.click();
}
});
// Lästige confirm und beforeunload für die Dauer der Tests überspringen
window.confirm = () => true;
window.alert = (msg) => console.log('[unterdrückter alert]', msg);
window.onbeforeunload = null;
window.addEventListener('beforeunload', e => {
e.stopImmediatePropagation();
}, true);
// Denk daran - reines CSS kann das nicht, wenn der Elternknoten display:none hat
window.addEventListener('load', () => {
const target = document.querySelector('.important-info');
const newParent = document.querySelector('.sidebar');
if (target && newParent) {
newParent.prepend(target);
}
});
// Alle versteckten input type="hidden" anzeigen
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);
});
Kürzel: CLR Farbe: rot
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 }));
});
Kürzel: FILL Farbe: grün
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 }));
}
});
Kürzel: CART Farbe: orange
// Für einen typischen Shop — den ersten „in den Warenkorb"-Button klicken
const btn = document.querySelector('.add-to-cart, [data-action="add-to-cart"]');
if (btn) btn.click();
else alert('Kein „in den Warenkorb"-Button gefunden');
Kürzel: COPY Farbe: violett
navigator.clipboard.writeText(location.href).then(() => {
console.log('Kopiert:', location.href);
});
Kürzel: TKN Farbe: gelb
// Extrahiert ein JWT-Token aus localStorage / Cookies zum Debuggen
const token = localStorage.getItem('authToken')
|| document.cookie.match(/token=([^;]+)/)?.[1];
if (token) {
navigator.clipboard.writeText(token);
alert('Token kopiert. Erste Zeichen: ' + token.slice(0, 20) + '...');
} else {
alert('Kein Token vorhanden');
}
Kürzel: SQL Farbe: blau
// Alle fetch abfangen und in der Konsole anzeigen
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('Fetch-Logging aktiviert. Jeder Aufruf erscheint in der Konsole.');
Kürzel: ENV Farbe: grau
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));
Jedes Projekt hat ein eigenes Verzeichnis mit eigenem URL-Muster. Du kannst Verzeichnisse haben:
https://dev.justzix.com/* mit rotem „DEV"-BannerIm rechten Panel lassen sich einzelne Verzeichnisse schnell ein-/ausschalten. Der Export eines einzelnen Verzeichnisses ermöglicht es, die Konfiguration mit dem Team zu teilen.
Füge auf jeder Dev/Staging-Umgebung ein Banner und Auto-Login hinzu. Ein CSS-Satz (Banner) und ein JS (Auto-Fill). Du erstellst ein separates Verzeichnis für jede Umgebung, es lässt sich mit einer einfachen Checkbox zusammenführen.
Ein Aktionspanel mit Buttons: FILL (Testdaten), CART (Testkauf), CLR (Formular leeren), STATE (App-Zustand in einem alert anzeigen). Ohne Entwickler, ohne Konsole, ein Klick.
Lieblingsblogs/-dokumentationen mit besserer Lesbarkeit — größerer Container, Schriftart, dunkler Modus. Jede Seite in einem separaten Verzeichnis, „Aktiv" dauerhaft eingeschaltet gelassen.
Ein Satz für jede Domain mit JS, das dataLayer.push und gtag abfängt. Du schaltest ihn ein, wenn ein Kunde ein Problem mit Analytics meldet, ohne den Seitencode zu berühren.
Das Muster *://*.justzix.com/admin/* und CSS, das Tabellen, Listen, Formulare verbessert. Plus eine Aktion „Testfilter", die automatisch Filter für einen typischen Workflow setzt.
Die Aktion RO (read-only) schleust CSS ein, das alle Buttons „Löschen", „Speichern", „Senden" ausblendet — ein temporärer „Nur-Lese-Modus", um sich nicht zu vertun.
// Gefährliche Buttons ausblenden
document.querySelectorAll(
'button[type="submit"], .delete-btn, .danger-btn, [class*="delete"]'
).forEach(b => b.style.display = 'none');
console.warn('READ-ONLY-MODUS aktiviert');
[JustZix] JS error geloggt!important oder spezifischere Selektoren.css-1abcd, die sich ändern. Verwende Attribute ([data-testid]) oder stabile SelektorenDie Erweiterung hat einen festen Schlüssel im Manifest — nachfolgende Updates bewahren die Daten. Wenn die Daten trotzdem verschwunden sind:
chrome://extensions/ den Aktualisierungs-Button, lösche nicht und installiere nicht erneutDas ist normal — die Positionen sind pro Browserfenster und werden im Sitzungsspeicher abgelegt (chrome.storage.session). Nach dem Schließen des Fensters verschwinden die Positionen, in einem neuen Fenster startest du von den Standardwerten. Die Position überlebt die Navigation zwischen Tabs im selben Fenster.
Ja — der partielle Export enthält nur die ausgewählten Verzeichnisse und Sätze plus die zugehörigen Sichtbarkeitseinstellungen. Er enthält nicht die Positionen der schwebenden Panels (sie sind pro Fenster) oder andere globale Präferenzen. Für ein vollständiges Backup verwende den Modus „Alles".
Der Modus „Zusammenführen" gleicht Verzeichnisse nach ID ab. Wenn die importierte Datei eine ID hatte, die mit einem vorhandenen Verzeichnis kollidiert (z. B. dieselbe Datei wurde bereits einmal importiert), erscheint ein Prompt: 1 überschreiben / 2 Kopie (Standard, sicher) / Abbrechen. Mit der Wahl von 2 erhältst du Kopien mit neuen IDs und dem Zusatz „(import)" im Verzeichnisnamen — du verlierst nichts.
Der Aufklapppfeil erscheint nur, wenn ein Verzeichnis Sätze hat. Ein leeres Verzeichnis hat einen ausgegrauten Punkt statt eines Pfeils. Der Aufklappzustand jedes Verzeichnisses wird in chrome.storage.local gemerkt.
Diese Buttons befinden sich in der Verzeichnisleiste (oben im Bearbeitungsbereich), neben dem Button „Verzeichnis löschen". Nicht zu verwechseln mit den Buttons im Einstellungsmenü, die die gesamten Einstellungen betreffen.
Das JS von Regeln und Aktionen läuft im Seitenkontext über eine geschichtete Strategie, die gegen strikte Content-Security-Policy-Regeln resistent ist. Die meisten Seiten — auch große Dienste wie Facebook — funktionieren sofort, ohne Konfiguration.
Seiten mit sehr strikter CSP (manche Banken, Unternehmensseiten) können die Ausführung blockieren. Damit JS auf jeder Seite läuft, aktiviere für JustZix die Option „Benutzerskripte zulassen": öffne chrome://extensions, gehe zu den JustZix-Details und schalte den Schalter ein (ältere Browser benötigen zusätzlich den Entwicklermodus). Wenn eine Seite die Ausführung blockiert, zeigt das JavaScript-Fenster / die JS-Konsole eine entsprechende Meldung.
JustZix — Anleitung