JustZix — instrukcja obsługi

Wstrzykiwanie własnych stylów CSS, kodu JavaScript i przycisków akcji na dowolne strony

Spis treści

Koncepcja i główne pojęcia

JustZix pozwala automatycznie wstrzykiwać własny CSS i JavaScript na wybrane strony, a także definiować przyciski akcji (skróty wykonujące fragmenty kodu na żądanie).

Hierarchia danych

Katalog
Najwyższy poziom — grupa zestawów dla jednego wzorca URL. Np. katalog "justzix.com" z wzorcem https://justzix.com/*. Można włączać/wyłączać cały katalog jednym kliknięciem.
Grupa
Pośredni poziom między katalogiem a zestawami — pomaga organizować większe projekty (np. "Admin", "Frontend", "QA"). Każdy katalog ma minimum jedną grupę. Grupa ma własny przełącznik z kaskadą do aktywnych zestawów.
Zestaw
Pojedyncza modyfikacja: kawałek CSS, kawałek JS, plus lista przycisków akcji i opcjonalnie własne wzorce URL ograniczające go do konkretnych podstron. Każdy zestaw należy do jednej grupy.
CSS
Style aplikowane na bieżąco — zmiany widać natychmiast po zapisaniu, bez przeładowania strony.
JavaScript
Kod wykonywany raz przy każdym załadowaniu strony pasującej do wzorca. Wymaga przeładowania strony, by się ponownie odpalił.
Przyciski akcji
Wykonują JavaScript dopiero po kliknięciu, w pływającym pasku. Świetne do narzędzi diagnostycznych i częstych operacji.

Wzorce URL na poziomie zestawu i grupy

Każdy zestaw oraz każda grupa może dostać własną listę dodatkowych wzorców URL (chip-input). Gdy lista jest pusta — element działa wszędzie tam, gdzie pasuje wzorzec katalogu. Gdy ustawisz np. https://justzix.com/admin/* — element zadziała tylko na podstronach admina.

Wzorzec kataloguWzorce zestawuZadziała na
https://justzix.com/*(puste)cała domena justzix.com
https://justzix.com/*https://justzix.com/admin/*tylko sekcja /admin/
https://justzix.com/*https://justzix.com/produkty/*
https://justzix.com/koszyk
tylko podstrony produktów + koszyk
*://localhost:*/**://localhost:3000/*tylko port 3000 (dev)
Per-rule URL patterns to filtr dodatkowy — nie zastępują wzorca katalogu. Reguła aktywuje się tylko gdy URL pasuje do obu: wzorca katalogu i co najmniej jednego z wzorców zestawu (jeśli są).

Samouczek — interaktywne wprowadzenie

Dla nowych użytkowników JustZix ma wbudowany interaktywny samouczek, który prowadzi krok po kroku przez zbudowanie kompletnego rozwiązania — od katalogu, przez grupę i zestaw, po kod CSS/JS i przycisk akcji. Podpowiedzi pojawiają się jako dymki przy kolejnych elementach panelu.

Jak go uruchomić:

W oknie „Centrum samouczków" wybierasz samouczek i klikasz Rozpocznij. Podczas samouczka:

Interfejs i nawigacja

Tryb edycji

Dostęp przez prawy klik na ikonę wtyczki → "Opcje", lub klik na ikonę → przycisk "Panel edycji".

Pływający przycisk (na stronach pasujących)

Mały okrągły przycisk pojawia się automatycznie na stronach pasujących do dowolnego katalogu. Domyślnie wyświetla napis ZIX, ale każdy katalog może mieć własną etykietę.

Etykieta katalogu: w pasku katalogu, skrajnie po lewej (obok color pickera) jest pole tekstowe na etykietę przycisku. Wymuszone limity: max 3 znaki, zawsze UPPERCASE (zamiana na duże litery dzieje się od razu w trakcie pisania). Pole akceptuje litery i cyfry — przykłady: ZIX, QA, DEV, ADM, X. Przy wielu pasujących katalogach brana jest etykieta z pierwszego, który ją ma ustawioną; pozostałe są pomijane (puste pole = fallback do ZIX).

Stan kolorem (paleta brand):

Kolor katalogu: jeśli przy katalogu ustawisz color picker, pływający przycisk na pasujących stronach przyjmie ten kolor. Stany "mixed" i "off" automatycznie modulują saturację. Przy wielu pasujących katalogach brany jest kolor pierwszego z ustawionym kolorem.

Pulpit

Po wejściu w panel edycji wtyczka otwiera Pulpit — stronę główną z podsumowaniem biblioteki i szybkimi skrótami. Wcześniej panel automatycznie zaznaczał pierwszy katalog z listy; teraz zamiast tego widzisz przegląd.

Pulpit jest dostępny przez klik na logo w sidebarze oraz przez ikonę „dom" na pasku breadcrumb każdego edytora (katalogu, grupy, zestawu). Sam nagłówek Pulpitu ma również ikonę „dom" — jej kliknięcie odświeża dane (przeładowuje bibliotekę ze storage i renderuje Pulpit od nowa).

Pulpit ma układ w stałych rzędach kart:

Karty „Ostatnie przykłady" i „Z bloga" pobierają treść ze strony projektu; gdy endpoint jest niedostępny (np. offline), obie karty są ukrywane. Wersja wtyczki jest sprawdzana na świeżo przy każdym wejściu na pulpit.

Lewy panel w trybie edycji wyświetla katalogi w hierarchii — można rozwinąć każdy katalog by zobaczyć jego zestawy i przejść do edycji konkretnego.

Nawigacja

ElementDziałanie
Strzałka rozwijaniaRozwija/zwija listę zestawów lub grup (zapamiętane między sesjami)
Klik na nazwę katalogu (zwiniętego)Zaznacza katalog, otwiera Folder editor i rozwija jego grupy/zestawy
Klik na zaznaczony już katalogToggle: zwija (kolejny klik znów rozwija) — analogicznie dla grupy
Klik na nazwę grupy (zwiniętej)Zaznacza grupę, otwiera Group editor i rozwija jej zestawy
Klik na nazwę zestawuOtwiera widok pojedynczego zestawu (Rule editor)
Checkbox przy kataloguWłącza/wyłącza cały katalog (kaskada do grup i ich aktywnych zestawów)
Checkbox przy grupieWłącza/wyłącza grupę (kaskada do jej aktywnych zestawów)
Checkbox przy zestawieNiezależnie steruje pojedynczym zestawem
Status ●/○ obok katalogu/grupy/zestawuAktywny: ● aktywny, ○ nieaktywny (wymuszono wyłączony)
C J A U obok zestawuEtykiety zawartości: C = ma CSS, J = ma JavaScript, A = ma akcje, U = ma własne wzorce URL. Pojawiają się tylko gdy dane pole jest niepuste.
Pasek koloru po lewejKolor katalogu rysowany przez box-shadow inset — nie szarpie pozycji nazwy folderu (foldery z kolorem i bez koloru są zrównane)
Uchwyt drag&dropZłap myszą i przeciągnij aby zmienić kolejność
Domyślny stan po świeżej instalacji: wszystkie katalogi i grupy są zwinięte. Pierwszy klik rozwija, kolejny klik na tym samym elemencie zwija. Stan rozwinięcia jest zapamiętywany między sesjami (storage expandedFolders, expandedGroups).

Zmiana kolejności (drag & drop)

Najedź na katalog, grupę lub zestaw — po lewej stronie pojawi się uchwyt drag&drop. Złap myszą i przeciągnij:

Katalogi

Grupy

Zestawy

Drag & drop respektuje selekcję — jeśli przeciągniesz aktualnie wybrany zestaw między katalogami, selekcja podąża za nim, a docelowy katalog automatycznie się rozwija.
Gdy widzisz pojedynczy zestaw, na górze edytora pojawia się pasek z linkiem "Pokaż wszystkie w katalogu" by szybko wrócić do widoku całego katalogu.

Toggle sidebara

Pionowy pasek między sidebarem a edytorem chowa lewy panel — przydatne gdy potrzebujesz więcej miejsca na edytor. Stan jest zapamiętywany między sesjami. Po pokazaniu/ukryciu CodeMirror automatycznie aktualizuje swoją szerokość.

Resize edytorów

Pod każdym edytorem (CSS, JS, kod akcji) jest poziomy pasek z uchwytem do przeciągania w pionie. Łap myszą i pociągnij w dół by powiększyć edytor. Min. wysokość 80px, max nieograniczona — strona scrolluje się naturalnie wraz z zawartością.

Nad każdym edytorem kodu CodeMirror — CSS i JavaScript w karcie zestawu oraz „Kod JS" w edytorze akcji — znajduje się pasek wyszukiwania: pole tekstowe i przycisk z ikoną lupy.

Skróty

SkrótAkcja
EnterWyszukaj (nowe zapytanie) lub przejdź do następnego wyniku (gdy zapytanie bez zmian)
Shift+EnterPoprzedni wynik
Ctrl+Alt+→ / Ctrl+Alt+←Następny / poprzedni wynik — działa z poziomu edytora i z pola wyszukiwania
Ctrl+Alt+FZ edytora kodu przenosi fokus do pola wyszukiwania
EscCzyści pole wyszukiwania

