Внедрение собственных стилей CSS, кода JavaScript и кнопок действий на любые страницы
JustZix позволяет автоматически внедрять собственный CSS и JavaScript на выбранные страницы, а также определять кнопки действий (ярлыки, выполняющие фрагменты кода по запросу).
https://justzix.com/*. Весь каталог можно включить/выключить одним кликом.Каждый набор и каждая группа может получить собственный список дополнительных шаблонов URL (chip-input). Когда список пуст — элемент работает везде, где совпадает шаблон каталога. Если задать, например, https://justzix.com/admin/* — элемент сработает только на подстраницах админки.
| Шаблон каталога | Шаблоны набора | Сработает на |
|---|---|---|
https://justzix.com/* | (пусто) | весь домен justzix.com |
https://justzix.com/* | https://justzix.com/admin/* | только раздел /admin/ |
https://justzix.com/* | https://justzix.com/produkty/*https://justzix.com/koszyk | только подстраницы товаров + корзина |
*://localhost:*/* | *://localhost:3000/* | только порт 3000 (dev) |
Для новых пользователей в JustZix есть встроенное интерактивное обучение, которое шаг за шагом проводит вас через создание полного решения — от каталога, через группу и набор правил, до кода CSS/JS и кнопки действия. Подсказки появляются в виде всплывающих окошек рядом с очередными элементами панели.
Как его запустить:
В окне «Центр обучения» вы выбираете урок и нажимаете Начать. Во время обучения:
Доступ через правый клик на иконку расширения → "Параметры", либо клик на иконку → кнопка "Панель редактирования".
Маленькая круглая кнопка появляется автоматически на страницах, соответствующих любому каталогу. По умолчанию отображает надпись ZIX, но у каждого каталога может быть своя метка.
Метка каталога: в панели каталога, в крайнем левом углу (рядом с color picker) есть текстовое поле для метки кнопки. Жёсткие ограничения: макс. 3 символа, всегда UPPERCASE (преобразование в заглавные происходит сразу при вводе). Поле принимает буквы и цифры — примеры: ZIX, QA, DEV, ADM, X. При нескольких подходящих каталогах берётся метка первого, у которого она задана; остальные пропускаются (пустое поле = откат к ZIX).
Состояние цветом (брендовая палитра):
Цвет каталога: если у каталога задать color picker, плавающая кнопка на подходящих страницах примет этот цвет. Состояния "mixed" и "off" автоматически модулируют насыщенность. При нескольких подходящих каталогах берётся цвет первого, у которого он задан.
При входе в панель редактирования расширение открывает Панель — главную страницу со сводкой библиотеки и быстрыми ссылками. Раньше панель автоматически выделяла первый каталог из списка; теперь вместо этого вы видите обзор.
Панель доступна через клик на логотип в сайдбаре и через иконку «дом» на полосе breadcrumb каждого редактора (каталога, группы, набора). Сам заголовок Панели тоже имеет иконку «дом» — её клик обновляет данные (перезагружает библиотеку из storage и рендерит Панель заново).
Панель имеет компоновку из фиксированных рядов карточек:
chrome.storage.local и дата последнего облачного бэкапа.Карточки «Последние примеры» и «Из блога» загружают содержимое с сайта проекта; когда endpoint недоступен (например, offline), обе карточки скрываются. Версия расширения проверяется заново при каждом входе на панель.
Левая панель в режиме редактирования отображает каталоги в иерархии — каждый каталог можно раскрыть, чтобы увидеть его наборы и перейти к редактированию конкретного.
| Элемент | Действие |
|---|---|
| Стрелка раскрытия | Раскрывает/сворачивает список наборов или групп (запоминается между сессиями) |
| Клик на название каталога (свёрнутого) | Выделяет каталог, открывает Folder editor и раскрывает его группы/наборы |
| Клик на уже выделенный каталог | Переключение: сворачивает (следующий клик снова раскрывает) — аналогично для группы |
| Клик на название группы (свёрнутой) | Выделяет группу, открывает Group editor и раскрывает её наборы |
| Клик на название набора | Открывает вид одного набора (Rule editor) |
| Чекбокс у каталога | Включает/выключает весь каталог (каскад к группам и их активным наборам) |
| Чекбокс у группы | Включает/выключает группу (каскад к её активным наборам) |
| Чекбокс у набора | Независимо управляет одним набором |
| Статус ●/○ рядом с каталогом/группой/набором | Активный: ● активен, ○ неактивен (принудительно выключен) |
| C J A U рядом с набором | Метки содержимого: C = есть CSS, J = есть JavaScript, A = есть действия, U = есть собственные шаблоны URL. Появляются только когда соответствующее поле не пустое. |
| Цветная полоса слева | Цвет каталога рисуется через box-shadow inset — не сдвигает положение названия каталога (каталоги с цветом и без него выровнены) |
| Маркер drag&drop | Захватите мышью и перетащите, чтобы изменить порядок |
expandedFolders, expandedGroups).
Наведите на каталог, группу или набор — слева появится маркер drag&drop. Захватите мышью и перетащите:
Вертикальная полоса между сайдбаром и редактором прячет левую панель — удобно, когда нужно больше места для редактора. Состояние запоминается между сессиями. После показа/скрытия CodeMirror автоматически обновляет свою ширину.
Под каждым редактором (CSS, JS, код действия) есть горизонтальная полоса с маркером для перетаскивания по вертикали. Захватите мышью и потяните вниз, чтобы увеличить редактор. Мин. высота 80px, макс. не ограничена — страница прокручивается естественно вместе с содержимым.
Над каждым редактором кода CodeMirror — CSS и JavaScript в карточке набора, а также «Код JS» в редакторе действия — расположена панель поиска: текстовое поле и кнопка с иконкой лупы.
n / всего.| Клавиша | Действие |
|---|---|
Enter | Искать (новый запрос) или перейти к следующему результату (когда запрос без изменений) |
Shift+Enter | Предыдущий результат |
Ctrl+Alt+→ / Ctrl+Alt+← | Следующий / предыдущий результат — работает из редактора и из поля поиска |
Ctrl+Alt+F | Из редактора кода переносит фокус в поле поиска |
Esc | Очищает поле поиска |
Шаблон URL определяет, на каких страницах активируется каталог.
| Шаблон | Совпадает с |
|---|---|
https://justzix.com/admin | Только этот точный URL |
https://justzix.com/* | Все страницы на justzix.com |
https://*.justzix.com/* | Все поддомены и страницы |
*://localhost:*/* | Все локальные приложения |
https://example.com/admin/* | Только раздел /admin/ и подстраницы |
*example* | Любой URL, содержащий "example" |
?id=123) и hash (#section), если только вы не поместите их в шаблон.
У каждого набора два независимых флага:
| Флаг | Значение |
|---|---|
| Активный ● | Управляется ли этот набор переключателем каталога и группы (оба уровня каскадируют к active rules). Включение каталога или группы включает все активные наборы внутри. |
| Включён ✓ | Текущее состояние: внедрён ли набор сейчас на страницы. |
Переключатель каталога → меняет enabled всех active rules в его группах
Переключатель группы → меняет enabled всех active rules этой группы
Переключатель набора → меняет только enabled этого набора
Правила с Активный: НЕТ (значок ○) пропускаются при каскадах — вы управляете ими только вручную, независимо от состояния каталога и группы.
Активный: НЕТ • Включён: управляется вручную
Набор не реагирует на включение всего каталога. Вы управляете им только вручную. Идеально для экспериментальных модификаций, которые не хотите включать массово.
Активный: ДА • Включён: ДА
Стандартная настройка. Включение/выключение каталога управляет и этим набором.
Активный: ДА • Включён: НЕТ
Набор "подключён" к каталогу, но временно выключен. Следующий клик главного переключателя каталога снова его активирует.
| Действие | Эффект |
|---|---|
| Левый клик | Переключение всех подходящих каталогов (вкл/выкл) |
| Правый клик | Открывает панель со списком каталогов и наборов |
| Перетаскивание | Сдвиг позиции (запоминается на окно) |
В раскрывающейся панели (правый клик) можно:
actionBar.enabled (persistent, распространяется в панель редактирования)Панель показывает только активные наборы (●) — независимые (○) скрыты для краткости. Когда у каталога только одна группа с названием "Domyślna", заголовок группы пропускается — видны только наборы.
Клик по иконке JustZix в панели расширений Chrome открывает виджет попапа — компактную панель управления для текущей вкладки. Сверху вниз:
actionBar.enabled).В одном рабочем пространстве можно иметь несколько панелей действий — каждая со своим названием, ориентацией, цветом фона, собственным набором кнопок и независимой позицией на каждое окно браузера. Панель может быть привязана к каталогу, группе или отдельному набору (это определяет видимость и каскад).
В редакторе каталога, группы или набора есть кнопка «Панели действий (N)». Клик открывает модал управления панелями. В модале:
barId).У каждого действия на вкладке «Действия» карточки набора есть выпадающий список «Панель действий» — выбираете целевую панель из списка видимых для этого набора (собственные панели набора + панели группы + панели каталога).
Во время перетаскивания панели расширение обнаруживает края соседних панелей и плавающей кнопки на расстоянии ≤ 12 px. Появляется sticky-индикатор, и после отпускания панели объединяются в группу соединений. Затем:
__float как псевдо-панель).Правый клик на маркер перетаскивания панели → контекстное меню:
В режиме редактирования панели это меню приглушено; правый клик на метке даёт тогда опцию «Удалить метку».
Для постоянного включения/выключения панелей действий (без F5) расширение предлагает три точки входа, все привязанные к одному и тому же actionBar.enabled в storage — изменение из одного места распространяется в панель редактирования и остальные UI:
actionBar.enabled.actionBar.enabled = false — панель вообще не рендерится, состояние синхронизируется между устройствами (sync), видно в панели редактирования.barsHidden[barId] = true на окно браузера — панель исчезает до F5 / закрытия окна. Включение из popup/floating panel автоматически очищает это runtime-скрытие.Режим редактирования панели действий включается тремя способами: горячей клавишей Ctrl+Alt+S (работает из любого места страницы), переключателем в виджете попапа расширения, и из контекстного меню Chrome (правый клик → «Режим редактирования панели действий»). Вверху экрана появляется информационная полоса; повторное использование любого из переключателей выходит из режима.
В режиме редактирования обычная работа элементов приостановлена (клик не запускает код, поля не принимают фокус) — вместо этого элементы можно располагать и масштабировать:
Ctrl+клик = добавить/убрать из выделения; клик в пустое место или Esc = снять всё выделение. Shift+перетаскивание по пустому месту = выделение диапазона (прямоугольник).Delete удаляет все выделенные метки сразу; правый клик на метке даёт опцию «Удалить метку»; есть также кнопка «Удалить» в редакторе метки. Элементы действий удаляются в панели редактирования (они принадлежат правилам).flow): удаляет custom-позиции и размеры элементов, а также все метки (с подтверждением).Ctrl+Z отменяет последнее изменение (перемещение, resize, добавление/правку/удаление метки, сброс). История охватывает текущую сессию редактирования.Режим редактирования «жёсткий»: перемещение и resize притягиваются к сетке 8 px, элемент нельзя вынести за пределы панели или положить на другой — при коллизии оба элемента (перемещаемый и тот, что под ним) получают красную рамку, а после отпускания элемент возвращается на прежнее место. Панель нельзя уменьшить так, чтобы элемент оказался снаружи; когда новый элемент или метка не помещается в панель, холст панели автоматически увеличивается. Правый клик мыши на панели в режиме редактирования не показывает меню «скрыть/отсоединить панель».
Режимы компоновки панели: панель стартует в режиме flow (классический flexbox — элементы один за другим, вертикально или горизонтально). Первое перемещение или масштабирование элемента конвертирует панель в режим custom (холст со свободным позиционированием) — визуально без изменений, потому что текущая компоновка снимается как стартовая точка.
custom (bar.layoutMode, bar.size, action.layout, action.size) сохраняются постоянно и синхронизируются между устройствами — в отличие от позиции «плавания» панели на странице, которая остаётся на окно браузера.
У каждого действия есть тип — выбирается выпадающим списком в начале каждого действия в карточке набора. Доступно 6 типов:
| Тип | UI | Когда запускает код |
|---|---|---|
| BUTTON | Кликабельная кнопка с меткой макс. 6 символов | клик пользователя |
| SELECT static | Custom dropdown в стиле панели — опции настраиваются в модале | выбор опции (value = option.value) |
| SELECT js | Нативный <select> — ваш код заполняет опции и подключает handler | ОДИН РАЗ при рендере ($el = <select>) |
| INPUT | Текстовое поле с placeholder (одна строка) | change (Enter или blur) |
| SLIDER | Ползунок <input type="range"> с меткой + value display | change (отпускание мыши / Enter), value = число |
| TEXTAREA | Многострочное поле — Enter это легитимный перенос строки (НЕ запускает код) | change (blur — выход из поля) |
| TOGGLE3 | 3-позиционный segmented control (radio-like) — 3 мини-кнопки, одна активна | клик на неактивное состояние, value = state.value активного, плюс stateIdx и stateLabel в scope |
Статические текстовые метки не являются типом действия — их добавляют прямо на панель в режиме редактирования (см. «Режим редактирования панели» → метки).
value, $el (DOM-элемент), $action ({ id, label, type, el }); для TOGGLE3 дополнительно stateIdx (0-2) и stateLabel.Клик «Опции (N)» в карточке действия типа SELECT открывает модал:
<select>).{ name, value }. name = что видит пользователь, value = что попадает в JS как переменная value.<option> (js variant)action.id с кнопкой copy + пример JS-селектора.::placeholder не стилизуется inline).min < max.(min+max)/2.change (отпускание мыши / Tab / Enter). value = числовое значение.\n для переносов строк).change (blur, НЕ Enter — Enter в textarea это легитимный перенос строки). Пользователь выходит из поля → значение сохранено и код запущен. value = строка с переносами строк.value). Метки по умолчанию: OFF / MID / ON.colorText).value (state.value, откат к state.label), stateIdx (0-2), stateLabel, $el (контейнер div).Выбор / значение / позиция ползунка / содержимое textarea / активное состояние toggle3 автоматически запоминаются на действие. После F5 значение возвращается; после закрытия вкладки и повторного её открытия (на странице, соответствующей правилу) — тоже. Singleton на action.id — одно значение, независимое от конкретного URL.
Формат значения в memory по типам:
Storage:
sessionStorage — синхронный, F5-safe, на вкладку.chrome.storage.local.actionMemory[id] — cross-tab, durable.Нет синхронизации cross-device: memory остаётся локально. Два компьютера могут иметь разные значения (например, разный фильтр на каждого пользователя).
sessionStorage доступен для скриптов страницы (same origin). Для чувствительных данных не используйте INPUT — вместо этого пишите значение прямо в поле «Код JS» набора.
У каждого действия есть неизменный action.id (формат a_<base36>_<random>). В карточке набора рядом с каждым действием есть значок с номером строки — клик копирует полный ID в буфер обмена, tooltip показывает полный ID.
В user-JS обращайтесь через data-jz-action-id:
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');
el.value = 'новое значение';
el.dispatchEvent(new Event('change'));
Или через window.JZ helpers — см. Программный вызов действий из JS.
Правый клик на любой странице → JustZix:
Ctrl+Alt+S и переключателем в попапе.actionBar.enabled state.Подменю окон перестраиваются по: tabs.onActivated, tabs.onUpdated (URL change), и storage.onChanged для folders/groups/rules/actionBars/cssPanes/jsPanes/jsConsoles/outputConsoles/floatingHidden. TEMP-подменю статично (всегда 4 пункта).
Расширение предлагает четыре типа плавающих окон, внедряемых на страницы, наряду с панелями действий. Каждое окно привязано к каталогу, группе или набору (наследует видимость каскадно, как панели действий) и появляется на страницах, совпадающих по URL.
Управление: в редакторе каталога / группы / набора найдёте кнопку «Окна ▾ (N)». Клик раскрывает меню с 4 типами — выбираете тип, открывается модал со списком окон этого уровня (плюс окна, унаследованные с уровней выше). Добавляете, называете, окрашиваете, удаляете.
| Тип | Цвет | Для чего |
|---|---|---|
| CSS pane | зелёный | Textarea CSS, внедряемый на лету как <style> |
| JS pane | amber | Textarea JS, выполняемый при изменении кода |
| JS Console | фиолетовый | REPL — вводите код, Ctrl+Enter выполняет, output снизу |
| Output Console | изумрудный | Только для чтения — просмотр логов со страницы (console.* + ошибки) |
Плавающее окно с текстовым полем для CSS. Каждое изменение (после короткой паузы) обновляет внедрённый <style> — вы видите эффект на лету. Содержимое запоминается на вкладку браузера (переживает F5, исчезает с закрытием вкладки). Идеально для быстрого тестирования CSS без сохранения в правило.
Текстовое поле для JavaScript, выполняемого в контексте страницы. Код запускается при изменении (с задержкой) либо вручную кнопкой ▶ Run / горячей клавишей Ctrl+Enter. Ошибки выполнения показываются в красной полосе под кодом. Когда код изменён с момента последнего запуска, кнопка Run светится жёлтым (состояние «dirty»).
Полноценная консоль на странице. Вводите код в нижнее поле, Ctrl+Enter (или ▶) выполняет, результат дописывается в область логов выше. Функции:
console.log/warn/error/info во время выполнения показываются в логе (раскрашены по типу).Ввод, output и история запоминаются на вкладку. Консоль выполняет код в MAIN world страницы — у вас есть доступ ко всем переменным и функциям страницы.
Только для чтения просмотр логов — автоматически перехватывает всё, что происходит на странице: console.log/warn/error/info/debug, непойманные исключения, необработанные Promise rejections, сетевой трафик и push в dataLayer, а также ваш собственный логгер window.JUSTZIX.*. В отличие от JS Console (где вы сами вводите код) — здесь логи текут сами.
Окно разделено на 6 вкладок, каждая со счётчиком записей (badge):
| Вкладка | Содержимое |
|---|---|
| All | Все записи из всех источников, хронологически |
| JZconsole | Только ваш логгер window.JUSTZIX.* |
| Console | Только стандартные console.log/info/warn/error/debug со страницы |
| Network | Сетевые запросы страницы (через chrome.webRequest) |
| Errors | Непойманные исключения и Promise rejections — с раскрываемыми деталями |
| DataLayer | Push в window.dataLayer (GTM) + живой просмотр объекта |
Между вкладками и полем поиска есть панель фильтров, которая меняется в зависимости от выбранной вкладки:
log, info, warn, error, debug. Снимите уровень → строки исчезают из просмотра.Под панелью фильтров есть постоянно видимое поле поиска. Фильтрует записи активной вкладки на лету (совпадение фрагмента, без учёта регистра). Esc очищает поле.
Записи console.* по умолчанию свёрнуты — показывают сокращённый просмотр (например, [PickupMap][2026-05-16T15:25Z] AUTO_SELECTION_SKIPPED: {reason: 'Lower priority source', …}). Клик раскрывает полные аргументы (объекты/массивы как раскрываемое дерево JSON), аналогично консоли DevTools.
Network перехватывает запросы через chrome.webRequest (разрешение webRequest в манифесте). Каждая запись показывает в том числе метод, URL, статус, тип ресурса, размер, длительность, удалённый адрес (Remote address) и инициатора (Initiator). Буфер запросов поддерживается в фоне, поэтому записи до открытия окна тоже появятся.
Окно DataLayer разделено на две колонки:
dataLayer.push(...) в порядке событий.window.dataLayer как индексированное (0:, 1:, …) раскрываемое дерево JSON — заходите вглубь во вложенные данные, аналогично инспектору объекта в DevTools. Снимок обновляется после каждого push. В заголовке правой колонки есть кнопки раскрыть всё / свернуть всё — работают рекурсивно по всему дереву.Клики по собственному UI JustZix (раскрытие узлов дерева, кнопки окна) не попадают в эту вкладку. Если бы страница собирала события click (например, GTM auto-event), клик по окну генерировал бы push в dataLayer и сбрасывал бы раскрытие дерева — расширение распознаёт такие push и не сообщает о них (реальный window.dataLayer страницы остаётся нетронутым).
Output Console предоставляет глобальный API для логирования из вашего кода (JS pane, действия, код страницы):
JUSTZIX.log('обычный лог');
JUSTZIX.warn('предупреждение');
JUSTZIX.error(new Error('ошибка')); // покажет stack trace
JUSTZIX.info({ obj: 1, arr: [2,3] });
JUSTZIX.debug('детали'); // по умолчанию скрыто (фильтр)
Доступные алиасы:
window.JUSTZIX — основной, всегда работаетwindow.__JUSTZIX__ — алиас, всегда доступенwindow.JZ — алиас только если у страницы нет собственного window.JZ (некоторые страницы, например Google Ads, занимают это имя)После появления Output Console в логе вы увидите приветственную строку, сообщающую, какой алиас доступен на этой странице.
console.log/warn/error/info/debug(...) со страницы — проходят также в обычную консоль DevTools (мы не блокируем)window.JUSTZIX.*(...) — ваш выделенный канал (не идёт в DevTools)throw new Error(...)) — показаны красным с местом ошибкиPromise.reject(...) без .catchОшибки запросов fetch/XHR не попадают на вкладку Errors (это не исключения JS) — вы найдёте их на вкладке Network по статусу 4xx/5xx. Мы не ловим нарушения CSP и внутренние предупреждения Chrome.
Ctrl+Shift+H открывает перемещаемое окно быстрой справки — руководство по работе с JustZix на странице: глобальные сочетания клавиш, сочетания внутри окон, Output Console, управление окнами мышью, режим редактирования панели и логирование в Output Console. Работает на любой странице. Окно перетаскивается за заголовок; Esc / клик вне / × / повторный Ctrl+Shift+H закрывает.
Цвета: в модале управления (панель редактирования) у каждого окна есть color picker — точка заголовка, фон и текст заголовка, фон и текст body, цвет кнопок действий.
Шрифт и размер: правый клик на полосу заголовка окна → меню с выбором шрифта (Consolas, Menlo, Monaco, Courier New и другие monospace) и размера (10–24 px).
Каждое окно перетаскиваете за полосу заголовка. При приближении края к другому окну / панели действий / плавающей кнопке (≤ 12 px) появляется магнитное притяжение — окна склеиваются в группу. Перетаскивание склеенной группы перемещает все элементы вместе. Позиции запоминаются на окно браузера.
У каждого окна 8 маркеров resize: 4 в углах (изменение ширины и высоты сразу) и 4 на краях (изменение только одной оси). Перетаскиваемый маркер удерживает противоположный край на месте. Диапазон: ширина 180–1200 px, высота 120–900 px. Новый размер (pane.size) сохраняется — для постоянных окон синхронизируется между устройствами, для окон TEMP — на вкладку.
Прокрутка колёсиком мыши внутри окна прокручивает только содержимое этого окна — страница под ним не прокручивается. Это касается и случая, когда область окна достигает конца прокрутки или когда курсор находится над непрокручиваемым фрагментом (заголовок, панель фильтра).
У каждого окна (как временного TEMP, так и постоянного) в правом углу заголовка есть кнопка × для закрытия. TEMP скрываются (открой снова из контекстного меню страницы или горячей клавишей), постоянные — отключаются (включить чекбоксом в попапе). Двойной клик по полосе заголовка:
Когда край окна приближается к другому окну JustZix (порог 12 px), появляется красная кромка на стороне склейки (на обоих окнах). Отпускание курсора в этой позиции выполняет snap — окна затем перемещаются группой. Все окна расширения участвуют в этом механизме: панели действий, FAB, постоянные панели (CSS/JS/Console/Output), TEMP и AI Helper.
Вы можете создать временное окно на любой странице — даже на такой, для которой у вас нет ни одного каталога. TEMP panes — это быстрый ad-hoc инструмент: тестируете CSS/JS на чужой странице без настройки правил.
Особенности TEMP panes:
<style> обновляется мгновенно.Создание / закрытие (переключение):
AI Helper — это встроенный в расширение ИИ-ассистент, который помогает подготовить и внедрить решение CSS/JS под конкретную задачу на текущей странице. Модель может исследовать страницу, тестировать код на лету в окнах TEMP и — после вашего согласия — создать готовый каталог, группу и набор.
В меню Настройки сайдбара пункт «AI Helper» открывает модал настройки:
chrome.storage.local). Ключ попадает на другие устройства только, когда вы отметите у него чекбокс «синхронизировать» — тогда он синхронизируется через облако JustZix (тот же канал, которым расширение синхронизирует каталоги, группы и наборы). Ключи без отметки никогда не покидают устройство. Вызовы API идут через service worker расширения, поэтому ключ не попадает в контекст страницы.
Окно AI Helper — это плавающее окно (на вкладку, как окна TEMP — перетаскиваемое, масштабируемое 8 маркерами, крестик закрытия, один экземпляр). Открываете / закрываете его:
В окне: выбор провайдера (когда у вас больше одного ключа) и модели (список загружается на лету), история разговора, кнопка очистки разговора и текстовое поле (отправить кнопкой или Ctrl+Enter). Модель автоматически получает контекст текущей страницы — URL, заголовок и фрагмент HTML.
AI Helper ведёт разговор по установленному workflow:
query_page (селекторы, структура DOM) перед написанием кода.read_temp_pane и read_console проверяет, не выдаёт ли тестируемый код ошибок, прежде чем показать вам результат.Модель использует инструменты через простой текстовый протокол (блок @@JZ_TOOL@@ … @@END@@), работающий одинаково для OpenAI, Anthropic и Gemini. Вызовы инструментов и их результаты показываются в окне как отдельные «чипы». Доступные инструменты:
| Инструмент | Действие |
|---|---|
query_page | Возвращает число совпадений селектора и HTML до 5 элементов |
list_structure | Возвращает существующие каталоги / группы / наборы вместе с их id |
open_temp_pane | Открывает временное окно TEMP (CSS или JS) |
set_temp_pane_code | Вставляет код в окно TEMP — служит для тестов на лету |
read_temp_pane | Проверяет окно TEMP — для JS выполняет код и возвращает ошибку или успех |
read_console | Открывает окно TEMP Output Console и возвращает перехваченные записи console страницы |
create_folder | Создаёт каталог + группу по умолчанию (требует подтверждения) |
create_group | Создаёт группу в каталоге (требует подтверждения) |
create_rule | Создаёт набор с кодом CSS/JS (требует подтверждения) |
create_bar | Создаёт панель действий, привязанную к каталогу/группе/набору (требует подтверждения) |
create_action | Создаёт действие (button/select/input/slider/textarea/toggle3) на панели (требует подтверждения) |
request_user_input | Показывает пользователю встроенную форму в окне чата (поля текст / число / цвет / select / чекбокс) и ждёт ответа |
list_bars / list_actions / list_panes / list_all | Возвращают списки существующих панелей действий / действий / окон (CSS/JS/Console/Output) — опционально с фильтром по родителю |
read_folder / read_group / read_rule / read_bar / read_action | Возвращают полные данные конкретной сущности (перед планируемым изменением) |
update_folder / update_group / update_rule / update_bar / update_action | Изменяют существующую сущность — требует подтверждения (с диффом полей) |
create_css_pane / create_js_pane / create_js_console / create_output_console | Создают постоянное окно на странице (требует подтверждения) |
read_*_pane / read_*_console + update_*_pane / update_*_console | Чтение и изменение метаданных постоянных окон (имя, цвет, позиция, размер, стилизация) |
read_pane_code / update_pane_code | Чтение и вставка кода CSS/JS в постоянное окно (на вкладку браузера) — требует подтверждения |
screenshot_page | Снимок текущего вида страницы в виде изображения — интерфейс JustZix автоматически скрывается; для моделей с поддержкой vision |
read_temp_pane + read_console), запрашивать у вас данные через встроенную форму (request_user_input) и делать скриншоты страницы (screenshot_page) как изображения, прикрепляемые к следующему запросу.
Правый клик на полосе заголовка окна AI Helper открывает меню с опциями «На передний план» / «На задний план» (изменение порядка окон JustZix при их наложении), «Отсоединить от: X» (когда AI Helper склеен с другим окном) и «Внешний вид…». Панель «Внешний вид…» позволяет отдельно стилизовать четыре роли в беседе: ваши сообщения, ответы ИИ, результаты инструментов, встроенные формы — каждая со своим шрифтом, размером, цветом текста и фона. Значения сохраняются для каждого устройства.
Окно AI Helper участвует в том же механизме склейки, что и панели действий, постоянные окна (CSS / JS / Console / Output) и окна TEMP. Перетаскивание края рядом с другим окном JustZix (порог 12 px) → магнитное притяжение, красная кромка указывает сторону склейки на обоих окнах. Склеенные окна перемещаются группой.
Когда окна накладываются, опции «На передний план» / «На задний план» в контекстном меню каждого окна (правый клик на заголовке) делают одноразовый скачок — окно проходит над / под всеми перекрывающимися соседями, не нужно кликать многократно.
Инструмент screenshot_page делает снимок текущего вида страницы и отправляет его модели как изображение. Весь интерфейс JustZix автоматически скрывается перед снимком (FAB, панели действий, AI Helper, постоянные панели, TEMP). Буфер из 3 последних снимков, прикрепляемых однократно к следующему запросу (после отправки — удаляются из буфера, чтобы экономить токены). Требуется vision-модель (например, gpt-4o, claude-3+/4, gemini-1.5+/2). Под чипом результата в чате отображается миниатюра — клик открывает полноэкранный просмотр.
| Клавиша | Действие |
|---|---|
Ctrl+Alt+G | Создать / закрыть TEMP CSS pane |
Ctrl+Alt+H | Создать / закрыть TEMP JS pane |
Ctrl+Alt+J | Создать / закрыть TEMP JS Console |
Ctrl+Alt+K | Создать / закрыть TEMP Output Console |
Ctrl+Alt+I | Открыть панель редактирования (отдельное окно), первый активный набор на этой странице, вкладка CSS |
Ctrl+Alt+O | Как выше, вкладка JS |
Ctrl+Alt+P | Как выше, вкладка Действия |
Ctrl+Alt+\ | Открыть / закрыть окно AI Helper |
Ctrl+Alt+S | Режим редактирования панели действий — вкл / выкл |
Ctrl+Z | Отменить последнее изменение (только в режиме редактирования панели) |
Delete | Удалить выделенные метки (только в режиме редактирования панели) |
Esc | Снять выделение всех элементов (только в режиме редактирования панели) |
Ctrl+Shift+L | Очистить активную вкладку каждой Output Console |
Ctrl+Shift+H | Быстрая справка — сочетания клавиш и окна на странице (везде) |
| Клавиша | Действие | Окно |
|---|---|---|
Ctrl+Enter | Выполнить код / отправить сообщение | JS pane, JS Console, AI Helper |
↑ / ↓ | История команд | JS Console (ввод) |
Ctrl+L | Очистить output | JS Console |
Esc | Очистить поле поиска | Output Console |
| Клавиша | Действие |
|---|---|
Ctrl+Alt+F | Фокус на поле поиска над редактором |
Ctrl+Alt+→ / Ctrl+Alt+← | Следующий / предыдущий результат поиска |
Enter / Shift+Enter | Искать / следующий / предыдущий результат (в поле поиска) |
Ctrl+Alt+I / O / P | Переключить вкладку активного набора на CSS / JS / Действия (когда карточка набора отрисована) |
Ctrl+Alt+G/H/J/K — это клавиши рядом друг с другом (раскладка Vim), все свободны во всех браузерах и системах. Ctrl+Alt+L намеренно пропущен — на Linux он блокирует экран. Ctrl+Alt+S (режим редактирования) и Ctrl+Alt+\ (AI Helper) находятся в том же семействе модификаторов. Сочетания Output Console (Ctrl+Shift+...) не конфликтуют, потому что отличаются модификатором.
Расширение предлагает пять форматов экспорта (полный, частичный, каталог, группа, набор) с автоматическим определением типа файла при импорте, чтобы избежать случайной перезаписи.
В меню Настройки сайдбара: Экспорт настроек. Модал открывает два режима:
Файлы частичного экспорта называются justzix-partial-DATA.json (против justzix-backup-DATA.json для полного), а внутри содержат флаг partial: true и поле groups[].
В панели каталога: Экспорт — открывает модал с деревом групп и наборов (аналогично частичному экспорту, но ограниченному этим каталогом). Экспортируются только отмеченные наборы и группы, которым они принадлежат — пустые группы не попадают в файл.
Формат justzix-folder — файл содержит поле groups[] с иерархией групп и наборов каталога.
В панели группы: Экспорт — модал со списком наборов группы (чекбоксы). Файл: justzix-grupa-<название>-<дата>.json, формат justzix-group.
В виде набора: Экспорт набора — сразу скачивает файл (без модала). Формат justzix-rule, имя: justzix-zestaw-<название>-<дата>.json.
justzix-full — полный backup всегоjustzix-full с partial: true — выбранные элементы из главного экспортаjustzix-folder — один каталог с деревом выбораjustzix-group — группа + отмеченные наборыjustzix-rule — один наборПосле загрузки файла/вставки JSON расширение автоматически распознаёт тип и показывает цветную панель определения:
| Цвет | Значение | Действие |
|---|---|---|
| Teal (бирюзовый) | Корректный полный backup | Показывает число каталогов/наборов, дату экспорта, предупреждение о перезаписи |
| Фиолетовый | Частичный backup (partial: true) | Выбор режима: Слить с текущими или Заменить всё |
| Оранжевый | Неподходящий тип файла в этом модале | Сообщение, направляющее к правильному модалу, кнопка Импорт заблокирована |
| Красный | Ошибка парсинга JSON / неверный формат | Кнопка Импорт заблокирована |
1 / nadpisz — перезаписать существующие каталоги (удалит их группы и наборы)2 / kopia (по умолчанию) — импортировать как копии с новыми ID, "(import)" в названии каталога, без потери существующих данныхВ панели каталога: Импорт. Проверяет конфликты по ID и названию:
В панели группы: Импорт — принимает 3 формата:
justzix-group — вставляет все наборы группы из файлаjustzix-folder — вставляет все наборы из всех групп каталогаjustzix-rule — вставляет один наборВсе наборы из файла попадают в текущую группу с новыми ID (операция всегда типа "добавить копию" — без конфликтов).
В виде набора: Импорт набора — принимает только justzix-rule. Prompt с 3 опциями:
1 / zastap — заменить содержимое текущего набора (id и groupId сохранены)2 / kopia (по умолчанию) — добавить как новый набор рядом с текущим, в той же группе, с припиской "(import)"Настройки → Облачная синхронизация открывает модал учётной записи синхронизации. Расширение хранит вашу библиотеку (каталоги, группы, наборы, действия, панели действий, окна на странице) в облаке justzix.com и поддерживает её согласованность на всех устройствах. Синхронизация работает только при выполненном входе — без учётной записи расширение работает только локально.
При входе расширение сравнивает локальные данные с данными в облаке:
| Выбор | Что делает |
|---|---|
| Использовать данные из облака | Очищает локальную библиотеку и восстанавливает состояние учётной записи с сервера |
| Отправить мои локальные данные | Локальные данные становятся канонической версией — удаляет то, что было в облаке |
| Объединить | Совмещает оба набора — добавляет недостающие сущности, сохраняя существующие |
Можно также Отменить — тогда расширение выходит из учётной записи и ничего не меняет.
После первой сверки синхронизация работает в фоне: расширение отправляет изменения и подтягивает новые сущности примерно раз в минуту. Изменение, сделанное на одном устройстве, появляется на других через короткое время. Точка статуса рядом с пунктом «Облачная синхронизация» показывает, подключена ли учётная запись.
Вкладка Статус модала синхронизации показывает состояние аккаунта и даёт кнопки действий:
Счётчики сущностей, находящихся в аккаунте: каталоги, группы, наборы, действия, панели действий, окна на странице. Считаются только достижимые сущности в дереве (у группы должен быть существующий каталог, у набора — группа, у панели/окна — существующий родитель) — согласованно со счётчиками Панели. Обновляются при открытии панели и после ручной синхронизации.
Локальный для устройства лог последних синхронизаций. На странице видны последние 10 записей; кнопка «Показать всю историю» открывает окно с полным списком (до 100 записей). Каждая запись содержит:
Лог локальный — не синхронизируется между устройствами. Запись создаётся после каждого тика синхронизации, который что-то реально изменил; ручное «Синхронизировать сейчас» всегда оставляет запись, даже при нулевых изменениях.
Статистика использования (применения CSS, запуски JS, показы окон) синхронизируется как отдельные сущности для каждого устройства — карточка Панели суммирует их со всех сопряжённых устройств. Тема и язык синхронизируются как общая настройка учётной записи и применяются при следующем открытии панели на другом устройстве.
Альтернатива отправке файла JSON в мессенджер. Вы выставляете публичную ссылку со временем жизни (1h / 6h / 12h / 24h / 48h) и передаёте получателю. Backend justzix.com хранит payload в облаке до истечения срока, потом он удаляется.
Требует залогиненной учётной записи синхронизации (Sync). Сам токен — это публичный секрет — каждый со ссылкой скачает, поэтому не отправляйте по публичным каналам, если содержимое чувствительное.
JZS-XXXX-XXXX-XXXX-XXXX (16 символов Crockford base32, ~80-bit энтропии). Принимается также весь URL https://www.justzix.com/s/JZS-... — расширение парсит и нормализует (путающиеся буквы I/L→1, O→0, U→V).
Превышение лимита = ошибка с сообщением. Отзовите неиспользуемые ссылки в панели Мои ссылки.
Кнопка «Поделиться URL» в четырёх точках входа, рядом с «Скачать файл»:
justzix-full)justzix-folder)justzix-group)justzix-rule)Клик открывает модал генерации ссылки: subject + summary что вы предоставляете, radio с TTL (по умолчанию 24h), «Сгенерировать ссылку». После успеха модал переключается на вид результата с двумя копируемыми значениями:
https://www.justzix.com/s/JZS-... — для отправки кому-то без расширения (покажет landing-страницу)JZS-XXXX-XXXX-XXXX-XXXX — для вставки в расширении получателя в «Импорт из URL»У каждого своя кнопка «Скопировать». Показано также время истечения в локальном часовом поясе.
Настройки → Мои ссылки (отдельный модал, не часть синхронизации — это две разные функции). Показывает список активных ссылок: счётчик в заголовке X/20 активных · Y MB / 50 MB, а для каждой ссылки карточку с:
X каталогов · Y групп · Z наборов · N строк JS · A KBОтзыв не отменяет уже скачанное содержимое. Если кто-то успел скачать payload, он у него локально. Share — это "best-effort time-limit", не DRM.
Настройки → Импорт из URL (между «Импорт настроек» и «Облачная синхронизация», иконка цепочки). Модал из двух шагов:
Шаг 1 — ввод. Вставляете ссылку или просто токен. Валидация на стороне клиента: токен извлекается из URL, нормализуется Crockford-base32, проверяются 16 символов + формат. Неверный формат → сообщение с подсказкой о правильном формате.
Шаг 2 — preview. Расширение показывает сводку ссылки:
Если ссылка содержит JavaScript (jsLines > 0) — появляется красный баннер предупреждения со ссылкой «Показать код JavaScript». Открывает overlay с полным кодом JS каждого правила и действия — просмотрите перед импортом, потому что код будет выполняться на подходящих страницах.
Шаг 3 — импорт. Клик «Импортировать» → backend возвращает полный payload → расширение создаёт новые сущности с всегда свежими ID (никогда не перезаписывает существующие по ID):
| Тип | Что происходит |
|---|---|
justzix-rule | Создаёт новый каталог + группу «Domyślna» + импортированный набор |
justzix-group | Создаёт новый каталог + импортированную группу + наборы |
justzix-folder | Добавляет как новый каталог верхнего уровня |
justzix-full | Merge: добавляет все folders/groups/rules со свежими ID |
Название нового контейнера: <имя-отправителя или "Import"> <дата> — потом вы можете переименовать / переместить как угодно.
| Ошибка | Сообщение |
|---|---|
| Неверный токен | «Токен неверный. Проверьте, скопировали ли вы всю ссылку.» |
404 not_found | «Эта ссылка истекла или была отозвана отправителем. Попросите новую.» |
429 rate_limited | «Слишком много попыток. Подождите немного и попробуйте снова.» |
| 5xx / network | «Проблема с сервером. Попробуйте снова.» |
Backend не различает 404 «никогда не существовал» и 404 «истёк / отозван» — намеренно, чтобы не раскрывать, существовал ли токен когда-либо.
Любое действие (со вкладки «Действия» в карточке набора) можно вызвать программно из JS набора или кода другого действия. Глобальное пространство имён window.JZ устанавливается в MAIN world автоматически перед каждым выполнением user-JS.
| Вызов | Что делает |
|---|---|
JZ.click(labelOrId) | Кликает программно. Семантика по типу действия: BUTTON → el.click(). SELECT static (кнопка с dropdown) → el.click() (открывает popup; пользователь выберет опцию вручную). SELECT js (нативный <select>) → устанавливает value на первую non-disabled опцию и dispatch change. INPUT / TEXTAREA / SLIDER → el.click() — внимание: не меняет значение и не запускает handler change. Чтобы установить значение: const el = JZ.action('LBL'); el.value = 'X'; el.dispatchEvent(new Event('change')). TOGGLE3 — el.click() попадает на контейнер; чтобы активировать конкретное состояние, используйте el.querySelector('.jz-toggle3-state[data-jz-state-idx="1"]').click(). Возвращает true/false. |
JZ.value(labelOrId) | Единый getter текущего значения. INPUT / TEXTAREA → нативное el.value. SLIDER → wrap.dataset.jzValue (wrap это DIV, renderer устанавливает data attr от initial + на input/change). SELECT(js) → нативное el.value. SELECT(static) → el.dataset.jzValue (renderer set при каждом выборе). TOGGLE3 → el.dataset.jzValue (state.value активного; откат к state.label). BUTTON → null. Элемент не найден → null. |
JZ.setValue(labelOrId, value) | Программный setter. INPUT/TEXTAREA → el.value = String(v) + dispatch input+change. SLIDER → устанавливает нативный <input.jz-action-slider> + dispatch. SELECT(js) → el.value = String(v) + dispatch change. SELECT(static) + TOGGLE3 → отправляет CustomEvent 'jz-set-value', content.js listener выполняет полный flow (memory + UI + запуск кода). TOGGLE3 lookup: по state.value → откат к state.label → откат к числовому idx 0-2. BUTTON → false. Возвращает true/false. |
JZ.action(labelOrId) | Возвращает элемент действия (button / select / input / textarea / slider / toggle3 container) или null. Lookup: сначала по data-jz-action-id, затем case-insensitive по data-jz-key (UPPERCASE label). Работает для всех 6 типов действий. |
JZ.actionById(id) | Lookup исключительно по стабильному action.id (например, 'a_mp1deeq3_uimd8l'). Рекомендуется для действий без label или когда нужна уверенность. |
JZ.actions() | Массив всех видимых элементов действий (button + select + input + textarea + slider + toggle3) на текущей странице. |
JZ.labels() | Массив оригинальных меток (регистр сохранён как вы ввели). |
// === Чтение ===
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 активного состояния
// === Установка ===
JZ.setValue('FILT', 'новое значение'); // INPUT/TEXTAREA — string + dispatch input+change
JZ.setValue('OPAC', 75); // SLIDER — clamp к min/max, dispatch input+change
JZ.setValue('SRT', 'prod'); // SELECT(js) — нативный select + dispatch change
JZ.setValue('MODE', 'staging'); // SELECT static — content.js выполняет flow (memory + UI + код)
JZ.setValue('THM', 'dark'); // TOGGLE3 — lookup по state.value (откат к label, затем idx)
JZ.setValue('THM', 2); // TOGGLE3 — эквивалентно; числовой idx тоже работает
| Вызов | Что делает |
|---|---|
JZ.bars() | Все контейнеры .jz-actions-bar (ActionBars), видимые на странице. |
JZ.barById(id) | Элемент панели по data-jz-bar-id. |
JZ.floatingBtn() | Главная плавающая кнопка #justzix-floating-btn или null (когда скрыта). |
JZ.click / JZ.action case-insensitive по label, но точный по стабильному action.id. Для действий без label (обычно INPUT) используйте JZ.actionById('a_...').
В поле «Код JS» действия вам автоматически доступны переменные — внедряемые как const background service worker'ом перед выполнением:
| Переменная | Что содержит | Когда доступна |
|---|---|---|
$el | DOM-элемент этого действия (input / select / button / textarea / контейнер toggle3) | всегда, когда action.id существует |
$action | { id, label, type, el } | всегда |
value | Текущее значение по типу: SELECT static → option.value; INPUT/TEXTAREA → содержимое поля; SLIDER → число; TOGGLE3 → state.value активного состояния (откат к state.label, когда value пустой). | SELECT static, INPUT, TEXTAREA, SLIDER, TOGGLE3. SELECT js: код запускается ОДИН РАЗ при рендере — value пустой. |
stateIdx | Integer 0-2 — индекс активного состояния (с которого состояния начался клик). | только TOGGLE3 |
stateLabel | String — label активного состояния (макс. 5 символов). | только TOGGLE3 |
В модале настройки действия типа SELECT и INPUT панель «Стабильный ID действия» показывает полный action.id с кнопкой copy и пример JS-селектора (document.querySelector('[data-jz-action-id="..."]')). Под списком BUTTON-ов видны чипы JZ.click('LBL') — клик чипа копирует сниппет в буфер обмена.
visible: true, панель видна в дереве + URL страницы совпадает с правилами).JZ.click() вернёт false, JZ.action() вернёт null.JZ.click().// Код действия "AUTO"
JZ.click('LOAD'); // клик по действию LOAD (например, загружает данные)
setTimeout(() => JZ.click('PROC'), 500); // 500ms позже PROC (обрабатывает)
setTimeout(() => JZ.click('SAVE'), 1500); // 1500ms позже SAVE (сохранение)
После появления динамического элемента кликните действие, удаляющее его:
// Код JS набора — observer на модал, который появляется динамически
const observer = new MutationObserver(() => {
if (document.querySelector('.cookie-banner')) {
JZ.click('CCK'); // кликни действие, удаляющее баннер
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
// JZ.click на INPUT не меняет значение — используйте паттерн с dispatch 'change':
const el = JZ.action('SRCH'); // или JZ.actionById('a_mp1deeq3_uimd8l')
if (el) {
el.value = 'новый фильтр';
el.dispatchEvent(new Event('change'));
}
Если вы предпочитаете работать с DOM напрямую (например, меняете стиль, не вызываете):
// Lookup по стабильному ID (рекомендуется — устойчиво к смене label):
const el = document.querySelector('[data-jz-action-id="a_mp1deeq3_uimd8l"]');
// Lookup по label (case-insensitive — UPPERCASE в data-jz-key):
const btn = document.querySelector('[data-jz-key="MYBT"]');
btn.style.opacity = '0.5'; // приглушить
btn.dataset.busy = 'true'; // собственный атрибут
Где живут элементы действий в DOM:
| Тип действия | Контейнер | Селектор элемента |
|---|---|---|
| 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"] (кнопка с popup; data-jz-value = текущее выбранное значение) |
| SELECT (js) | .jz-actions-bar | .jz-action-select.jz-variant-js (нативный <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); сам слайдер: .jz-action-slider (нативный <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="..."] (контейнер; data-jz-value = state.value активного); state-кнопки: .jz-toggle3-state[data-jz-state-idx="0|1|2"], активная имеет класс .active |
У всех элементов есть атрибут data-jz-action-id (уникальный стабильный идентификатор). Селектор .jz-actions-bar безопасен — не конфликтует с DOM страницы.
data-jz-key) работает для всех типов действий. У каждого элемента действия есть как data-jz-label (оригинальный регистр), так и data-jz-key (UPPERCASE). Для надёжности (например, когда label может измениться) используйте стабильный data-jz-action-id или JZ.actionById().
Поле "Поиск" фильтрует дерево каталогов. Логика совпадения:
Совпадение case-insensitive, подсветка жёлтым показывает место совпадения.
После клика по иконке расширения в панели инструментов Chrome появляется виджет попапа с большим зелёно/серым переключателем «Plugin enabled». В выключенном режиме никакой CSS/JS не внедряется ни на одной странице, независимо от настроек каталогов. Плавающая кнопка тогда выключена (Halt Red, opacity 0.7). Состояние переживает перезапуск Chrome.
Кнопка рядом с полем шаблона URL — вставляет protocol://host/* из активной вкладки. Создание каталога за 2 секунды. Адрес страницы параметров расширения пропускается — берётся самая свежая внешняя вкладка.
Inline справа от поля URL появляется информация "Совпадает с X открытыми вкладками" или предупреждение. Ловит опечатки немедленно.
Снимок CSS и JS создаётся через 3 секунды после последнего редактирования (debounce). Лимит 5 версий — самая старая выталкивается. При восстановлении версии текущее содержимое добавляется в историю как самый новый снимок, поэтому вы всегда можете отменить отмену.
В заголовке карточки набора есть поле для тегов — вводите через запятую. Появляются как маленькие метки в сайдбаре рядом с названием набора. Поиск находит и по тегам.
У каждого каталога может быть собственная метка на плавающей кнопке (макс. 3 буквы, UPPERCASE) и цвет (color picker). Метка и цвет помогают визуально распознать, какой проект активен на данной странице.
Каждая кнопка действия считает, сколько раз была нажата. Помогает увидеть, какие действительно используются.
Под редактором CSS отображается полоса со списком синтаксических проблем:
/* ... */})} (с номером строки)Это простая синтаксическая валидация — она не проверяет корректность properties/values. CSS с ошибкой всё равно внедряется (браузер просто пропустит ошибочные правила).
В модале Импорт одного каталога, после загрузки файла, появляется список наборов с метрикой:
Содержимое файла (3 наборов):
Auto-login CSS: 0L • JS: 4L JS
Ukryj banner cookie CSS: 8L • JS: 0L
Debug GTM CSS: 0L • JS: 12L • 2 akcji (8L) JS
Предупреждение с числом строк JS, если хоть какие-то присутствуют. Клик на кнопку JS показывает полный код для просмотра перед импортом.
Каждый набор JS выполняется отдельно, с собственным try/catch. Ошибка в одном наборе не блокирует выполнение других. Ошибки логируются в консоль с названием набора/действия и полным stack trace.
Индикатор использования памяти в меню Настройки сайдбара (например, 1.2 MB / 10 MB). Красный выше 80%.
Чекбокс над списком — скрывает наборы, отмеченные как независимые (○), и показывает только активные в каталоге (●). Помогает отсеять "ручные" наборы, когда у каталога их много. Реагирует мгновенно на изменения переключателей.
У расширения постоянный ключ в манифесте (в сборке для Firefox — постоянный gecko.id), что означает, что ID расширения неизменен между обновлениями — данные (каталоги, наборы, настройки) сохраняются. JustZix поставляется для четырёх браузеров: Chrome, Edge, Opera и Firefox.
В меню Настройки (рядом с номером версии) появляется зелёный баннер «Доступна новая версия», когда сервер публикует пакет новее установленного. Баннер содержит ссылку для скачивания. Проверка тихая — при отсутствии сети баннер просто не показывается.
chrome://extensions/ (Edge: edge://extensions/) найдите расширение и кликните иконку обновления на плиткеСборка для Firefox загружается через about:debugging → «Этот Firefox» → «Загрузить временное дополнение» (указывая на manifest.json в папке justzix_firefox/). Обновление = перезагрузка после перезаписи файлов.
"key" в манифесте (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);
}
Трюк: инверсия всей страницы и повторная инверсия изображений. Работает на удивление хорошо на большинстве страниц.
/* 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; }
Отлично для шаблона https://dev.example.com/*, чтобы не путать окружения.
// 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);
};
}
Идеально для отладки конфигурации аналитики на продакшене без правки кода.
// 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);
});
Метка: CLR Цвет: красный
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 }));
});
Метка: FILL Цвет: зелёный
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 }));
}
});
Метка: CART Цвет: оранжевый
// 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');
Метка: COPY Цвет: фиолетовый
navigator.clipboard.writeText(location.href).then(() => {
console.log('Skopiowano:', location.href);
});
Метка: TKN Цвет: жёлтый
// 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');
}
Метка: SQL Цвет: синий
// 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.');
Метка: ENV Цвет: серый
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));
У каждого проекта свой каталог со своим шаблоном URL. Вы можете иметь каталоги:
https://dev.justzix.com/* с красным баннером "DEV"В правой панели приватные каталоги можно быстро включать/выключать. Экспорт одного каталога позволяет поделиться конфигурацией с командой.
На каждом dev/staging добавьте баннер и авто-логин. Один набор CSS (баннер) и один JS (авто-заполнение). Создаёте отдельный каталог для каждого окружения, всё включается простым чекбоксом.
Панель действий с кнопками: FILL (тестовые данные), CART (тестовая покупка), CLR (очистить форму), STATE (показать состояние приложения в alert). Без программиста, без консоли, один клик.
Любимые блоги/документация с лучшей читаемостью — более широкий контейнер, шрифт, тёмный режим. Каждая страница в отдельном каталоге, "Активный" оставлен навсегда включённым.
Один набор на каждый домен с JS, перехватывающим dataLayer.push и gtag. Включаете его, когда клиент сообщает о проблеме с аналитикой, без правки кода страницы.
Шаблон *://*.justzix.com/admin/* и CSS, улучшающий таблицы, списки, формы. Плюс действие "Тестовый фильтр", автоматически устанавливающее фильтры для типичного workflow.
Действие RO (read-only) внедряет CSS, который скрывает все кнопки "Удалить", "Сохранить", "Отправить" — временный "режим только для чтения", чтобы не ошибиться.
// 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 или более специфичные селекторы.css-1abcd, которые меняются. Используйте атрибуты ([data-testid]) или стабильные селекторыУ расширения постоянный ключ в манифесте — последующие обновления сохраняют данные. Если данные всё же исчезли:
chrome://extensions/ используйте кнопку обновления, не удаляйте и не устанавливайте зановоЭто нормально — позиции хранятся на окно браузера в памяти сессии (chrome.storage.session). После закрытия окна позиции исчезают, в новом окне вы стартуете с дефолтных. Позиция переживает навигацию между вкладками в том же окне.
Да — частичный экспорт содержит только отмеченные каталоги и наборы плюс связанные с ними настройки видимости. Не содержит позиций плавающих панелей (они на окно) и других глобальных предпочтений. Для полного backup используйте режим "Всё".
Режим "Слить" сопоставляет каталоги по ID. Если импортируемый файл имел ID, конфликтующий с существующим каталогом (например, тот же файл уже однажды импортировался), появляется prompt: 1 перезаписать / 2 копия (по умолчанию, безопасно) / Отмена. Выбирая 2, вы получаете копии с новыми ID и припиской "(import)" в названии каталога — ничего не теряете.
Стрелка раскрытия появляется только если у каталога есть наборы. Пустой каталог имеет приглушённую точку вместо стрелки. Состояние раскрытия каждого каталога запоминается в chrome.storage.local.
Эти кнопки в панели каталога (вверху области редактирования), рядом с кнопкой "Удалить каталог". Не путать с кнопками в меню Настройки, которые касаются всех настроек.
JS правил и действий выполняется в контексте страницы по многоуровневой стратегии, устойчивой к строгим правилам Content Security Policy. Большинство страниц — включая крупные сервисы вроде Facebook — работают сразу, без какой-либо настройки.
Страницы с очень строгим CSP (некоторые банки, корпоративные сайты) могут блокировать выполнение. Чтобы JS работал на любой странице, включите для JustZix опцию «Разрешить пользовательские скрипты»: откройте chrome://extensions, перейдите к сведениям о JustZix и включите переключатель (в более старых браузерах также нужен режим разработчика). Когда страница блокирует выполнение, окно JavaScript / Консоль JS показывает соответствующее сообщение.
JustZix — инструкция