Wstrzykiwanie własnych stylów CSS, kodu JavaScript i przycisków akcji na dowolne strony
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).
https://justzix.com/*. Można włączać/wyłączać cały katalog jednym kliknięciem.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 katalogu | Wzorce zestawu | Zadział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) |
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:
Dostęp przez prawy klik na ikonę wtyczki → "Opcje", lub klik na ikonę → przycisk "Panel edycji".
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.
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:
chrome.storage.local oraz data ostatniego backupu chmurowego.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.
| Element | Działanie |
|---|---|
| Strzałka rozwijania | Rozwija/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ż katalog | Toggle: 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ę zestawu | Otwiera widok pojedynczego zestawu (Rule editor) |
| Checkbox przy katalogu | Włącza/wyłącza cały katalog (kaskada do grup i ich aktywnych zestawów) |
| Checkbox przy grupie | Włącza/wyłącza grupę (kaskada do jej aktywnych zestawów) |
| Checkbox przy zestawie | Niezależnie steruje pojedynczym zestawem |
| Status ●/○ obok katalogu/grupy/zestawu | Aktywny: ● aktywny, ○ nieaktywny (wymuszono wyłączony) |
| C J A U obok zestawu | Etykiety 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 lewej | Kolor katalogu rysowany przez box-shadow inset — nie szarpie pozycji nazwy folderu (foldery z kolorem i bez koloru są zrównane) |
| Uchwyt drag&drop | Złap myszą i przeciągnij aby zmienić kolejność |
expandedFolders, expandedGroups).
Najedź na katalog, grupę lub zestaw — po lewej stronie pojawi się uchwyt drag&drop. Złap myszą i przeciągnij:
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ść.
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.
n / razem.| Skrót | Akcja |
|---|---|
Enter | Wyszukaj (nowe zapytanie) lub przejdź do następnego wyniku (gdy zapytanie bez zmian) |
Shift+Enter | Poprzedni wynik |
Ctrl+Alt+→ / Ctrl+Alt+← | Następny / poprzedni wynik — działa z poziomu edytora i z pola wyszukiwania |
Ctrl+Alt+F | Z edytora kodu przenosi fokus do pola wyszukiwania |
Esc | Czyści pole wyszukiwania |
Wzorzec URL definiuje, na których stronach katalog się aktywuje.
| Wzorzec | Pasuje do |
|---|---|
https://justzix.com/admin | Tylko 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" |
?id=123) i hash (#section), chyba że umieścisz je we wzorcu.
Każdy zestaw ma dwie niezależne flagi:
| Flaga | Znaczenie |
|---|---|
| Aktywny ● | Czy 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łączony ✓ | Aktualny stan: czy zestaw jest teraz wstrzyknięty na strony. |
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.
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.
Aktywny: TAK • Włączony: TAK
Standardowe ustawienie. Włączanie/wyłączanie katalogu steruje też tym zestawem.
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.
| Akcja | Efekt |
|---|---|
| Lewy klik | Toggle wszystkich pasujących katalogów (włącz/wyłącz) |
| Prawy klik | Otwiera panel z listą katalogów i zestawów |
| Przeciągnięcie | Przesunięcie pozycji (zapamiętywane per okno) |
W rozwijanym panelu (prawy klik) możesz:
actionBar.enabled (persistent, propaguje do panelu edycji)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.
Klik ikony JustZix w pasku rozszerzeń Chrome otwiera widget popupu — kompaktowy panel sterowania dla bieżącej karty. Od góry:
actionBar.enabled).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ę).
W edytorze katalogu, grupy lub zestawu znajduje się przycisk „Paski akcji (N)". Klik otwiera modal zarządzania paskami. W modalu:
barId).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).
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:
__float jako pseudo-bar).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ę".
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:
actionBar.enabled.actionBar.enabled = false — bar nie jest w ogóle renderowany, stan synchronizuje się między urządzeniami (sync), widoczny w panelu edycji.barsHidden[barId] = true per okno przeglądarki — bar znika do F5 / zamknięcia okna. Włączenie z popup/floating panel automatycznie czyści ten runtime hide.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ć:
Ctrl+klik = dodaj/odłącz od zaznaczenia; klik w puste pole lub Esc = odznacz wszystko. Shift+przeciągnięcie po pustym polu = zaznaczenie zakresowe (prostokąt).Delete usuwa wszystkie zaznaczone etykiety naraz; prawy klawisz na labelce daje opcję „Usuń etykietę"; jest też przycisk „Usuń" w edytorze labelki. Elementy akcji usuwa się w panelu edycji (należą do reguł).flow): usuwa custom pozycje i rozmiary elementów oraz wszystkie labelki (z potwierdzeniem).Ctrl+Z cofa ostatnią zmianę (przesunięcie, resize, dodanie/edycję/usunięcie labelki, reset). Historia obejmuje bieżącą sesję edycji.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.
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.
Każda akcja ma typ — wybierany dropdownem na początku każdej akcji w karcie zestawu. Dostępnych jest 6 typów:
| Typ | UI | Kiedy odpala kod |
|---|---|---|
| BUTTON | Klikany przycisk z labelem max 6 znaków | klik użytkownika |
| SELECT static | Custom dropdown w stylu paska — opcje konfigurowane w modalu | wybór opcji (value = option.value) |
| SELECT js | Natywny <select> — Twój kod populuje opcje i podpina handler | RAZ przy renderze ($el = <select>) |
| INPUT | Pole tekstowe z placeholderem (single line) | change (Enter lub blur) |
| SLIDER | Suwak <input type="range"> z label + value display | change (puszczenie myszy / Enter), value = liczba |
| TEXTAREA | Pole wielowierszowe — Enter to legit newline (NIE odpala kodu) | change (blur — wyjście z pola) |
| TOGGLE3 | 3-stanowy segmented control (radio-like) — 3 mini-buttony, jeden aktywny | klik 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).
value, $el (DOM element), $action ({ id, label, type, el }); dla TOGGLE3 dodatkowo stateIdx (0-2) i stateLabel.Klik „Opcje (N)" w karcie akcji typu SELECT otwiera modal:
<select>).{ name, value }. name = co widzi użytkownik, value = co trafia do JS jako zmienna value.<option> (js variant)action.id z przyciskiem copy + przykładowy selektor JS.::placeholder nie jest stylowalny inline).min < max.(min+max)/2.change (puszczenie myszy / Tab / Enter). value = wartość liczbowa.\n dla newlinów).change (blur, NIE Enter — Enter w textarea to legit newline). User wychodzi z pola → wartość zapisana i kod odpalony. value = string z newlinami.value). Domyślne labels: OFF / MID / ON.colorText).value (state.value, fallback do state.label), stateIdx (0-2), stateLabel, $el (kontener div).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:
sessionStorage — synchroniczny, F5-safe, per karta.chrome.storage.local.actionMemory[id] — cross-tab, durable.Brak syncu cross-device: memory zostaje lokalnie. Dwa komputery mogą mieć różne wartości (np. inny filtr per użytkownika).
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.
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:
Ctrl+Alt+S i przełącznika w popupie.actionBar.enabled state.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).
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.
| Typ | Kolor | Do czego |
|---|---|---|
| CSS pane | zielony | Textarea CSS wstrzykiwana na żywo jako <style> |
| JS pane | amber | Textarea JS wykonywana na zmianę kodu |
| JS Console | fioletowy | REPL — wpisujesz kod, Ctrl+Enter wykonuje, output pod spodem |
| Output Console | szmaragdowy | Tylko-do-odczytu podgląd logów ze strony (console.* + błędy) |
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.
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").
Pełnoprawna konsola w stronie. Wpisujesz kod w dolne pole, Ctrl+Enter (lub ▶) wykonuje, wynik dopisuje się do obszaru logów powyżej. Funkcje:
console.log/warn/error/info w trakcie wykonania są pokazane w logu (kolorowane wg typu).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.
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.
Okno jest podzielone na 6 zakładek, każda z licznikiem wpisów (badge):
| Zakładka | Zawartość |
|---|---|
| All | Wszystkie wpisy ze wszystkich źródeł, chronologicznie |
| JZconsole | Tylko Twój logger window.JUSTZIX.* |
| Console | Tylko standardowe console.log/info/warn/error/debug ze strony |
| Network | Żądania sieciowe strony (przez chrome.webRequest) |
| Errors | Niezłapane wyjątki i Promise rejections — z rozwijanymi szczegółami |
| DataLayer | Pushe do window.dataLayer (GTM) + żywy podgląd obiektu |
Między zakładkami a polem wyszukiwania jest pasek filtrów, który zmienia się zależnie od wybranej zakładki:
log, info, warn, error, debug. Odznacz poziom → linie znikają z podglądu.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.
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.
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ą.
Okno DataLayer jest podzielone na dwie kolumny:
dataLayer.push(...) w kolejności zdarzeń.window.dataLayer jako indeksowane (0:, 1:, …) rozwijane drzewo JSON — wchodzisz w głąb na zagnieżdżone dane, analogicznie do inspektora obiektu w DevTools. Migawka aktualizuje się po każdym pushu. W nagłówku prawej kolumny są przyciski rozwiń wszystko / zwiń wszystko — działają rekurencyjnie na całym drzewie.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).
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:
window.JUSTZIX — główny, zawsze działawindow.__JUSTZIX__ — alias zawsze dostępnywindow.JZ — alias tylko jeśli strona nie ma własnego window.JZ (niektóre strony, np. Google Ads, zajmują tę nazwę)Po pojawieniu się Output Console w logu zobaczysz powitalną linię informującą który alias jest dostępny na tej stronie.
console.log/warn/error/info/debug(...) ze strony — przechodzą też do normalnej konsoli DevTools (nie blokujemy)window.JUSTZIX.*(...) — Twój dedykowany kanał (nie idzie do DevTools)throw new Error(...)) — pokazane jako czerwone z miejscem błęduPromise.reject(...) bez .catchBłę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.
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.
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).
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.
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 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).
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:
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.
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:
<style> jest natychmiastowa.Tworzenie / zamykanie (toggle):
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.
W menu Ustawienia sidebara pozycja „AI Helper" otwiera modal konfiguracji:
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 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.
AI Helper prowadzi rozmowę według ustalonego workflow:
query_page (selektory, struktura DOM) przed napisaniem kodu.read_temp_pane i read_console sprawdza, czy testowany kod nie zgłasza błędów, zanim pokaże Ci wynik.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ędzie | Działanie |
|---|---|
query_page | Zwraca liczbę dopasowań selektora i HTML do 5 elementów |
list_structure | Zwraca istniejące foldery / grupy / zestawy wraz z ich id |
open_temp_pane | Otwiera tymczasowe okno TEMP (CSS lub JS) |
set_temp_pane_code | Wstawia kod do okna TEMP — służy do testów na żywo |
read_temp_pane | Weryfikuje okno TEMP — dla JS wykonuje kod i zwraca błąd lub sukces |
read_console | Otwiera okno TEMP Output Console i zwraca przechwycone wpisy console strony |
create_folder | Tworzy folder + domyślną grupę (wymaga potwierdzenia) |
create_group | Tworzy grupę w folderze (wymaga potwierdzenia) |
create_rule | Tworzy zestaw z kodem CSS/JS (wymaga potwierdzenia) |
create_bar | Tworzy pasek akcji przypisany do folderu/grupy/zestawu (wymaga potwierdzenia) |
create_action | Tworzy akcję (button/select/input/slider/textarea/toggle3) na pasku (wymaga potwierdzenia) |
request_user_input | Wyś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_all | Zwracają listy istniejących pasków / akcji / okien (CSS/JS/Console/Output) — opcjonalnie filtrowane po parencie |
read_folder / read_group / read_rule / read_bar / read_action | Zwracają pełne dane konkretnej encji (przed planowaną zmianą) |
update_folder / update_group / update_rule / update_bar / update_action | Modyfikują istniejącą encję — wymaga potwierdzenia (z diffem pól) |
create_css_pane / create_js_pane / create_js_console / create_output_console | Tworzą okno persistent na froncie (wymaga potwierdzenia) |
read_*_pane / read_*_console + update_*_pane / update_*_console | Odczyt i zmiana metadanych okien persistent (nazwa, kolor, pozycja, rozmiar, styling) |
read_pane_code / update_pane_code | Odczyt i wstawienie kodu CSS/JS do okna persistent (per karta przeglądarki) — wymaga potwierdzenia |
screenshot_page | Zrzut bieżącego widoku strony jako obraz — interfejs JustZix automatycznie ukrywany; dla modeli vision-capable |
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.
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.
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.
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ót | Akcja |
|---|---|
Ctrl+Alt+G | Utwórz / zamknij TEMP CSS pane |
Ctrl+Alt+H | Utwórz / zamknij TEMP JS pane |
Ctrl+Alt+J | Utwórz / zamknij TEMP JS Console |
Ctrl+Alt+K | Utwórz / zamknij TEMP Output Console |
Ctrl+Alt+I | Otwórz panel edycji (osobne okno), pierwszy aktywny zestaw na tej stronie, zakładka CSS |
Ctrl+Alt+O | jak wyżej, zakładka JS |
Ctrl+Alt+P | jak wyżej, zakładka Akcje |
Ctrl+Alt+\ | Otwórz / zamknij okno AI Helper |
Ctrl+Alt+S | Tryb edycji paska akcji — włącz / wyłącz |
Ctrl+Z | Cofnij ostatnią zmianę (tylko w trybie edycji paska) |
Delete | Usuń zaznaczone labelki (tylko w trybie edycji paska) |
Esc | Odznacz wszystkie elementy (tylko w trybie edycji paska) |
Ctrl+Shift+L | Wyczyść aktywną zakładkę każdej Output Console |
Ctrl+Shift+H | Pomoc szybka — skróty i okna na froncie (działa globalnie) |
| Skrót | Akcja | Okno |
|---|---|---|
Ctrl+Enter | Wykonaj kod / wyślij wiadomość | JS pane, JS Console, AI Helper |
↑ / ↓ | Historia komend | JS Console (input) |
Ctrl+L | Wyczyść output | JS Console |
Esc | Wyczyść pole szukania | Output Console |
| Skrót | Akcja |
|---|---|
Ctrl+Alt+F | Fokus na pole wyszukiwania nad edytorem |
Ctrl+Alt+→ / Ctrl+Alt+← | Następny / poprzedni wynik wyszukiwania |
Enter / Shift+Enter | Wyszukaj / następny / poprzedni wynik (w polu wyszukiwania) |
Ctrl+Alt+I / O / P | Przełącz zakładkę aktywnego zestawu na CSS / JS / Akcje (gdy karta zestawu wyrenderowana) |
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.
Wtyczka oferuje pięć formatów eksportu (pełny, częściowy, katalog, grupa, zestaw) z automatycznym wykrywaniem typu pliku przy imporcie, by uniknąć przypadkowego nadpisania.
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[].
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.
W pasku grupy: Eksport — modal z listą zestawów grupy (checkboxy). Plik: justzix-grupa-<nazwa>-<data>.json, format justzix-group.
W widoku zestawu: Eksport zestawu — od razu pobiera plik (bez modalu). Format justzix-rule, nazwa: justzix-zestaw-<nazwa>-<data>.json.
justzix-full — pełen backup wszystkiegojustzix-full z partial: true — wybrane elementy z głównego eksportujustzix-folder — pojedynczy katalog z drzewem selekcjijustzix-group — grupa + zaznaczone zestawyjustzix-rule — pojedynczy zestawPo wczytaniu pliku/wklejeniu JSON-u wtyczka automatycznie rozpoznaje typ i pokazuje kolorowy panel detekcji:
| Kolor | Znaczenie | Akcja |
|---|---|---|
| Teal (turkusowy) | Prawidłowy pełen backup | Pokazuje liczbę katalogów/zestawów, datę eksportu, ostrzeżenie o nadpisaniu |
| Fioletowy | Częściowy backup (partial: true) | Wybór trybu: Scal z obecnymi lub Zastąp wszystko |
| Pomarańczowy | Niewłaściwy typ pliku w tym modalu | Komunikat naprowadzający na właściwy modal, przycisk Importuj zablokowany |
| Czerwony | Błąd parsowania JSON / nieprawidłowy format | Przycisk Importuj zablokowany |
1 / nadpisz — nadpisz istniejące katalogi (usunie ich grupy i zestawy)2 / kopia (domyślne) — zaimportuj jako kopie z nowymi ID, "(import)" w nazwie folderu, brak utraty istniejących danychW pasku katalogu: Import. Sprawdza konflikty po ID i nazwie:
W pasku grupy: Import — akceptuje 3 formaty:
justzix-group — wstawia wszystkie zestawy grupy z plikujustzix-folder — wstawia wszystkie zestawy ze wszystkich grup folderujustzix-rule — wstawia jeden zestawWszystkie zestawy z pliku trafiają do bieżącej grupy z nowymi ID (operacja zawsze typu "dodaj kopię" — brak konfliktów).
W widoku zestawu: Import zestawu — akceptuje tylko justzix-rule. Prompt z 3 opcjami:
1 / zastap — zastąp zawartość obecnego zestawu (id i groupId zachowane)2 / kopia (domyślne) — dodaj jako nowy zestaw obok obecnego, w tej samej grupie, z dopiskiem "(import)"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.
Przy logowaniu wtyczka porównuje dane lokalne z tymi w chmurze:
| Wybór | Co robi |
|---|---|
| Użyj danych z chmury | Czyści lokalną bibliotekę i odtwarza stan konta z serwera |
| Wyślij moje lokalne | Lokalne 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.
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.
Zakładka Status modala synchronizacji pokazuje stan konta i daje przyciski akcji:
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.
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.
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.
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.
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).
Przekroczenie limitu = błąd z polskim komunikatem. Odwołaj nieużywane linki w panelu Moje share.
Przycisk „Udostępnij URL" w czterech punktach wejścia, obok „Pobierz plik":
justzix-full)justzix-folder)justzix-group)justzix-rule)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:
https://www.justzix.com/s/JZS-... — do wysłania komuś bez wtyczki (pokaże stronę landing)JZS-XXXX-XXXX-XXXX-XXXX — do wklejenia w wtyczce odbiorcy w „Importuj z URL"Każdy ma swój przycisk „Skopiuj". Pokazany jest też czas wygaśnięcia w lokalnej strefie czasowej.
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:
X katalogów · Y grup · Z zestawów · N linii JS · A KBOdwoł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.
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):
| Typ | Co się dzieje |
|---|---|
justzix-rule | Tworzy nowy katalog + grupa „Domyślna" + zaimportowany zestaw |
justzix-group | Tworzy nowy katalog + zaimportowana grupa + zestawy |
justzix-folder | Dodaje jako nowy katalog top-level |
justzix-full | Merge: 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łąd | Komunikat |
|---|---|
| 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ł.
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.
| Wywołanie | Co robi |
|---|---|
JZ.click(labelOrId) | Klika programatycznie. Semantyka per typ akcji: BUTTON → el.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 / SLIDER → el.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')). TOGGLE3 — el.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ś). |
// === 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
| Wywołanie | Co 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). |
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_...').
W polu „Kod JS" akcji masz automatycznie dostępne zmienne — wstrzykiwane jako const przez background service worker przed wykonaniem:
| Zmienna | Co zawiera | Kiedy dostępna |
|---|---|---|
$el | DOM element tej akcji (input / select / button / textarea / kontener toggle3) | zawsze gdy action.id istnieje |
$action | { id, label, type, el } | zawsze |
value | Aktualna 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. |
stateIdx | Integer 0-2 — indeks aktywnego stanu (od którego stanu zaczął się klik). | tylko TOGGLE3 |
stateLabel | String — label aktywnego stanu (max 5 znaków). | tylko TOGGLE3 |
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.
visible: true, pasek jest widoczny w drzewie + URL strony pasuje do reguł).JZ.click() zwróci false, JZ.action() zwróci null.JZ.click().// 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)
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 });
// 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'));
}
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 akcji | Kontener | Selektor 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.
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().
Pole "Szukaj" filtruje drzewo katalogów. Logika dopasowania:
Match jest case-insensitive, podświetlanie na żółto pokazuje miejsce dopasowania.
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.
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ę.
Inline po prawej stronie pola URL pojawia się informacja "Pasuje do X otwartych kart" lub ostrzeżenie. Łapie literówki natychmiast.
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.
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.
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.
Każdy przycisk akcji liczy ile razy został kliknięty. Pomaga zobaczyć które są naprawdę używane.
Pod edytorem CSS wyświetla się pasek z listą problemów składniowych:
/* ... */})} (z numerem linii)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).
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.
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.
Wskaźnik zużycia pamięci w menu Ustawienia sidebara (np. 1.2 MB / 10 MB). Czerwony powyżej 80%.
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.
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.
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.
chrome://extensions/ (Edge: edge://extensions/) znajdź wtyczkę i kliknij ikonę odświeżania na kafelkuBuild 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.
"key" w manifeście (Chromium) / gecko.id (Firefox)/* 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;
}
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.
/* 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;
}
/* 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;
}
/* Często strony mają sztywne max-width 1200px - wymuś szerokość */
.container, .main-content, main {
max-width: 95% !important;
width: 95% !important;
}
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.
// 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';
});
// 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.
// 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);
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();
}
});
// 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);
// 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);
}
});
// 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);
});
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 }));
});
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 }));
}
});
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');
Skrót: COPY Kolor: fioletowy
navigator.clipboard.writeText(location.href).then(() => {
console.log('Skopiowano:', location.href);
});
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');
}
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.');
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));
Każdy projekt ma własny katalog z własnym wzorcem URL. Możesz mieć katalogi:
https://dev.justzix.com/* z czerwonym bannerem "DEV"Na prawym panelu prywatne katalogi można szybko włączać/wyłączać. Eksport pojedynczego katalogu pozwala podzielić się konfiguracją z zespołem.
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.
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.
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.
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.
Wzorzec *://*.justzix.com/admin/* i CSS poprawiający tabele, listy, formularze. Plus akcja "Filtr testowy" automatycznie ustawiająca filtry dla typowego workflow.
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');
[JustZix] JS error!important lub bardziej specyficznych selektorów.css-1abcd które się zmieniają. Użyj atrybutów ([data-testid]) lub stabilnych selektorówWtyczka ma stały klucz w manifeście — kolejne update'y zachowują dane. Jeśli mimo to dane zniknęły:
chrome://extensions/ użyj przycisku odświeżania, nie usuwaj i nie instaluj ponownieTo 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.
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".
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.
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.
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ń.
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