Wzorce URL

Wzorzec URL definiuje, na których stronach katalog się aktywuje.

WzorzecPasuje do
https://justzix.com/adminTylko ten dokładny URL
https://justzix.com/*Wszystkie strony na justzix.com
https://*.justzix.com/*Wszystkie subdomeny i strony
*://localhost:*/*Wszystkie aplikacje lokalne
https://example.com/admin/*Tylko sekcja /admin/ i podstrony
*example*Dowolny URL zawierający "example"
Wskazówka: dopasowanie ignoruje query string (?id=123) i hash (#section), chyba że umieścisz je we wzorcu.

Stany zestawów (Aktywny / Włączony)

Każdy zestaw ma dwie niezależne flagi:

FlagaZnaczenie
AktywnyCzy ten zestaw jest sterowany przełącznikiem katalogu oraz grupy (oba poziomy kaskadują do active rules). Włączenie katalogu lub grupy włącza wszystkie aktywne zestawy w środku.
WłączonyAktualny stan: czy zestaw jest teraz wstrzyknięty na strony.

Kaskada przełączników

Toggle katalogu  →  zmienia enabled wszystkich active rules w jego grupach
Toggle grupy     →  zmienia enabled wszystkich active rules tej grupy
Toggle zestawu   →  zmienia tylko enabled tego zestawu

Reguły z Aktywny: NIE (badge ○) są pomijane przy kaskadach — sterujesz nimi tylko ręcznie, niezależnie od stanu folderu i grupy.

Praktyczne przykłady

Zestaw zawsze ręczny

Aktywny: NIE • Włączony: kontrolowane ręcznie

Zestaw nie reaguje na włączanie całego katalogu. Sterujesz nim tylko ręcznie. Idealne do eksperymentalnych modyfikacji, których nie chcesz włączać hurtowo.

Zestaw zawsze włączony z katalogiem

Aktywny: TAK • Włączony: TAK

Standardowe ustawienie. Włączanie/wyłączanie katalogu steruje też tym zestawem.

Zestaw tymczasowo wyłączony

Aktywny: TAK • Włączony: NIE

Zestaw jest "podłączony" pod katalog, ale chwilowo wyłączony. Następne kliknięcie głównego włącznika katalogu znów go aktywuje.

Pływający przycisk i panel

AkcjaEfekt
Lewy klikToggle wszystkich pasujących katalogów (włącz/wyłącz)
Prawy klikOtwiera panel z listą katalogów i zestawów
PrzeciągnięciePrzesunięcie pozycji (zapamiętywane per okno)

W rozwijanym panelu (prawy klik) możesz:

Panel pokazuje tylko aktywne zestawy (●) — niezależne (○) są ukrywane dla zwięzłości. Gdy folder ma tylko jedną grupę o nazwie "Domyślna", nagłówek grupy jest pomijany — widać same zestawy.

Ukrywanie pływającego przycisku dla strony: w widgecie popupu rozszerzenia — kliknij ikonę JustZix obok adresu i naciśnij ikonkę „eye-off" przy nazwie katalogu. Przywrócenie linkiem „Przywróć pływający przycisk" tamże.

Klik ikony JustZix w pasku rozszerzeń Chrome otwiera widget popupu — kompaktowy panel sterowania dla bieżącej karty. Od góry:

Paski akcji (ActionBars)

W jednym workspace możesz mieć wiele pasków akcji — każdy z własną nazwą, orientacją, kolorem tła, własnym zestawem przycisków i niezależną pozycją per okno przeglądarki. Pasek może być przypisany do folderu, grupy lub pojedynczego zestawu (decyduje widoczność i kaskadę).

Tworzenie i edycja paska

W edytorze katalogu, grupy lub zestawu znajduje się przycisk „Paski akcji (N)". Klik otwiera modal zarządzania paskami. W modalu:

Widoczność dziedziczona w dół

Przypisanie akcji do paska

Każda akcja w zakładce „Akcje" karty zestawu ma dropdown „Pasek akcji" — wybierasz docelowy pasek z listy widocznych dla tego zestawu (paski własne zestawu + paski grupy + paski folderu).

Sklejanie pasków (snap & connect)

Podczas przeciągania paska wtyczka wykrywa krawędzie sąsiednich pasków i pływającego przycisku w odległości ≤ 12 px. Pojawia się sticky visual indicator, a po puszczeniu paski łączą się w grupę połączeń. Następnie:

Prawy klik na drag handle paska → menu kontekstowe:

W trybie edycji paska to menu jest wyciszone; prawy klawisz na labelce daje wtedy opcję „Usuń etykietę".

Pokaż/ukryj paski — z 3 miejsc

Do trwałego włączania/wyłączania pasków akcji (bez F5) wtyczka oferuje trzy punkty wejścia, wszystkie mapowane na to samo actionBar.enabled w storage — zmiana z jednego miejsca propaguje do panelu edycji i pozostałych UIs:

  1. Floating panel (prawy klik na głównym pływającym przycisku JustZix) — sekcja „Paski akcji" pod listą folderów/grup/zestawów. Checkbox per pasek pokazuje persistent state. Klik → toggle actionBar.enabled.
  2. Widget popupu (klik ikony rozszerzenia obok adresu) — sekcja „Paski akcji" pod listą folderów. Plus per folder mała ikona „eye-off" — schowuje pływający przycisk dla bieżącej strony (przywrócenie linkiem „Przywróć pływający przycisk").
  3. chrome.contextMenus (prawy klik na stronie → JustZix → Paski akcji) — dynamiczne submenu z checkbox per pasek. Lista przebudowywana per aktywna karta i na każdą zmianę state.
Persistent vs runtime hide:
Pozycje wszystkich pasków (i pływającego przycisku) są zapisywane per okno przeglądarki w pamięci sesji. Każde okno ma swoje pozycje, niezależnie od innych. Resetują się przy zamknięciu okna lub restarcie Chrome.

Tryb edycji paska — swobodny układ

Tryb edycji paska akcji włącza się na trzy sposoby: skrótem Ctrl+Alt+S (działa z dowolnego miejsca strony), przełącznikiem w widgecie popupu wtyczki, oraz z menu kontekstowego Chrome (prawy klawisz → „Tryb edycji paska akcji"). U góry ekranu pojawia się pasek informacyjny; ponowne użycie dowolnego z przełączników wychodzi z trybu.

W trybie edycji normalne działanie elementów jest wstrzymane (klik nie odpala kodu, pola nie przyjmują fokusa) — zamiast tego elementy można rozmieszczać i skalować:

Tryb edycji jest „twardy": przesuwanie i resize dosuwają do siatki 8 px, elementu nie da się wyciągnąć poza pasek ani położyć na innym — przy kolizji oba elementy (przesuwany i ten pod nim) dostają czerwoną ramkę, a po puszczeniu element wraca na poprzednie miejsce. Paska nie da się zmniejszyć tak, by element znalazł się na zewnątrz; gdy nowy element lub labelka nie mieści się w pasku, płótno paska automatycznie się powiększa. Prawy klawisz myszy na pasku w trybie edycji nie pokazuje menu „ukryj/rozłącz pasek".

Tryby układu paska: pasek startuje w trybie flow (klasyczny flexbox — elementy jeden za drugim, pionowo lub poziomo). Pierwsze przesunięcie lub przeskalowanie elementu konwertuje pasek na tryb custom (płótno z pozycjonowaniem swobodnym) — wizualnie bez zmian, bo bieżący układ jest snapshotowany jako punkt startowy.

Pozycje i rozmiary w trybie custom (bar.layoutMode, bar.size, action.layout, action.size) są zapisywane na stałe i synchronizowane między urządzeniami — w odróżnieniu od pozycji „pływania" paska na stronie, która pozostaje per okno przeglądarki.

Typy akcji: BUTTON / SELECT / INPUT / SLIDER / TEXTAREA / TOGGLE3

Każda akcja ma typ — wybierany dropdownem na początku każdej akcji w karcie zestawu. Dostępnych jest 6 typów:

TypUIKiedy odpala kod
BUTTONKlikany przycisk z labelem max 6 znakówklik użytkownika
SELECT staticCustom dropdown w stylu paska — opcje konfigurowane w modaluwybór opcji (value = option.value)
SELECT jsNatywny <select> — Twój kod populuje opcje i podpina handlerRAZ przy renderze ($el = <select>)
INPUTPole tekstowe z placeholderem (single line)change (Enter lub blur)
SLIDERSuwak <input type="range"> z label + value displaychange (puszczenie myszy / Enter), value = liczba
TEXTAREAPole wielowierszowe — Enter to legit newline (NIE odpala kodu)change (blur — wyjście z pola)
TOGGLE33-stanowy segmented control (radio-like) — 3 mini-buttony, jeden aktywnyklik na nieaktywny stan, value = state.value aktywnego, plus stateIdx i stateLabel w scope

Statyczne etykiety tekstowe nie są typem akcji — dodaje się je bezpośrednio na pasku w trybie edycji (zobacz „Tryb edycji paska" → labelki).

Pola wspólne

SELECT — modal opcji

Klik „Opcje (N)" w karcie akcji typu SELECT otwiera modal:

INPUT — modal konfiguracji

SLIDER — modal konfiguracji

TEXTAREA — modal konfiguracji

TOGGLE3 — modal konfiguracji

Persistent memory (SELECT, INPUT, SLIDER, TEXTAREA, TOGGLE3)

Wybór / wartość / pozycja suwaka / treść textarea / aktywny stan toggle3 są automatycznie zapamiętywane per akcja. Po F5 wartość wraca; po zamknięciu karty i otwarciu jej ponownie (na stronie pasującej do reguły) też. Singleton per action.id — jedna wartość niezależna od konkretnego URL.

Format wartości w memory per typ:

Storage:

Brak syncu cross-device: memory zostaje lokalnie. Dwa komputery mogą mieć różne wartości (np. inny filtr per użytkownika).

Security: sessionStorage jest readable przez skrypty strony (same origin). Dla wrażliwych danych nie używaj INPUT — zamiast tego pisz wartość bezpośrednio w polu „Kod JS" zestawu.

Stabilne ID akcji

Każda akcja ma niezmienne action.id (format a_<base36>_<random>). W karcie zestawu obok każdej akcji jest badge z numerem rzędu — klik kopiuje pełny ID do schowka, tooltip pokazuje pełen ID.

W user-JS odwołuj się przez data-jz-action-id:

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

Lub przez window.JZ helpers — patrz Programatyczne wywoływanie akcji z JS.

Prawy klik na dowolnej stronie → JustZix:

Submenu okien przebudowują się na: tabs.onActivated, tabs.onUpdated (URL change), i storage.onChanged dla folders/groups/rules/actionBars/cssPanes/jsPanes/jsConsoles/outputConsoles/floatingHidden. TEMP submenu jest statyczne (zawsze 4 pozycje).

Okna na froncie (CSS / JS / Konsole)

Wtyczka oferuje cztery typy pływających okien wstrzykiwanych na strony, obok pasków akcji. Każde okno jest przypisane do folderu, grupy lub zestawu (dziedziczy widoczność kaskadowo, tak jak paski akcji) i pojawia się na stronach pasujących URL-em.

Zarządzanie: w edytorze folderu / grupy / zestawu znajdziesz przycisk „Okna ▾ (N)". Klik rozwija menu z 4 typami — wybierasz typ, otwiera się modal z listą okien tego poziomu (plus okna dziedziczone z poziomów wyżej). Dodajesz, nazywasz, kolorujesz, usuwasz.

TypKolorDo czego
CSS panezielonyTextarea CSS wstrzykiwana na żywo jako <style>
JS paneamberTextarea JS wykonywana na zmianę kodu
JS ConsolefioletowyREPL — wpisujesz kod, Ctrl+Enter wykonuje, output pod spodem
Output ConsoleszmaragdowyTylko-do-odczytu podgląd logów ze strony (console.* + błędy)

CSS pane

Pływające okno z polem tekstowym na CSS. Każda zmiana (po krótkiej pauzie) aktualizuje wstrzyknięty <style> — widzisz efekt na żywo. Treść jest zapamiętana per karta przeglądarki (przeżywa F5, znika z zamknięciem karty). Idealne do szybkiego testowania CSS bez zapisywania w regule.

JS pane

Pole tekstowe na JavaScript wykonywany w kontekście strony. Kod uruchamia się po zmianie (z opóźnieniem) albo ręcznie przyciskiem ▶ Run / skrótem Ctrl+Enter. Błędy wykonania pokazują się w czerwonym pasku pod kodem. Gdy kod jest zmieniony od ostatniego uruchomienia, przycisk Run świeci na żółto (stan „dirty").

JS Console (REPL)

Pełnoprawna konsola w stronie. Wpisujesz kod w dolne pole, Ctrl+Enter (lub ▶) wykonuje, wynik dopisuje się do obszaru logów powyżej. Funkcje:

Input, output i historia są zapamiętane per karta. Konsola wykonuje kod w MAIN world strony — masz dostęp do wszystkich zmiennych i funkcji strony.

Output Console

Tylko-do-odczytu podgląd logów — automatycznie przechwytuje wszystko, co dzieje się na stronie: console.log/warn/error/info/debug, niezłapane wyjątki, nieobsłużone Promise rejections, ruch sieciowy oraz pushe do dataLayer, a także Twój własny logger window.JUSTZIX.*. W odróżnieniu od JS Console (gdzie sam wpisujesz kod) — tu logi płyną same.

Sześć zakładek z licznikami

Okno jest podzielone na 6 zakładek, każda z licznikiem wpisów (badge):

ZakładkaZawartość
AllWszystkie wpisy ze wszystkich źródeł, chronologicznie
JZconsoleTylko Twój logger window.JUSTZIX.*
ConsoleTylko standardowe console.log/info/warn/error/debug ze strony
NetworkŻądania sieciowe strony (przez chrome.webRequest)
ErrorsNiezłapane wyjątki i Promise rejections — z rozwijanymi szczegółami
DataLayerPushe do window.dataLayer (GTM) + żywy podgląd obiektu

Pasek filtrów kontekstowych

Między zakładkami a polem wyszukiwania jest pasek filtrów, który zmienia się zależnie od wybranej zakładki:

Wyszukiwarka

Pod paskiem filtrów jest stale widoczne pole wyszukiwania. Filtruje wpisy aktywnej zakładki na żywo (dopasowanie fragmentu, bez rozróżniania wielkości liter). Esc czyści pole.

Logi konsoli — zwijane jak w DevTools

Wpisy console.* są domyślnie zwinięte — pokazują skrócony podgląd (np. [PickupMap][2026-05-16T15:25Z] AUTO_SELECTION_SKIPPED: {reason: 'Lower priority source', …}). Klik rozwija pełne argumenty (obiekty/tablice jako rozwijane drzewo JSON), analogicznie do konsoli DevTools.

Zakładka Network

Network przechwytuje żądania przez chrome.webRequest (uprawnienie webRequest w manifeście). Każdy wpis pokazuje m.in. metodę, URL, status, typ zasobu, rozmiar, czas trwania, adres zdalny (Remote address) i inicjatora (Initiator). Bufor żądań jest utrzymywany w tle, więc wpisy sprzed otwarcia okna również się pojawią.

Zakładka DataLayer

Okno DataLayer jest podzielone na dwie kolumny:

Kliknięcia we własnym UI JustZix (rozwijanie węzłów drzewa, przyciski okna) nie trafiają do tej zakładki. Gdyby strona zbierała zdarzenia click (np. GTM auto-event), klik w okno generowałby push do dataLayer i resetował rozwinięcie drzewa — wtyczka rozpoznaje takie pushe i ich nie raportuje (realny window.dataLayer strony pozostaje nietknięty).

Własny logger — window.JUSTZIX

Output Console udostępnia globalne API do logowania z Twojego kodu (JS pane, akcje, kod strony):

JUSTZIX.log('zwykły log');
JUSTZIX.warn('ostrzeżenie');
JUSTZIX.error(new Error('błąd'));   // pokaże stack trace
JUSTZIX.info({ obj: 1, arr: [2,3] });
JUSTZIX.debug('szczegóły');          // domyślnie ukryte (filtr)

Dostępne aliasy:

Po pojawieniu się Output Console w logu zobaczysz powitalną linię informującą który alias jest dostępny na tej stronie.

Co jest przechwytywane

Błędy żądań fetch/XHR nie trafiają do zakładki Errors (to nie wyjątki JS) — znajdziesz je w zakładce Network po statusie 4xx/5xx. Nie łapiemy naruszeń CSP ani wewnętrznych ostrzeżeń Chrome.

Pomoc szybka — Ctrl+Shift+H

Ctrl+Shift+H otwiera przesuwalne okno pomocy szybkiej — przewodnik po obsłudze JustZix na froncie: skróty globalne, skróty wewnątrz okien, Output Console, obsługa okien myszą, tryb edycji paska oraz logowanie do Output Console. Działa na każdej stronie. Okno przeciągasz za nagłówek; Esc / klik poza / × / ponowny Ctrl+Shift+H zamyka.

Dostosowanie wyglądu okna

Kolory: w modalu zarządzania (panel edycji) każde okno ma color picker — kropka nagłówka, tło i tekst nagłówka, tło i tekst body, kolor przycisków akcji.

Font i rozmiar: prawy klik na pasek nagłówka okna → menu z wyborem fontu (Consolas, Menlo, Monaco, Courier New i inne monospace) oraz rozmiaru (10–24 px).

Przeciąganie, przyklejanie i łączenie

Każde okno przeciągasz za pasek nagłówka. Przy zbliżeniu krawędzi do innego okna / paska akcji / pływającego przycisku (≤ 12 px) pojawia się magnetyczne przyciąganie — okna sklejają się w grupę. Przeciąganie sklejonej grupy przesuwa wszystkie elementy razem. Pozycje są zapamiętane per okno przeglądarki.

Zmiana rozmiaru okna

Każde okno ma 8 uchwytów resize: 4 w narożnikach (zmiana szerokości i wysokości naraz) oraz 4 na krawędziach (zmiana tylko jednej osi). Przeciągany uchwyt utrzymuje przeciwległą krawędź w miejscu. Zakres: szerokość 180–1200 px, wysokość 120–900 px. Nowy rozmiar (pane.size) jest zapisywany — dla okien trwałych synchronizowany między urządzeniami, dla okien TEMP per karta.

Przewijanie wewnątrz okna

Przewijanie kółkiem myszy wewnątrz okna przewija wyłącznie zawartość tego okna — strona pod spodem się nie przewija. Dotyczy to także sytuacji, gdy obszar okna osiągnie koniec przewijania albo gdy kursor jest nad fragmentem nieprzewijalnym (nagłówek, pasek filtra).

Prawy klik na nagłówek okna

Krzyżyk zamykający i podwójne kliknięcie nagłówka

Każde okno (zarówno tymczasowe TEMP jak i trwałe persistent) ma w prawym rogu nagłówka krzyżyk × zamykający. TEMP zostają ukryte (otworzysz ponownie z menu kontekstowego strony lub skrótem), persistent — wyłączone (włączysz checkboxem w popupie). Podwójne kliknięcie w pasek nagłówka:

Sklejanie i podświetlenie krawędzi

Przy zbliżeniu krawędzi okna do innego okna JustZix (próg 12 px) pokazuje się czerwona krawędź po stronie sklejania (na obu oknach). Puszczenie kursora w tym położeniu wykonuje snap — okna lecą dalej jako grupa. W tym mechanizmie biorą udział wszystkie okna wtyczki: paski akcji, FAB, persistent panes (CSS/JS/Console/Output), TEMP oraz AI Helper.

TEMP panes — tymczasowe okna

Możesz utworzyć tymczasowe okno na dowolnej stronie — nawet takiej, dla której nie masz żadnego folderu. TEMP panes to szybkie narzędzie ad-hoc: testujesz CSS/JS na obcej stronie bez konfigurowania reguł.

Cechy TEMP panes:

Tworzenie / zamykanie (toggle):

AI Helper — asystent AI

AI Helper to wbudowany w wtyczkę asystent AI, który pomaga przygotować i wdrożyć rozwiązanie CSS/JS pod konkretne zadanie na bieżącej stronie. Model może badać stronę, testować kod na żywo w oknach TEMP i — po Twojej akceptacji — utworzyć gotowy katalog, grupę i zestaw.

Konfiguracja kluczy API

W menu Ustawienia sidebara pozycja „AI Helper" otwiera modal konfiguracji:

Bezpieczeństwo kluczy: klucze API są domyślnie przechowywane wyłącznie w pamięci lokalnej tego urządzenia (chrome.storage.local). Klucz trafia na inne urządzenia tylko, gdy zaznaczysz przy nim checkbox „synchronizuj" — wtedy jest synchronizowany przez chmurę JustZix (ten sam kanał, którym wtyczka synchronizuje foldery, grupy i zestawy). Klucze bez zaznaczenia nigdy nie opuszczają urządzenia. Wywołania API idą przez service worker wtyczki, więc klucz nie trafia do kontekstu strony.

Okno czatu

Okno AI Helper to pływające okno (per karta, jak okna TEMP — przeciągane, skalowalne 8 uchwytami, krzyżyk zamykający, jedna instancja). Otwierasz / zamykasz je:

W oknie: wybór dostawcy (gdy masz więcej niż jeden klucz) i modelu (lista pobierana na żywo), historia rozmowy, przycisk czyszczenia rozmowy oraz pole tekstowe (wyślij przyciskiem lub Ctrl+Enter). Model dostaje automatycznie kontekst bieżącej strony — URL, tytuł i fragment HTML.

Workflow agentowy

AI Helper prowadzi rozmowę według ustalonego workflow:

  1. Dopytuje o szczegóły — zakres URL, nazwy folderu/grupy/zestawu, kolory, dokładny cel.
  2. Bada stronę narzędziem query_page (selektory, struktura DOM) przed napisaniem kodu.
  3. Wstawia przygotowany kod CSS/JS do tymczasowego okna TEMP, które widzisz na żywo na stronie.
  4. Samodzielnie weryfikuje błędy — narzędziami read_temp_pane i read_console sprawdza, czy testowany kod nie zgłasza błędów, zanim pokaże Ci wynik.
  5. Prosi o sprawdzenie efektu i wprost pyta, czy test się udał.
  6. Gdy test nie wyszedł — poprawia kod i testuje ponownie.
  7. Dopiero po Twoim potwierdzeniu utrwala rozwiązanie: tworzy katalog → grupę → zestaw, a w razie potrzeby również pasek akcji i akcje. Każde utworzenie encji wymaga osobnego potwierdzenia w wtyczce.

Model używa narzędzi przez prosty protokół tekstowy (blok @@JZ_TOOL@@ … @@END@@) działający identycznie dla OpenAI, Anthropic i Gemini. Wywołania narzędzi i ich wyniki pokazują się w oknie jako osobne „chipy". Dostępne narzędzia:

NarzędzieDziałanie
query_pageZwraca liczbę dopasowań selektora i HTML do 5 elementów
list_structureZwraca istniejące foldery / grupy / zestawy wraz z ich id
open_temp_paneOtwiera tymczasowe okno TEMP (CSS lub JS)
set_temp_pane_codeWstawia kod do okna TEMP — służy do testów na żywo
read_temp_paneWeryfikuje okno TEMP — dla JS wykonuje kod i zwraca błąd lub sukces
read_consoleOtwiera okno TEMP Output Console i zwraca przechwycone wpisy console strony
create_folderTworzy folder + domyślną grupę (wymaga potwierdzenia)
create_groupTworzy grupę w folderze (wymaga potwierdzenia)
create_ruleTworzy zestaw z kodem CSS/JS (wymaga potwierdzenia)
create_barTworzy pasek akcji przypisany do folderu/grupy/zestawu (wymaga potwierdzenia)
create_actionTworzy akcję (button/select/input/slider/textarea/toggle3) na pasku (wymaga potwierdzenia)
request_user_inputWyświetla użytkownikowi formularz inline w oknie czatu (pola tekstowe / liczbowe / kolor / select / checkbox) i czeka na odpowiedź
list_bars / list_actions / list_panes / list_allZwracają listy istniejących pasków / akcji / okien (CSS/JS/Console/Output) — opcjonalnie filtrowane po parencie
read_folder / read_group / read_rule / read_bar / read_actionZwracają pełne dane konkretnej encji (przed planowaną zmianą)
update_folder / update_group / update_rule / update_bar / update_actionModyfikują istniejącą encję — wymaga potwierdzenia (z diffem pól)
create_css_pane / create_js_pane / create_js_console / create_output_consoleTworzą okno persistent na froncie (wymaga potwierdzenia)
read_*_pane / read_*_console + update_*_pane / update_*_consoleOdczyt i zmiana metadanych okien persistent (nazwa, kolor, pozycja, rozmiar, styling)
read_pane_code / update_pane_codeOdczyt i wstawienie kodu CSS/JS do okna persistent (per karta przeglądarki) — wymaga potwierdzenia
screenshot_pageZrzut bieżącego widoku strony jako obraz — interfejs JustZix automatycznie ukrywany; dla modeli vision-capable
AI Helper potrafi tworzyć, odczytywać i modyfikować pełną strukturę wtyczki (foldery / grupy / zestawy / paski / akcje / okna persistent), samodzielnie weryfikować błędy testowanego kodu (read_temp_pane + read_console), prosić Cię o dane przez inline-formularz (request_user_input) i wykonywać screenshoty strony (screenshot_page) jako obrazy załączane do kolejnego zapytania.

Wygląd okna AI Helper

Prawy klik na pasek nagłówka okna AI Helper otwiera menu z opcjami „Ustaw wyżej" / „Ustaw niżej" (zmiana kolejności okien JustZix, gdy się nakładają), „Rozłącz od: X" (gdy AI Helper jest sklejony z innym oknem) oraz „Wygląd…". Panel „Wygląd…" pozwala osobno stylizować cztery role w rozmowie: Twoje wiadomości, odpowiedzi AI, wynik narzędzia, formularze inline — każda z osobnym fontem, rozmiarem, kolorem tekstu i tłem. Wartości zapisywane są per urządzenie.

Sklejanie z innymi oknami i kolejność (Z-order)

Okno AI Helper bierze udział w tym samym mechanizmie sklejania co paski akcji, okna persistent (CSS / JS / Console / Output) i okna TEMP. Przeciągnięcie krawędzi w okolice innego okna JustZix (próg 12 px) → magnetyczne przyciąganie, czerwona krawędź wskazuje stronę sklejania na obu oknach. Sklejone okna przesuwają się jako grupa.

Gdy okna się nakładają, opcje „Ustaw wyżej" / „Ustaw niżej" w menu kontekstowym każdego okna (prawy klik na nagłówku) wykonują skok jednorazowy — okno przeskakuje ponad / pod wszystkie kolidujące sąsiedztwo, nie trzeba klikać wielokrotnie.

Screenshot strony (dla modeli vision)

Narzędzie screenshot_page wykonuje zrzut bieżącego widoku strony i przesyła go modelowi jako obraz. Cały interfejs JustZix jest automatycznie ukrywany przed zrzutem (FAB, paski akcji, AI Helper, persistent panes, TEMP). Bufor 3 ostatnich screenów, jednorazowo dołączane do kolejnego zapytania (po wysłaniu — usuwane z bufora, by oszczędzić tokeny). Wymaga modelu vision-capable (np. gpt-4o, claude-3+/4, gemini-1.5+/2). Pod chipem wyniku w czacie pokazuje się miniaturka — klik otwiera pełny widok modal.

Skróty klawiaturowe

Globalne (działają z dowolnego miejsca strony)

SkrótAkcja
Ctrl+Alt+GUtwórz / zamknij TEMP CSS pane
Ctrl+Alt+HUtwórz / zamknij TEMP JS pane
Ctrl+Alt+JUtwórz / zamknij TEMP JS Console
Ctrl+Alt+KUtwórz / zamknij TEMP Output Console
Ctrl+Alt+IOtwórz panel edycji (osobne okno), pierwszy aktywny zestaw na tej stronie, zakładka CSS
Ctrl+Alt+Ojak wyżej, zakładka JS
Ctrl+Alt+Pjak wyżej, zakładka Akcje
Ctrl+Alt+\Otwórz / zamknij okno AI Helper
Ctrl+Alt+STryb edycji paska akcji — włącz / wyłącz
Ctrl+ZCofnij ostatnią zmianę (tylko w trybie edycji paska)
DeleteUsuń zaznaczone labelki (tylko w trybie edycji paska)
EscOdznacz wszystkie elementy (tylko w trybie edycji paska)
Ctrl+Shift+LWyczyść aktywną zakładkę każdej Output Console
Ctrl+Shift+HPomoc szybka — skróty i okna na froncie (działa globalnie)

Wewnątrz okna (gdy ma fokus)

SkrótAkcjaOkno
Ctrl+EnterWykonaj kod / wyślij wiadomośćJS pane, JS Console, AI Helper
/ Historia komendJS Console (input)
Ctrl+LWyczyść outputJS Console
EscWyczyść pole szukaniaOutput Console

Edytory kodu (panel edycji)

SkrótAkcja
Ctrl+Alt+FFokus na pole wyszukiwania nad edytorem
Ctrl+Alt+→ / Ctrl+Alt+←Następny / poprzedni wynik wyszukiwania
Enter / Shift+EnterWyszukaj / następny / poprzedni wynik (w polu wyszukiwania)
Ctrl+Alt+I / O / PPrzełącz zakładkę aktywnego zestawu na CSS / JS / Akcje (gdy karta zestawu wyrenderowana)
Dlaczego takie kombinacje? Ctrl+Alt+G/H/J/K to klawisze obok siebie (układ Vim), wszystkie wolne we wszystkich przeglądarkach i systemach. Ctrl+Alt+L celowo pominięty — na Linuksie blokuje ekran. Ctrl+Alt+S (tryb edycji) i Ctrl+Alt+\ (AI Helper) są w tej samej rodzinie modyfikatorów. Skróty Output Console (Ctrl+Shift+...) nie kolidują, bo różnią się modyfikatorem.

Eksport i import

Wtyczka oferuje pięć formatów eksportu (pełny, częściowy, katalog, grupa, zestaw) z automatycznym wykrywaniem typu pliku przy imporcie, by uniknąć przypadkowego nadpisania.

Eksport — pełny lub wybranych elementów

W menu Ustawienia sidebara: Eksport ustawień. Modal otwiera dwa tryby:

Pliki częściowego eksportu mają nazwę justzix-partial-DATA.json (vs. justzix-backup-DATA.json dla pełnego), a w środku flagę partial: true i pole groups[].

Eksport pojedynczego katalogu (z selekcją)

W pasku katalogu: Eksport — otwiera modal z drzewem grup i zestawów (analogicznie jak w eksporcie częściowym, ale ograniczonym do tego katalogu). Eksportowane są tylko zaznaczone zestawy oraz grupy, do których one należą — puste grupy nie trafiają do pliku.

Format justzix-folder — plik zawiera pole groups[] z hierarchią grup i zestawów katalogu.

Eksport grupy

W pasku grupy: Eksport — modal z listą zestawów grupy (checkboxy). Plik: justzix-grupa-<nazwa>-<data>.json, format justzix-group.

Eksport pojedynczego zestawu

W widoku zestawu: Eksport zestawu — od razu pobiera plik (bez modalu). Format justzix-rule, nazwa: justzix-zestaw-<nazwa>-<data>.json.

Pięć formatów plików:

Import — automatyczna detekcja typu (modal pełnego importu)

Po wczytaniu pliku/wklejeniu JSON-u wtyczka automatycznie rozpoznaje typ i pokazuje kolorowy panel detekcji:

KolorZnaczenieAkcja
Teal (turkusowy)Prawidłowy pełen backupPokazuje liczbę katalogów/zestawów, datę eksportu, ostrzeżenie o nadpisaniu
FioletowyCzęściowy backup (partial: true)Wybór trybu: Scal z obecnymi lub Zastąp wszystko
PomarańczowyNiewłaściwy typ pliku w tym modaluKomunikat naprowadzający na właściwy modal, przycisk Importuj zablokowany
CzerwonyBłąd parsowania JSON / nieprawidłowy formatPrzycisk Importuj zablokowany

Tryby importu częściowego (fioletowy panel)

Import pojedynczego katalogu

W pasku katalogu: Import. Sprawdza konflikty po ID i nazwie:

Import grupy

W pasku grupy: Import — akceptuje 3 formaty:

Wszystkie zestawy z pliku trafiają do bieżącej grupy z nowymi ID (operacja zawsze typu "dodaj kopię" — brak konfliktów).

Import pojedynczego zestawu

W widoku zestawu: Import zestawu — akceptuje tylko justzix-rule. Prompt z 3 opcjami:

Pełny import nadpisuje wszystkie ustawienia (chyba że to częściowy backup z trybem "Scal"). Zrób eksport przed importem, żeby mieć backup.

Praktyczne zastosowania częściowego eksportu

Synchronizacja chmurowa

Ustawienia → Synchronizacja chmurowa otwiera modal konta synchronizacji. Wtyczka trzyma Twoją bibliotekę (katalogi, grupy, zestawy, akcje, paski akcji, okna na froncie) w chmurze justzix.com i utrzymuje ją spójną między urządzeniami. Synchronizacja działa tylko po zalogowaniu — bez konta wtyczka pracuje wyłącznie lokalnie.

Konto i klucz synchronizacji

Pierwsza synchronizacja — rozwiązanie konfliktu

Przy logowaniu wtyczka porównuje dane lokalne z tymi w chmurze:

WybórCo robi
Użyj danych z chmuryCzyści lokalną bibliotekę i odtwarza stan konta z serwera
Wyślij moje lokalneLokalne dane stają się kanoniczne — kasują to, co było w chmurze
ScalŁączy oba zestawy — dorzuca brakujące encje, zachowując istniejące

Można też Anuluj — wtedy wtyczka się wylogowuje i nic nie zmienia.

Bieżąca synchronizacja

Po pierwszym uzgodnieniu synchronizacja chodzi w tle: wtyczka co około minutę wysyła zmiany i pobiera nowe encje. Zmiana zrobiona na jednym urządzeniu pojawia się na innych po krótkiej chwili. Kropka stanu przy pozycji „Synchronizacja chmurowa" pokazuje, czy konto jest połączone.

Ochrona przed „duchami". Folder skasowany wcześniej na jednym urządzeniu potrafił „wskrzesić się" przy logowaniu na kolejnym. Wtyczka pobiera teraz z serwera listę skasowanych encji (tombstone'y) i nie wypycha z powrotem czegoś, co zostało gdzie indziej usunięte.

Zakładka Status — biblioteka w chmurze, historia, akcje

Zakładka Status modala synchronizacji pokazuje stan konta i daje przyciski akcji:

Biblioteka w chmurze

Liczniki encji znajdujących się na koncie: katalogi, grupy, zestawy, akcje, paski akcji, okna na froncie. Liczone są wyłącznie encje osiągalne w drzewie (grupa musi mieć istniejący katalog, zestaw — grupę, pasek/okno — istniejącego rodzica) — spójnie z licznikami Pulpitu. Odświeżają się przy otwarciu panelu i po ręcznej synchronizacji.

Historia synchronizacji

Lokalny dla urządzenia log ostatnich synchronizacji. Na stronie widać ostatnie 10 wpisów; przycisk „Pokaż pełną historię" otwiera okno z pełną listą (do 100 wpisów). Każdy wpis zawiera:

Log jest lokalny — nie jest synchronizowany między urządzeniami. Wpis powstaje po każdym ticku synchronizacji, który coś realnie zmienił; ręczne „Synchronizuj teraz" zostawia wpis zawsze, nawet przy zerowych zmianach.

Co się synchronizuje, a co nie

Statystyki użycia (zastosowania CSS, uruchomienia JS, wyświetlenia okien) są synchronizowane jako osobne encje per-urządzenie — kafelek Pulpitu sumuje je ze wszystkich sparowanych urządzeń. Motyw i język są synchronizowane jako wspólne ustawienie konta i stosowane przy kolejnym otwarciu panelu na drugim urządzeniu.

Udostępnianie po linku (Shares)

Alternatywa dla wysyłania pliku JSON na komunikator. Wystawiasz publiczny link z czasem życia (1h / 6h / 12h / 24h / 48h) i przekazujesz odbiorcy. Backend justzix.com trzyma payload w chmurze do wygaśnięcia, potem zostaje skasowany.

Wymaga zalogowanego konta synchronizacji (Sync). Sam token to publiczny secret — każdy z linkiem pobierze, więc nie wysyłaj na publicznych kanałach jeśli zawartość jest wrażliwa.

Format tokena

JZS-XXXX-XXXX-XXXX-XXXX (16 znaków Crockford base32, ~80-bit entropy). Przyjmowany jest też cały URL https://www.justzix.com/s/JZS-... — wtyczka parsuje i normalizuje (mylące litery I/L→1, O→0, U→V).

Limity konta

Przekroczenie limitu = błąd z polskim komunikatem. Odwołaj nieużywane linki w panelu Moje share.

Tworzenie linku (nadawca)

Przycisk „Udostępnij URL" w czterech punktach wejścia, obok „Pobierz plik":

Klik otwiera modal generowania linku: subject + summary co udostępniasz, radio z TTL (domyślnie 24h), „Wygeneruj link". Po sukcesie modal przełącza się na widok wyniku z dwiema kopiowalnymi wartościami:

Każdy ma swój przycisk „Skopiuj". Pokazany jest też czas wygaśnięcia w lokalnej strefie czasowej.

Panel „Moje share"

Ustawienia → Moje share (osobny modal, nie część synchronizacji — to dwie różne funkcjonalności). Pokazuje listę aktywnych linków: counter w nagłówku X/20 aktywnych · Y MB / 50 MB, a dla każdego share'a kartę z:

Odwołanie nie wycofuje już pobranej zawartości. Jeśli ktoś zdążył pobrać payload, ma go lokalnie u siebie. Share to "best-effort time-limit", nie DRM.

Importowanie z linka (odbiorca)

Ustawienia → Importuj z URL (między „Import ustawień" a „Synchronizacja chmurowa", ikona łańcucha). Modal ma dwa kroki:

Krok 1 — input. Wklejasz link albo sam token. Walidacja klient-side: wyciągany jest token z URL, normalizowany Crockford-base32, sprawdzane 16 znaków + format. Błędny format → komunikat z hintem na poprawny format.

Krok 2 — preview. Wtyczka pokazuje podsumowanie share'a:

Jeśli share zawiera JavaScript (jsLines > 0) — pojawia się czerwony banner ostrzeżenia z linkiem „Pokaż kod JavaScript". Otwiera overlay z pełnym kodem JS każdej reguły i akcji — przejrzyj przed zaimportowaniem, bo kod będzie wykonywać się na pasujących stronach.

Krok 3 — import. Klik „Zaimportuj" → backend zwraca pełen payload → wtyczka tworzy nowe encje z zawsze świeżymi ID (nigdy nie nadpisuje istniejących po ID):

TypCo się dzieje
justzix-ruleTworzy nowy katalog + grupa „Domyślna" + zaimportowany zestaw
justzix-groupTworzy nowy katalog + zaimportowana grupa + zestawy
justzix-folderDodaje jako nowy katalog top-level
justzix-fullMerge: dorzuca wszystkie folders/groups/rules ze świeżymi ID

Nazwa nowego kontenera: <nazwa-nadawcy lub "Import"> <data PL> — możesz potem dowolnie przenazwać / przenieść.

Błędy odbiorcy

BłądKomunikat
Nieprawidłowy token„Token jest nieprawidłowy. Sprawdź czy skopiowałeś cały link."
404 not_found„Ten link wygasł lub został odwołany przez nadawcę. Poproś o nowy."
429 rate_limited„Zbyt wiele prób. Zaczekaj chwilę i spróbuj ponownie."
5xx / network„Problem z serwerem. Spróbuj ponownie."

Backend nie rozróżnia 404 „nigdy nie istniał" od 404 „wygasł / odwołany" — celowo, żeby nie ujawniać czy token kiedykolwiek istniał.

Programatyczne wywoływanie akcji z JS

Każdą akcję (z zakładki „Akcje" w karcie zestawu) możesz wywołać programatycznie z poziomu JS zestawu lub kodu innej akcji. Globalna namespace window.JZ jest instalowana w MAIN world automatycznie przed każdym wykonaniem user-JS.

API — akcje

WywołanieCo robi
JZ.click(labelOrId)Klika programatycznie. Semantyka per typ akcji: BUTTONel.click(). SELECT static (przycisk z dropdownem) → el.click() (otwiera popup; user wybierze opcję ręcznie). SELECT js (natywny <select>) → ustawia value na pierwszą non-disabled opcję i dispatch change. INPUT / TEXTAREA / SLIDERel.click() — uwaga: nie zmienia wartości ani nie odpala handlera change. Aby ustawić wartość: const el = JZ.action('LBL'); el.value = 'X'; el.dispatchEvent(new Event('change')). TOGGLE3el.click() trafia na kontener; żeby aktywować konkretny stan użyj el.querySelector('.jz-toggle3-state[data-jz-state-idx="1"]').click(). Zwraca true/false.
JZ.value(labelOrId)Jednolity getter aktualnej wartości. INPUT / TEXTAREA → natywne el.value. SLIDER → wrap.dataset.jzValue (wrap to DIV, renderer ustawia data attr od initial + na input/change). SELECT(js) → natywne el.value. SELECT(static) → el.dataset.jzValue (renderer set przy każdym wyborze). TOGGLE3 → el.dataset.jzValue (state.value aktywnego; fallback do state.label). BUTTON → null. Element nieznaleziony → null.
JZ.setValue(labelOrId, value)Programmatic setter. INPUT/TEXTAREA → el.value = String(v) + dispatch input+change. SLIDER → ustawia natywny <input.jz-action-slider> + dispatch. SELECT(js) → el.value = String(v) + dispatch change. SELECT(static) + TOGGLE3 → wysyła CustomEvent 'jz-set-value', content.js listener robi pełen flow (memory + UI + odpala kod). TOGGLE3 lookup: po state.value → fallback do state.label → fallback do numerycznego idx 0-2. BUTTON → false. Zwraca true/false.
JZ.action(labelOrId)Zwraca element akcji (button / select / input / textarea / slider / toggle3 container) lub null. Lookup: najpierw po data-jz-action-id, potem case-insensitive po data-jz-key (UPPERCASE label). Działa dla wszystkich 6 typów akcji.
JZ.actionById(id)Lookup wyłącznie po stabilnym action.id (np. 'a_mp1deeq3_uimd8l'). Polecane dla akcji bez labela lub gdy chcesz pewności.
JZ.actions()Tablica wszystkich widocznych elementów akcji (button + select + input + textarea + slider + toggle3) na bieżącej stronie.
JZ.labels()Tablica oryginalnych etykiet (case zachowany jak wpisałeś).

Przykład — czytanie i ustawianie wartości

// === Czytanie ===
const filter = JZ.value('FILT');           // INPUT/TEXTAREA — string
const opacity = JZ.value('OPAC');          // SLIDER — string numeric ("75")
const mode = JZ.value('MODE');             // SELECT static — string (option.value)
const theme = JZ.value('THM');             // TOGGLE3 — state.value aktywnego stanu

// === Ustawianie ===
JZ.setValue('FILT', 'nowa wartość');       // INPUT/TEXTAREA — string + dispatch input+change
JZ.setValue('OPAC', 75);                   // SLIDER — clamp do min/max, dispatch input+change
JZ.setValue('SRT', 'prod');                // SELECT(js) — natywne select + dispatch change
JZ.setValue('MODE', 'staging');            // SELECT static — content.js robi flow (memory + UI + kod)
JZ.setValue('THM', 'dark');                // TOGGLE3 — lookup po state.value (fallback do label, potem idx)
JZ.setValue('THM', 2);                     // TOGGLE3 — równoważne; numeric idx też działa

API — paski i floating button

WywołanieCo robi
JZ.bars()Wszystkie kontenery .jz-actions-bar (ActionBars) widoczne na stronie.
JZ.barById(id)Element baru po data-jz-bar-id.
JZ.floatingBtn()Główny pływający przycisk #justzix-floating-btn lub null (gdy ukryty).
Lookup w JZ.click / JZ.action jest case-insensitive po labelu, ale dokładny po stabilnym action.id. Dla akcji bez labela (typowo INPUT) używaj JZ.actionById('a_...').

Context vars w kodzie akcji

W polu „Kod JS" akcji masz automatycznie dostępne zmienne — wstrzykiwane jako const przez background service worker przed wykonaniem:

ZmiennaCo zawieraKiedy dostępna
$elDOM element tej akcji (input / select / button / textarea / kontener toggle3)zawsze gdy action.id istnieje
$action{ id, label, type, el }zawsze
valueAktualna wartość per typ: SELECT static → option.value; INPUT/TEXTAREA → zawartość pola; SLIDER → liczba; TOGGLE3 → state.value aktywnego stanu (fallback do state.label gdy value puste).SELECT static, INPUT, TEXTAREA, SLIDER, TOGGLE3. SELECT js: kod uruchamiany RAZ przy renderze — value jest pusty.
stateIdxInteger 0-2 — indeks aktywnego stanu (od którego stanu zaczął się klik).tylko TOGGLE3
stateLabelString — label aktywnego stanu (max 5 znaków).tylko TOGGLE3

Snippet w UI

W modalu konfiguracji akcji typu SELECT i INPUT panel „Stabilne ID akcji" pokazuje pełen action.id z przyciskiem copy oraz przykładowy selektor JS (document.querySelector('[data-jz-action-id="..."]')). Pod listą BUTTON-ów widać chipy JZ.click('LBL') — klik chipa kopiuje snippet do schowka.

Wymagania

Przykład — akcja AUTO wywołująca sekwencję

// Kod akcji "AUTO"
JZ.click('LOAD');                          // klik na akcję LOAD (np. ładuje dane)
setTimeout(() => JZ.click('PROC'), 500);   // 500ms później PROC (przetwarza)
setTimeout(() => JZ.click('SAVE'), 1500);  // 1500ms później SAVE (zapis)

Przykład — JS zestawu reagujące na DOM

Po pojawieniu się dynamicznego elementu kliknij akcję usuwającą go:

// Kod JS zestawu — observer na modal który pojawia się dynamicznie
const observer = new MutationObserver(() => {
  if (document.querySelector('.cookie-banner')) {
    JZ.click('CCK');  // kliknij akcję usuwającą banner
    observer.disconnect();
  }
});
observer.observe(document.body, { childList: true, subtree: true });

Przykład — programatyczne ustawienie wartości INPUT

// JZ.click na INPUT nie zmienia wartości — użyj wzorca z dispatchem 'change':
const el = JZ.action('SRCH');           // lub JZ.actionById('a_mp1deeq3_uimd8l')
if (el) {
  el.value = 'nowy filtr';
  el.dispatchEvent(new Event('change'));
}

Bezpośredni dostęp przez DOM

Jeśli wolisz pracować z DOM bezpośrednio (np. zmieniasz styl, nie wywołujesz):

// Lookup po stabilnym ID (zalecane — odporne na zmianę labela):
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');

// Lookup po labelu (case-insensitive — UPPERCASE w data-jz-key):
const btn = document.querySelector('[data-jz-key="MYBT"]');
btn.style.opacity = '0.5';      // przyciemnij
btn.dataset.busy = 'true';      // własny atrybut

Gdzie żyją elementy akcji w DOM:

Typ akcjiKontenerSelektor elementu
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 z popupem; data-jz-value = aktualnie wybrana wartość)
SELECT (js).jz-actions-bar.jz-action-select.jz-variant-js (natywny <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); slider sam: .jz-action-slider (natywny <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="..."] (kontener; data-jz-value = state.value aktywnego); state buttony: .jz-toggle3-state[data-jz-state-idx="0|1|2"], aktywny ma klasę .active

Wszystkie elementy mają atrybut data-jz-action-id (unikalny stabilny identyfikator). Selektor .jz-actions-bar jest bezpieczny — nie koliduje z DOM-em strony.

Lookup po labelu (data-jz-key) działa dla wszystkich typów akcji. Każdy element akcji ma zarówno data-jz-label (oryginalny case) jak i data-jz-key (UPPERCASE). Dla pewności (np. gdy label może się zmienić) używaj stabilnego data-jz-action-id lub JZ.actionById().

Wybrane funkcje

Wyszukiwarka w sidebarze

Pole "Szukaj" filtruje drzewo katalogów. Logika dopasowania:

Match jest case-insensitive, podświetlanie na żółto pokazuje miejsce dopasowania.

Globalny włącznik

Po kliknięciu ikony wtyczki w toolbarze Chrome pojawia się widget popupu z dużym zielono/szarym przełącznikiem „Plugin enabled". W trybie wyłączonym żaden CSS/JS nie jest wstrzykiwany na żadnej stronie, niezależnie od ustawień katalogów. Pływający przycisk wtedy jest wyłączony (Halt Red, opacity 0.7). Stan przeżywa restart Chrome.

Wstaw URL z karty

Przycisk obok pola wzorca URL — wstawia protocol://host/* z aktywnej karty. Tworzenie katalogu w 2 sekundy. Adres strony opcji wtyczki jest pomijany — bierze najświeższą zewnętrzną kartę.

Walidacja URL na żywo

Inline po prawej stronie pola URL pojawia się informacja "Pasuje do X otwartych kart" lub ostrzeżenie. Łapie literówki natychmiast.

Historia zmian zestawu

Snapshot CSS i JS jest tworzony 3 sekundy po ostatniej edycji (debounce). Limit 5 wersji — najstarsza zostaje wypchnięta. Przy przywracaniu wersji obecna zawartość zostaje dodana do historii jako najnowszy snapshot, więc zawsze możesz cofnąć cofnięcie.

Tagi i wyszukiwanie po tagach

W nagłówku karty zestawu jest pole na tagi — wpisuj oddzielone przecinkami. Pojawiają się jako małe etykiety w sidebarze obok nazwy zestawu. Wyszukiwarka znajduje też po tagach.

Etykieta i kolor katalogu

Każdy katalog może mieć własną etykietę na pływającym przycisku (max 3 litery, UPPERCASE) i kolor (color picker). Etykieta i kolor pomagają wzrokowo rozpoznać, który projekt jest aktywny na danej stronie.

Statystyki kliknięć akcji

Każdy przycisk akcji liczy ile razy został kliknięty. Pomaga zobaczyć które są naprawdę używane.

Walidacja CSS

Pod edytorem CSS wyświetla się pasek z listą problemów składniowych:

To prosta walidacja syntaktyczna — nie sprawdza poprawności properties/values. CSS z błędem nadal się wstrzykuje (przeglądarka po prostu pominie błędne reguły).

Preview JS przy imporcie

W modalu Import pojedynczego katalogu, po wczytaniu pliku, pojawia się lista zestawów z metryką:

Zawartość pliku (3 zestawów):
  Auto-login              CSS: 0L • JS: 4L                    JS
  Ukryj banner cookie     CSS: 8L • JS: 0L
  Debug GTM               CSS: 0L • JS: 12L • 2 akcji (8L)    JS

Ostrzeżenie z liczbą linii JS, jeśli jakiekolwiek są obecne. Klik na przycisk JS pokazuje pełen kod do przejrzenia przed importem.

Try/catch izolacja JS

Każdy zestaw JS jest wykonywany osobno, z własnym try/catch. Błąd w jednym zestawie nie blokuje wykonania innych. Błędy są logowane w konsoli z nazwą zestawu/akcji i pełnym stack trace.

Storage quota

Wskaźnik zużycia pamięci w menu Ustawienia sidebara (np. 1.2 MB / 10 MB). Czerwony powyżej 80%.

Filtr "Tylko aktywne"

Checkbox nad listą — ukrywa zestawy oznaczone jako niezależne (○) i pokazuje tylko te aktywne w katalogu (●). Pomaga odsiać "ręczne" zestawy gdy katalog ma ich wiele. Reaguje natychmiast na zmiany przełączników.

Aktualizacja wtyczki

Wtyczka ma stały klucz w manifeście (build Firefox — stały gecko.id), co oznacza że ID rozszerzenia jest niezmienne między aktualizacjami — dane (katalogi, zestawy, ustawienia) zostają zachowane. JustZix jest wydawany na cztery przeglądarki: Chrome, Edge, Operę i Firefoksa.

Powiadomienie o nowej wersji

W menu Ustawienia (przy numerze wersji) pojawia się zielony banner „Dostępna nowa wersja", gdy serwer wystawi nowszą paczkę niż zainstalowana. Banner zawiera link do pobrania. Sprawdzanie jest ciche — przy braku sieci banner po prostu się nie pokazuje.

Procedura aktualizacji (Chrome / Edge / Opera)

  1. Pobierz nowy ZIP z aktualizacją
  2. Rozpakuj nadpisując ten sam folder, w którym była poprzednia wersja
  3. W chrome://extensions/ (Edge: edge://extensions/) znajdź wtyczkę i kliknij ikonę odświeżania na kafelku
  4. Wtyczka przeładuje się z nowymi plikami, dane zostają

Firefox

Build Firefox wczytuje się przez about:debugging → „Ten Firefox" → „Wczytaj tymczasowy dodatek" (wskazując manifest.json w folderze justzix_firefox/). Aktualizacja = ponowne wczytanie po nadpisaniu plików.

Co może spowodować utratę danych: Zawsze zrób eksport przed jakąkolwiek operacją na rozszerzeniu. Jeśli korzystasz z synchronizacji chmurowej — dane są też w chmurze konta.

Przykłady CSS

CSS Ukrywanie reklam i bannerów
/* Ukryj typowe reklamy */
.ad, .ads, .advertisement,
.banner-ad, [class*="ad-banner"],
[id*="google_ads"] {
  display: none !important;
}

/* Ukryj cookie banner */
.cookie-banner, #cookie-notice {
  display: none !important;
}
CSS Tryb ciemny dla strony bez wsparcia dark mode
html {
  filter: invert(0.92) hue-rotate(180deg);
}
img, video, picture, iframe, [style*="background-image"] {
  filter: invert(1) hue-rotate(180deg);
}

Trick: invert całej strony i ponowny invert obrazów. Działa zaskakująco dobrze na większości stron.

CSS Wyróżnienie elementów dla testów / e2e
/* Pokoloruj wszystkie elementy z 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 Czytelniejszy panel administracyjny
/* Zwiększ czytelność tabel admina */
table.admin-list td, table.admin-list th {
  padding: 8px 12px !important;
  font-size: 14px !important;
}

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

/* Naprzemienne wiersze */
table.admin-list tbody tr:nth-child(odd) {
  background: #f9fafb;
}
CSS Szerszy kontener treści
/* Często strony mają sztywne max-width 1200px - wymuś szerokość */
.container, .main-content, main {
  max-width: 95% !important;
  width: 95% !important;
}
CSS Środowisko dev jako oczywiste (kolorowy banner)
body::before {
  content: "ŚRODOWISKO 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; }

Świetne dla wzorca https://dev.example.com/* żeby nie mylić środowisk.

Przykłady JavaScript

JS Auto-uzupełnienie pól logowania (środowisko dev)
// Tylko dla dev! Nigdy nie zapisuj prawdziwych haseł
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 Logowanie zdarzeń analitycznych do konsoli
// Przechwyć 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);
  };
}

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

Idealne do debugowania konfiguracji analityki na produkcji bez dotykania kodu.

JS Auto-skip intro / cookie / reklam
// Co 500ms przez 10s sprawdzaj i klikaj przyciski "Akceptuj"
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 Dodanie skrótów klawiszowych
document.addEventListener('keydown', (e) => {
  // Ctrl+Shift+S - zapisz formularz
  if (e.ctrlKey && e.shiftKey && e.key === 'S') {
    e.preventDefault();
    document.querySelector('button[type="submit"]')?.click();
  }
  // Ctrl+Shift+E - przejdź do edycji (nieprzetestowany przykład)
  if (e.ctrlKey && e.shiftKey && e.key === 'E') {
    e.preventDefault();
    document.querySelector('a.edit-link')?.click();
  }
});
JS Wyłączenie alertów / confirm / beforeunload
// Pomijaj denerwujące confirm i beforeunload na czas testów
window.confirm = () => true;
window.alert = (msg) => console.log('[stłumiony alert]', msg);
window.onbeforeunload = null;
window.addEventListener('beforeunload', e => {
  e.stopImmediatePropagation();
}, true);
JS Przeniesienie elementu w inne miejsce DOM
// Pamiętaj - czysty CSS tego nie zrobi gdy rodzic ma display:none
window.addEventListener('load', () => {
  const target = document.querySelector('.important-info');
  const newParent = document.querySelector('.sidebar');
  if (target && newParent) {
    newParent.prepend(target);
  }
});
JS Wyświetlanie ukrytych pól / elementów
// Pokaż wszystkie ukryte input type="hidden"
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);
});

Przykłady przycisków akcji

AKCJA CLR — wyczyść formularz

Skrót: CLR   Kolor: czerwony

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 }));
});
AKCJA FILL — uzupełnij dane testowe

Skrót: FILL   Kolor: zielony

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 }));
  }
});
AKCJA CART — dodaj produkt testowy do koszyka

Skrót: CART   Kolor: pomarańczowy

// Dla typowego sklepu — kliknij pierwszy "dodaj do koszyka"
const btn = document.querySelector('.add-to-cart, [data-action="add-to-cart"]');
if (btn) btn.click();
else alert('Nie znaleziono przycisku dodaj do koszyka');
AKCJA COPY — skopiuj URL strony do schowka

Skrót: COPY   Kolor: fioletowy

navigator.clipboard.writeText(location.href).then(() => {
  console.log('Skopiowano:', location.href);
});
AKCJA TKN — pokaż token uwierzytelniający

Skrót: TKN   Kolor: żółty

// Wyciąga token JWT z localStorage / cookies dla debugowania
const token = localStorage.getItem('authToken')
  || document.cookie.match(/token=([^;]+)/)?.[1];
if (token) {
  navigator.clipboard.writeText(token);
  alert('Token skopiowany. Pierwsze znaki: ' + token.slice(0, 20) + '...');
} else {
  alert('Brak tokena');
}
AKCJA SQL — pokaż zapytania API w konsoli

Skrót: SQL   Kolor: niebieski

// Przechwytuj wszystkie fetch i pokaż w konsoli
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('Włączono logowanie fetch. Każde wywołanie pojawi się w konsoli.');
AKCJA ENV — pokaż info o środowisku

Skrót: ENV   Kolor: szary

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

Scenariusze użycia

1. Praca z wieloma klientami / projektami

Każdy projekt ma własny katalog z własnym wzorcem URL. Możesz mieć katalogi:

Na prawym panelu prywatne katalogi można szybko włączać/wyłączać. Eksport pojedynczego katalogu pozwala podzielić się konfiguracją z zespołem.

2. Środowisko developerskie z wizualnym oznaczeniem

Na każdym dev/staging dodaj banner i auto-login. Jeden zestaw CSS (banner) i jeden JS (auto-fill). Tworzysz osobny katalog dla każdego środowiska, scala się prostym checkboxem.

3. Narzędzia dla product managera / QA

Panel akcji z przyciskami: FILL (testowe dane), CART (testowy zakup), CLR (czyść formularz), STATE (pokaż stan aplikacji w alercie). Bez programisty, bez konsoli, jeden klik.

4. Modyfikacje publicznych stron

Ulubione blogi/dokumentacje z lepszą czytelnością — większy kontener, czcionka, ciemny tryb. Każda strona w osobnym katalogu, "Aktywny" zostawiony na zawsze włączony.

5. Debugowanie analityki / GTM

Jeden zestaw na każdą domenę z JS przechwytującym dataLayer.push i gtag. Włączasz go gdy klient zgłasza problem z analityką, bez dotykania kodu strony.

6. Praca na panelach administracyjnych

Wzorzec *://*.justzix.com/admin/* i CSS poprawiający tabele, listy, formularze. Plus akcja "Filtr testowy" automatycznie ustawiająca filtry dla typowego workflow.

7. Bezpieczne testy na produkcji

Akcja RO (read-only) wstrzykuje CSS który ukrywa wszystkie przyciski "Usuń", "Zapisz", "Wyślij" — tymczasowy "tryb tylko do odczytu" by się nie pomylić.

// Ukryj groźne przyciski
document.querySelectorAll(
  'button[type="submit"], .delete-btn, .danger-btn, [class*="delete"]'
).forEach(b => b.style.display = 'none');
console.warn('TRYB READ-ONLY włączony');

Częste problemy i rozwiązania

JavaScript się nie wykonał

CSS nie działa

Pływający przycisk się nie pojawia

Po update wtyczki straciłem dane

Wtyczka ma stały klucz w manifeście — kolejne update'y zachowują dane. Jeśli mimo to dane zniknęły:

Pozycje przycisków/paneli się resetują

To normalne — pozycje są per okno przeglądarki i przechowywane w pamięci sesji (chrome.storage.session). Po zamknięciu okna pozycje znikają, w nowym oknie startujesz od domyślnych. Pozycja przeżywa nawigację między kartami w tym samym oknie.

Częściowy eksport pominął jakieś ustawienia globalne

Tak — częściowy eksport zawiera tylko zaznaczone katalogi i zestawy plus związane z nimi ustawienia widoczności. Nie zawiera pozycji pływających paneli (są per okno) ani innych globalnych preferencji. Dla pełnego backupu użyj trybu "Wszystko".

Import częściowy nadpisał mi nieistniejący wcześniej katalog

Tryb "Scal" dopasowuje katalogi po ID. Jeśli importowany plik miał ID konfliktujące z istniejącym katalogiem (np. ten sam plik był już raz importowany), pojawia się prompt: 1 nadpisz / 2 kopia (domyślne, bezpieczne) / Anuluj. Wybierając 2 dostajesz kopie z nowymi ID i dopiskiem "(import)" w nazwie folderu — nic nie tracisz.

Drzewo katalogów się nie rozwija

Strzałka rozwijania pojawia się tylko jeśli katalog ma zestawy. Pusty katalog ma wyszarzoną kropkę zamiast strzałki. Stan rozwinięcia każdego katalogu jest zapamiętywany w chrome.storage.local.

Nie widzę przycisku Eksport/Import katalogu

Te przyciski są w pasku katalogu (na górze obszaru edycji), obok przycisku "Usuń katalog". Nie mylić z przyciskami w menu Ustawienia, które dotyczą całych ustawień.

AI Helper nie odpowiada

Konflikt z Content Security Policy

JS reguł i akcji jest wykonywany w kontekście strony warstwową strategią odporną na restrykcyjne reguły Content Security Policy. Większość stron — w tym duże serwisy jak Facebook — działa od razu, bez żadnej konfiguracji.

Strony z bardzo restrykcyjnym CSP (niektóre banki, serwisy korporacyjne) mogą blokować wykonanie. Aby JS działał na każdej stronie, włącz dla JustZix opcję „Zezwól na skrypty użytkownika": otwórz chrome://extensions, wejdź w szczegóły JustZix i włącz przełącznik (w starszych przeglądarkach wymagany jest też tryb dewelopera). Gdy strona zablokuje wykonanie, okno JavaScript / Konsola JS pokaże stosowny komunikat.


JustZix — instrukcja