JustZix — инструкция по использованию

Внедрение собственных стилей CSS, кода JavaScript и кнопок действий на любые страницы

Содержание

Концепция и основные понятия

JustZix позволяет автоматически внедрять собственный CSS и JavaScript на выбранные страницы, а также определять кнопки действий (ярлыки, выполняющие фрагменты кода по запросу).

Иерархия данных

Каталог
Высший уровень — группа наборов для одного шаблона URL. Например, каталог "justzix.com" с шаблоном https://justzix.com/*. Весь каталог можно включить/выключить одним кликом.
Группа
Промежуточный уровень между каталогом и наборами — помогает организовывать крупные проекты (например, "Admin", "Frontend", "QA"). У каждого каталога минимум одна группа. У группы свой переключатель с каскадом к активным наборам.
Набор
Отдельная модификация: кусок CSS, кусок JS, плюс список кнопок действий и опционально собственные шаблоны URL, ограничивающие его конкретными подстраницами. Каждый набор принадлежит одной группе.
CSS
Стили применяются на лету — изменения видны сразу после сохранения, без перезагрузки страницы.
JavaScript
Код выполняется один раз при каждой загрузке страницы, соответствующей шаблону. Требует перезагрузки страницы, чтобы выполниться снова.
Кнопки действий
Выполняют JavaScript только после клика, в плавающей панели. Отлично подходят для диагностических инструментов и частых операций.

Шаблоны URL на уровне набора и группы

Каждый набор и каждая группа может получить собственный список дополнительных шаблонов 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)
Per-rule URL patterns — это дополнительный фильтр, они не заменяют шаблон каталога. Правило активируется только когда URL совпадает с обоими: шаблоном каталога и хотя бы одним из шаблонов набора (если они заданы).

Обучение — интерактивное введение

Для новых пользователей в JustZix есть встроенное интерактивное обучение, которое шаг за шагом проводит вас через создание полного решения — от каталога, через группу и набор правил, до кода CSS/JS и кнопки действия. Подсказки появляются в виде всплывающих окошек рядом с очередными элементами панели.

Как его запустить:

В окне «Центр обучения» вы выбираете урок и нажимаете Начать. Во время обучения:

Интерфейс и навигация

Режим редактирования

Доступ через правый клик на иконку расширения → "Параметры", либо клик на иконку → кнопка "Панель редактирования".

Плавающая кнопка (на подходящих страницах)

Маленькая круглая кнопка появляется автоматически на страницах, соответствующих любому каталогу. По умолчанию отображает надпись ZIX, но у каждого каталога может быть своя метка.

Метка каталога: в панели каталога, в крайнем левом углу (рядом с color picker) есть текстовое поле для метки кнопки. Жёсткие ограничения: макс. 3 символа, всегда UPPERCASE (преобразование в заглавные происходит сразу при вводе). Поле принимает буквы и цифры — примеры: ZIX, QA, DEV, ADM, X. При нескольких подходящих каталогах берётся метка первого, у которого она задана; остальные пропускаются (пустое поле = откат к ZIX).

Состояние цветом (брендовая палитра):

Цвет каталога: если у каталога задать color picker, плавающая кнопка на подходящих страницах примет этот цвет. Состояния "mixed" и "off" автоматически модулируют насыщенность. При нескольких подходящих каталогах берётся цвет первого, у которого он задан.

Панель

При входе в панель редактирования расширение открывает Панель — главную страницу со сводкой библиотеки и быстрыми ссылками. Раньше панель автоматически выделяла первый каталог из списка; теперь вместо этого вы видите обзор.

Панель доступна через клик на логотип в сайдбаре и через иконку «дом» на полосе breadcrumb каждого редактора (каталога, группы, набора). Сам заголовок Панели тоже имеет иконку «дом» — её клик обновляет данные (перезагружает библиотеку из storage и рендерит Панель заново).

Панель имеет компоновку из фиксированных рядов карточек:

Карточки «Последние примеры» и «Из блога» загружают содержимое с сайта проекта; когда endpoint недоступен (например, offline), обе карточки скрываются. Версия расширения проверяется заново при каждом входе на панель.

Левая панель в режиме редактирования отображает каталоги в иерархии — каждый каталог можно раскрыть, чтобы увидеть его наборы и перейти к редактированию конкретного.

Навигация

ЭлементДействие
Стрелка раскрытияРаскрывает/сворачивает список наборов или групп (запоминается между сессиями)
Клик на название каталога (свёрнутого)Выделяет каталог, открывает Folder editor и раскрывает его группы/наборы
Клик на уже выделенный каталогПереключение: сворачивает (следующий клик снова раскрывает) — аналогично для группы
Клик на название группы (свёрнутой)Выделяет группу, открывает Group editor и раскрывает её наборы
Клик на название набораОткрывает вид одного набора (Rule editor)
Чекбокс у каталогаВключает/выключает весь каталог (каскад к группам и их активным наборам)
Чекбокс у группыВключает/выключает группу (каскад к её активным наборам)
Чекбокс у набораНезависимо управляет одним набором
Статус ●/○ рядом с каталогом/группой/наборомАктивный: ● активен, ○ неактивен (принудительно выключен)
C J A U рядом с наборомМетки содержимого: C = есть CSS, J = есть JavaScript, A = есть действия, U = есть собственные шаблоны URL. Появляются только когда соответствующее поле не пустое.
Цветная полоса слеваЦвет каталога рисуется через box-shadow inset — не сдвигает положение названия каталога (каталоги с цветом и без него выровнены)
Маркер drag&dropЗахватите мышью и перетащите, чтобы изменить порядок
Состояние по умолчанию после свежей установки: все каталоги и группы свёрнуты. Первый клик раскрывает, следующий клик на том же элементе сворачивает. Состояние раскрытия запоминается между сессиями (storage expandedFolders, expandedGroups).

Изменение порядка (drag & drop)

Наведите на каталог, группу или набор — слева появится маркер drag&drop. Захватите мышью и перетащите:

Каталоги

Группы

Наборы

Drag & drop учитывает выделение — если перетащить текущий выбранный набор между каталогами, выделение следует за ним, а целевой каталог автоматически раскрывается.
Когда вы видите один набор, вверху редактора появляется полоса со ссылкой "Показать все в каталоге" для быстрого возврата к виду всего каталога.

Сворачивание сайдбара

Вертикальная полоса между сайдбаром и редактором прячет левую панель — удобно, когда нужно больше места для редактора. Состояние запоминается между сессиями. После показа/скрытия CodeMirror автоматически обновляет свою ширину.

Изменение размера редакторов

Под каждым редактором (CSS, JS, код действия) есть горизонтальная полоса с маркером для перетаскивания по вертикали. Захватите мышью и потяните вниз, чтобы увеличить редактор. Мин. высота 80px, макс. не ограничена — страница прокручивается естественно вместе с содержимым.

Над каждым редактором кода CodeMirror — CSS и JavaScript в карточке набора, а также «Код JS» в редакторе действия — расположена панель поиска: текстовое поле и кнопка с иконкой лупы.

Горячие клавиши

КлавишаДействие
EnterИскать (новый запрос) или перейти к следующему результату (когда запрос без изменений)
Shift+EnterПредыдущий результат
Ctrl+Alt+→ / Ctrl+Alt+←Следующий / предыдущий результат — работает из редактора и из поля поиска
Ctrl+Alt+FИз редактора кода переносит фокус в поле поиска
EscОчищает поле поиска

Шаблоны URL

Шаблон URL определяет, на каких страницах активируется каталог.

ШаблонСовпадает с
https://justzix.com/adminТолько этот точный URL
https://justzix.com/*Все страницы на justzix.com
https://*.justzix.com/*Все поддомены и страницы
*://localhost:*/*Все локальные приложения
https://example.com/admin/*Только раздел /admin/ и подстраницы
*example*Любой URL, содержащий "example"
Подсказка: совпадение игнорирует query string (?id=123) и hash (#section), если только вы не поместите их в шаблон.

Состояния наборов (Активный / Включён)

У каждого набора два независимых флага:

ФлагЗначение
АктивныйУправляется ли этот набор переключателем каталога и группы (оба уровня каскадируют к active rules). Включение каталога или группы включает все активные наборы внутри.
ВключёнТекущее состояние: внедрён ли набор сейчас на страницы.

Каскад переключателей

Переключатель каталога  →  меняет enabled всех active rules в его группах
Переключатель группы    →  меняет enabled всех active rules этой группы
Переключатель набора    →  меняет только enabled этого набора

Правила с Активный: НЕТ (значок ○) пропускаются при каскадах — вы управляете ими только вручную, независимо от состояния каталога и группы.

Практические примеры

Набор всегда ручной

Активный: НЕТ • Включён: управляется вручную

Набор не реагирует на включение всего каталога. Вы управляете им только вручную. Идеально для экспериментальных модификаций, которые не хотите включать массово.

Набор всегда включён с каталогом

Активный: ДА • Включён: ДА

Стандартная настройка. Включение/выключение каталога управляет и этим набором.

Набор временно выключен

Активный: ДА • Включён: НЕТ

Набор "подключён" к каталогу, но временно выключен. Следующий клик главного переключателя каталога снова его активирует.

Плавающая кнопка и панель

ДействиеЭффект
Левый кликПереключение всех подходящих каталогов (вкл/выкл)
Правый кликОткрывает панель со списком каталогов и наборов
ПеретаскиваниеСдвиг позиции (запоминается на окно)

В раскрывающейся панели (правый клик) можно:

Панель показывает только активные наборы (●) — независимые (○) скрыты для краткости. Когда у каталога только одна группа с названием "Domyślna", заголовок группы пропускается — видны только наборы.

Скрытие плавающей кнопки для страницы: в виджете попапа расширения — кликните иконку JustZix рядом с адресом и нажмите иконку «eye-off» у названия каталога. Восстановление ссылкой «Вернуть плавающую кнопку» там же.

Клик по иконке JustZix в панели расширений Chrome открывает виджет попапа — компактную панель управления для текущей вкладки. Сверху вниз:

Панели действий (ActionBars)

В одном рабочем пространстве можно иметь несколько панелей действий — каждая со своим названием, ориентацией, цветом фона, собственным набором кнопок и независимой позицией на каждое окно браузера. Панель может быть привязана к каталогу, группе или отдельному набору (это определяет видимость и каскад).

Создание и редактирование панели

В редакторе каталога, группы или набора есть кнопка «Панели действий (N)». Клик открывает модал управления панелями. В модале:

Видимость, наследуемая вниз

Привязка действия к панели

У каждого действия на вкладке «Действия» карточки набора есть выпадающий список «Панель действий» — выбираете целевую панель из списка видимых для этого набора (собственные панели набора + панели группы + панели каталога).

Склеивание панелей (snap & connect)

Во время перетаскивания панели расширение обнаруживает края соседних панелей и плавающей кнопки на расстоянии ≤ 12 px. Появляется sticky-индикатор, и после отпускания панели объединяются в группу соединений. Затем:

Правый клик на маркер перетаскивания панели → контекстное меню:

В режиме редактирования панели это меню приглушено; правый клик на метке даёт тогда опцию «Удалить метку».

Показать/скрыть панели — из 3 мест

Для постоянного включения/выключения панелей действий (без F5) расширение предлагает три точки входа, все привязанные к одному и тому же actionBar.enabled в storage — изменение из одного места распространяется в панель редактирования и остальные UI:

  1. Floating panel (правый клик на главной плавающей кнопке JustZix) — раздел «Панели действий» под списком каталогов/групп/наборов. Чекбокс на каждую панель показывает persistent state. Клик → переключение actionBar.enabled.
  2. Виджет попапа (клик по иконке расширения рядом с адресом) — раздел «Панели действий» под списком каталогов. Плюс на каждый каталог маленькая иконка «eye-off» — прячет плавающую кнопку для текущей страницы (восстановление ссылкой «Вернуть плавающую кнопку»).
  3. chrome.contextMenus (правый клик на странице → JustZix → Панели действий) — динамическое подменю с чекбоксом на каждую панель. Список перестраивается на каждую активную вкладку и каждое изменение state.
Persistent vs runtime hide:
Позиции всех панелей (и плавающей кнопки) сохраняются на окно браузера в памяти сессии. У каждого окна свои позиции, независимо от других. Они сбрасываются при закрытии окна или перезапуске Chrome.

Режим редактирования панели — свободная компоновка

Режим редактирования панели действий включается тремя способами: горячей клавишей Ctrl+Alt+S (работает из любого места страницы), переключателем в виджете попапа расширения, и из контекстного меню Chrome (правый клик → «Режим редактирования панели действий»). Вверху экрана появляется информационная полоса; повторное использование любого из переключателей выходит из режима.

В режиме редактирования обычная работа элементов приостановлена (клик не запускает код, поля не принимают фокус) — вместо этого элементы можно располагать и масштабировать:

Режим редактирования «жёсткий»: перемещение и resize притягиваются к сетке 8 px, элемент нельзя вынести за пределы панели или положить на другой — при коллизии оба элемента (перемещаемый и тот, что под ним) получают красную рамку, а после отпускания элемент возвращается на прежнее место. Панель нельзя уменьшить так, чтобы элемент оказался снаружи; когда новый элемент или метка не помещается в панель, холст панели автоматически увеличивается. Правый клик мыши на панели в режиме редактирования не показывает меню «скрыть/отсоединить панель».

Режимы компоновки панели: панель стартует в режиме flow (классический flexbox — элементы один за другим, вертикально или горизонтально). Первое перемещение или масштабирование элемента конвертирует панель в режим custom (холст со свободным позиционированием) — визуально без изменений, потому что текущая компоновка снимается как стартовая точка.

Позиции и размеры в режиме custom (bar.layoutMode, bar.size, action.layout, action.size) сохраняются постоянно и синхронизируются между устройствами — в отличие от позиции «плавания» панели на странице, которая остаётся на окно браузера.

Типы действий: BUTTON / SELECT / INPUT / SLIDER / TEXTAREA / TOGGLE3

У каждого действия есть тип — выбирается выпадающим списком в начале каждого действия в карточке набора. Доступно 6 типов:

ТипUIКогда запускает код
BUTTONКликабельная кнопка с меткой макс. 6 символовклик пользователя
SELECT staticCustom dropdown в стиле панели — опции настраиваются в модалевыбор опции (value = option.value)
SELECT jsНативный <select> — ваш код заполняет опции и подключает handlerОДИН РАЗ при рендере ($el = <select>)
INPUTТекстовое поле с placeholder (одна строка)change (Enter или blur)
SLIDERПолзунок <input type="range"> с меткой + value displaychange (отпускание мыши / Enter), value = число
TEXTAREAМногострочное поле — Enter это легитимный перенос строки (НЕ запускает код)change (blur — выход из поля)
TOGGLE33-позиционный segmented control (radio-like) — 3 мини-кнопки, одна активнаклик на неактивное состояние, value = state.value активного, плюс stateIdx и stateLabel в scope

Статические текстовые метки не являются типом действия — их добавляют прямо на панель в режиме редактирования (см. «Режим редактирования панели» → метки).

Общие поля

SELECT — модал опций

Клик «Опции (N)» в карточке действия типа SELECT открывает модал:

INPUT — модал настройки

SLIDER — модал настройки

TEXTAREA — модал настройки

TOGGLE3 — модал настройки

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

Выбор / значение / позиция ползунка / содержимое textarea / активное состояние toggle3 автоматически запоминаются на действие. После F5 значение возвращается; после закрытия вкладки и повторного её открытия (на странице, соответствующей правилу) — тоже. Singleton на action.id — одно значение, независимое от конкретного URL.

Формат значения в memory по типам:

Storage:

Нет синхронизации cross-device: memory остаётся локально. Два компьютера могут иметь разные значения (например, разный фильтр на каждого пользователя).

Security: sessionStorage доступен для скриптов страницы (same origin). Для чувствительных данных не используйте INPUT — вместо этого пишите значение прямо в поле «Код JS» набора.

Стабильный ID действия

У каждого действия есть неизменный 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:

Подменю окон перестраиваются по: tabs.onActivated, tabs.onUpdated (URL change), и storage.onChanged для folders/groups/rules/actionBars/cssPanes/jsPanes/jsConsoles/outputConsoles/floatingHidden. TEMP-подменю статично (всегда 4 пункта).

Окна на странице (CSS / JS / Консоли)

Расширение предлагает четыре типа плавающих окон, внедряемых на страницы, наряду с панелями действий. Каждое окно привязано к каталогу, группе или набору (наследует видимость каскадно, как панели действий) и появляется на страницах, совпадающих по URL.

Управление: в редакторе каталога / группы / набора найдёте кнопку «Окна ▾ (N)». Клик раскрывает меню с 4 типами — выбираете тип, открывается модал со списком окон этого уровня (плюс окна, унаследованные с уровней выше). Добавляете, называете, окрашиваете, удаляете.

ТипЦветДля чего
CSS paneзелёныйTextarea CSS, внедряемый на лету как <style>
JS paneamberTextarea JS, выполняемый при изменении кода
JS ConsoleфиолетовыйREPL — вводите код, Ctrl+Enter выполняет, output снизу
Output ConsoleизумрудныйТолько для чтения — просмотр логов со страницы (console.* + ошибки)

CSS pane

Плавающее окно с текстовым полем для CSS. Каждое изменение (после короткой паузы) обновляет внедрённый <style> — вы видите эффект на лету. Содержимое запоминается на вкладку браузера (переживает F5, исчезает с закрытием вкладки). Идеально для быстрого тестирования CSS без сохранения в правило.

JS pane

Текстовое поле для JavaScript, выполняемого в контексте страницы. Код запускается при изменении (с задержкой) либо вручную кнопкой ▶ Run / горячей клавишей Ctrl+Enter. Ошибки выполнения показываются в красной полосе под кодом. Когда код изменён с момента последнего запуска, кнопка Run светится жёлтым (состояние «dirty»).

JS Console (REPL)

Полноценная консоль на странице. Вводите код в нижнее поле, Ctrl+Enter (или ▶) выполняет, результат дописывается в область логов выше. Функции:

Ввод, output и история запоминаются на вкладку. Консоль выполняет код в MAIN world страницы — у вас есть доступ ко всем переменным и функциям страницы.

Output Console

Только для чтения просмотр логов — автоматически перехватывает всё, что происходит на странице: 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 — с раскрываемыми деталями
DataLayerPush в window.dataLayer (GTM) + живой просмотр объекта

Панель контекстных фильтров

Между вкладками и полем поиска есть панель фильтров, которая меняется в зависимости от выбранной вкладки:

Поиск

Под панелью фильтров есть постоянно видимое поле поиска. Фильтрует записи активной вкладки на лету (совпадение фрагмента, без учёта регистра). Esc очищает поле.

Логи консоли — сворачиваются как в DevTools

Записи console.* по умолчанию свёрнуты — показывают сокращённый просмотр (например, [PickupMap][2026-05-16T15:25Z] AUTO_SELECTION_SKIPPED: {reason: 'Lower priority source', …}). Клик раскрывает полные аргументы (объекты/массивы как раскрываемое дерево JSON), аналогично консоли DevTools.

Вкладка Network

Network перехватывает запросы через chrome.webRequest (разрешение webRequest в манифесте). Каждая запись показывает в том числе метод, URL, статус, тип ресурса, размер, длительность, удалённый адрес (Remote address) и инициатора (Initiator). Буфер запросов поддерживается в фоне, поэтому записи до открытия окна тоже появятся.

Вкладка DataLayer

Окно DataLayer разделено на две колонки:

Клики по собственному UI JustZix (раскрытие узлов дерева, кнопки окна) не попадают в эту вкладку. Если бы страница собирала события click (например, GTM auto-event), клик по окну генерировал бы push в dataLayer и сбрасывал бы раскрытие дерева — расширение распознаёт такие push и не сообщает о них (реальный window.dataLayer страницы остаётся нетронутым).

Собственный логгер — window.JUSTZIX

Output Console предоставляет глобальный API для логирования из вашего кода (JS pane, действия, код страницы):

JUSTZIX.log('обычный лог');
JUSTZIX.warn('предупреждение');
JUSTZIX.error(new Error('ошибка'));   // покажет stack trace
JUSTZIX.info({ obj: 1, arr: [2,3] });
JUSTZIX.debug('детали');               // по умолчанию скрыто (фильтр)

Доступные алиасы:

После появления Output Console в логе вы увидите приветственную строку, сообщающую, какой алиас доступен на этой странице.

Что перехватывается

Ошибки запросов fetch/XHR не попадают на вкладку Errors (это не исключения JS) — вы найдёте их на вкладке Network по статусу 4xx/5xx. Мы не ловим нарушения CSP и внутренние предупреждения Chrome.

Быстрая справка — Ctrl+Shift+H

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 — временные окна

Вы можете создать временное окно на любой странице — даже на такой, для которой у вас нет ни одного каталога. TEMP panes — это быстрый ad-hoc инструмент: тестируете CSS/JS на чужой странице без настройки правил.

Особенности TEMP panes:

Создание / закрытие (переключение):

AI Helper — ИИ-ассистент

AI Helper — это встроенный в расширение ИИ-ассистент, который помогает подготовить и внедрить решение CSS/JS под конкретную задачу на текущей странице. Модель может исследовать страницу, тестировать код на лету в окнах TEMP и — после вашего согласия — создать готовый каталог, группу и набор.

Настройка ключей API

В меню Настройки сайдбара пункт «AI Helper» открывает модал настройки:

Безопасность ключей: ключи API по умолчанию хранятся исключительно в локальной памяти этого устройства (chrome.storage.local). Ключ попадает на другие устройства только, когда вы отметите у него чекбокс «синхронизировать» — тогда он синхронизируется через облако JustZix (тот же канал, которым расширение синхронизирует каталоги, группы и наборы). Ключи без отметки никогда не покидают устройство. Вызовы API идут через service worker расширения, поэтому ключ не попадает в контекст страницы.

Окно чата

Окно AI Helper — это плавающее окно (на вкладку, как окна TEMP — перетаскиваемое, масштабируемое 8 маркерами, крестик закрытия, один экземпляр). Открываете / закрываете его:

В окне: выбор провайдера (когда у вас больше одного ключа) и модели (список загружается на лету), история разговора, кнопка очистки разговора и текстовое поле (отправить кнопкой или Ctrl+Enter). Модель автоматически получает контекст текущей страницы — URL, заголовок и фрагмент HTML.

Агентный workflow

AI Helper ведёт разговор по установленному workflow:

  1. Уточняет детали — диапазон URL, названия каталога/группы/набора, цвета, точную цель.
  2. Исследует страницу инструментом query_page (селекторы, структура DOM) перед написанием кода.
  3. Вставляет подготовленный код CSS/JS во временное окно TEMP, которое вы видите на лету на странице.
  4. Самостоятельно проверяет ошибки — инструментами read_temp_pane и read_console проверяет, не выдаёт ли тестируемый код ошибок, прежде чем показать вам результат.
  5. Просит проверить эффект и прямо спрашивает, удался ли тест.
  6. Когда тест не вышел — исправляет код и тестирует заново.
  7. Только после вашего подтверждения закрепляет решение: создаёт каталог → группу → набор, а при необходимости также панель действий и действия. Каждое создание сущности требует отдельного подтверждения в расширении.

Модель использует инструменты через простой текстовый протокол (блок @@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
AI Helper умеет создавать, читать и изменять полную структуру расширения (каталоги / группы / наборы / панели / действия / постоянные окна), самостоятельно проверять ошибки тестируемого кода (read_temp_pane + read_console), запрашивать у вас данные через встроенную форму (request_user_input) и делать скриншоты страницы (screenshot_page) как изображения, прикрепляемые к следующему запросу.

Внешний вид окна AI Helper

Правый клик на полосе заголовка окна AI Helper открывает меню с опциями «На передний план» / «На задний план» (изменение порядка окон JustZix при их наложении), «Отсоединить от: X» (когда AI Helper склеен с другим окном) и «Внешний вид…». Панель «Внешний вид…» позволяет отдельно стилизовать четыре роли в беседе: ваши сообщения, ответы ИИ, результаты инструментов, встроенные формы — каждая со своим шрифтом, размером, цветом текста и фона. Значения сохраняются для каждого устройства.

Склейка с другими окнами и порядок (Z-order)

Окно AI Helper участвует в том же механизме склейки, что и панели действий, постоянные окна (CSS / JS / Console / Output) и окна TEMP. Перетаскивание края рядом с другим окном JustZix (порог 12 px) → магнитное притяжение, красная кромка указывает сторону склейки на обоих окнах. Склеенные окна перемещаются группой.

Когда окна накладываются, опции «На передний план» / «На задний план» в контекстном меню каждого окна (правый клик на заголовке) делают одноразовый скачок — окно проходит над / под всеми перекрывающимися соседями, не нужно кликать многократно.

Скриншот страницы (для vision-моделей)

Инструмент 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Очистить outputJS 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.

Пять форматов файлов:

Импорт — автоматическое определение типа (модал полного импорта)

После загрузки файла/вставки JSON расширение автоматически распознаёт тип и показывает цветную панель определения:

ЦветЗначениеДействие
Teal (бирюзовый)Корректный полный backupПоказывает число каталогов/наборов, дату экспорта, предупреждение о перезаписи
ФиолетовыйЧастичный backup (partial: true)Выбор режима: Слить с текущими или Заменить всё
ОранжевыйНеподходящий тип файла в этом модалеСообщение, направляющее к правильному модалу, кнопка Импорт заблокирована
КрасныйОшибка парсинга JSON / неверный форматКнопка Импорт заблокирована

Режимы частичного импорта (фиолетовая панель)

Импорт одного каталога

В панели каталога: Импорт. Проверяет конфликты по ID и названию:

Импорт группы

В панели группы: Импорт — принимает 3 формата:

Все наборы из файла попадают в текущую группу с новыми ID (операция всегда типа "добавить копию" — без конфликтов).

Импорт одного набора

В виде набора: Импорт набора — принимает только justzix-rule. Prompt с 3 опциями:

Полный импорт перезаписывает все настройки (если только это не частичный backup в режиме "Слить"). Сделайте экспорт перед импортом, чтобы иметь backup.

Практическое применение частичного экспорта

Облачная синхронизация

Настройки → Облачная синхронизация открывает модал учётной записи синхронизации. Расширение хранит вашу библиотеку (каталоги, группы, наборы, действия, панели действий, окна на странице) в облаке justzix.com и поддерживает её согласованность на всех устройствах. Синхронизация работает только при выполненном входе — без учётной записи расширение работает только локально.

Учётная запись и ключ синхронизации

Первая синхронизация — разрешение конфликтов

При входе расширение сравнивает локальные данные с данными в облаке:

ВыборЧто делает
Использовать данные из облакаОчищает локальную библиотеку и восстанавливает состояние учётной записи с сервера
Отправить мои локальные данныеЛокальные данные становятся канонической версией — удаляет то, что было в облаке
ОбъединитьСовмещает оба набора — добавляет недостающие сущности, сохраняя существующие

Можно также Отменить — тогда расширение выходит из учётной записи и ничего не меняет.

Постоянная синхронизация

После первой сверки синхронизация работает в фоне: расширение отправляет изменения и подтягивает новые сущности примерно раз в минуту. Изменение, сделанное на одном устройстве, появляется на других через короткое время. Точка статуса рядом с пунктом «Облачная синхронизация» показывает, подключена ли учётная запись.

Защита от «призраков». Каталог, ранее удалённый на одном устройстве, мог «воскреснуть» при входе на следующем. Теперь расширение получает с сервера список удалённых сущностей (tombstones) и не отправляет обратно то, что было удалено на другом устройстве.

Вкладка Статус — библиотека в облаке, история, действия

Вкладка Статус модала синхронизации показывает состояние аккаунта и даёт кнопки действий:

Библиотека в облаке

Счётчики сущностей, находящихся в аккаунте: каталоги, группы, наборы, действия, панели действий, окна на странице. Считаются только достижимые сущности в дереве (у группы должен быть существующий каталог, у набора — группа, у панели/окна — существующий родитель) — согласованно со счётчиками Панели. Обновляются при открытии панели и после ручной синхронизации.

История синхронизаций

Локальный для устройства лог последних синхронизаций. На странице видны последние 10 записей; кнопка «Показать всю историю» открывает окно с полным списком (до 100 записей). Каждая запись содержит:

Лог локальный — не синхронизируется между устройствами. Запись создаётся после каждого тика синхронизации, который что-то реально изменил; ручное «Синхронизировать сейчас» всегда оставляет запись, даже при нулевых изменениях.

Что синхронизируется, а что нет

Статистика использования (применения CSS, запуски JS, показы окон) синхронизируется как отдельные сущности для каждого устройства — карточка Панели суммирует их со всех сопряжённых устройств. Тема и язык синхронизируются как общая настройка учётной записи и применяются при следующем открытии панели на другом устройстве.

Поделиться по ссылке (Shares)

Альтернатива отправке файла 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» в четырёх точках входа, рядом с «Скачать файл»:

Клик открывает модал генерации ссылки: subject + summary что вы предоставляете, radio с TTL (по умолчанию 24h), «Сгенерировать ссылку». После успеха модал переключается на вид результата с двумя копируемыми значениями:

У каждого своя кнопка «Скопировать». Показано также время истечения в локальном часовом поясе.

Панель «Мои ссылки»

Настройки → Мои ссылки (отдельный модал, не часть синхронизации — это две разные функции). Показывает список активных ссылок: счётчик в заголовке X/20 активных · Y MB / 50 MB, а для каждой ссылки карточку с:

Отзыв не отменяет уже скачанное содержимое. Если кто-то успел скачать 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-fullMerge: добавляет все folders/groups/rules со свежими ID

Название нового контейнера: <имя-отправителя или "Import"> <дата> — потом вы можете переименовать / переместить как угодно.

Ошибки получателя

ОшибкаСообщение
Неверный токен«Токен неверный. Проверьте, скопировали ли вы всю ссылку.»
404 not_found«Эта ссылка истекла или была отозвана отправителем. Попросите новую.»
429 rate_limited«Слишком много попыток. Подождите немного и попробуйте снова.»
5xx / network«Проблема с сервером. Попробуйте снова.»

Backend не различает 404 «никогда не существовал» и 404 «истёк / отозван» — намеренно, чтобы не раскрывать, существовал ли токен когда-либо.

Программный вызов действий из JS

Любое действие (со вкладки «Действия» в карточке набора) можно вызвать программно из JS набора или кода другого действия. Глобальное пространство имён window.JZ устанавливается в MAIN world автоматически перед каждым выполнением user-JS.

API — действия

ВызовЧто делает
JZ.click(labelOrId)Кликает программно. Семантика по типу действия: BUTTONel.click(). SELECT static (кнопка с dropdown) → el.click() (открывает popup; пользователь выберет опцию вручную). SELECT js (нативный <select>) → устанавливает value на первую non-disabled опцию и dispatch change. INPUT / TEXTAREA / SLIDERel.click() — внимание: не меняет значение и не запускает handler change. Чтобы установить значение: const el = JZ.action('LBL'); el.value = 'X'; el.dispatchEvent(new Event('change')). TOGGLE3el.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 тоже работает

API — панели и floating button

ВызовЧто делает
JZ.bars()Все контейнеры .jz-actions-bar (ActionBars), видимые на странице.
JZ.barById(id)Элемент панели по data-jz-bar-id.
JZ.floatingBtn()Главная плавающая кнопка #justzix-floating-btn или null (когда скрыта).
Lookup в JZ.click / JZ.action case-insensitive по label, но точный по стабильному action.id. Для действий без label (обычно INPUT) используйте JZ.actionById('a_...').

Context vars в коде действия

В поле «Код JS» действия вам автоматически доступны переменные — внедряемые как const background service worker'ом перед выполнением:

ПеременнаяЧто содержитКогда доступна
$elDOM-элемент этого действия (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 пустой.
stateIdxInteger 0-2 — индекс активного состояния (с которого состояния начался клик).только TOGGLE3
stateLabelString — label активного состояния (макс. 5 символов).только TOGGLE3

Сниппет в UI

В модале настройки действия типа SELECT и INPUT панель «Стабильный ID действия» показывает полный action.id с кнопкой copy и пример JS-селектора (document.querySelector('[data-jz-action-id="..."]')). Под списком BUTTON-ов видны чипы JZ.click('LBL') — клик чипа копирует сниппет в буфер обмена.

Требования

Пример — действие AUTO, запускающее последовательность

// Код действия "AUTO"
JZ.click('LOAD');                          // клик по действию LOAD (например, загружает данные)
setTimeout(() => JZ.click('PROC'), 500);   // 500ms позже PROC (обрабатывает)
setTimeout(() => JZ.click('SAVE'), 1500);  // 1500ms позже SAVE (сохранение)

Пример — JS набора, реагирующий на DOM

После появления динамического элемента кликните действие, удаляющее его:

// Код JS набора — observer на модал, который появляется динамически
const observer = new MutationObserver(() => {
  if (document.querySelector('.cookie-banner')) {
    JZ.click('CCK');  // кликни действие, удаляющее баннер
    observer.disconnect();
  }
});
observer.observe(document.body, { childList: true, subtree: true });

Пример — программная установка значения INPUT

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

Если вы предпочитаете работать с 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 страницы.

Lookup по label (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 из вкладки

Кнопка рядом с полем шаблона URL — вставляет protocol://host/* из активной вкладки. Создание каталога за 2 секунды. Адрес страницы параметров расширения пропускается — берётся самая свежая внешняя вкладка.

Валидация URL на лету

Inline справа от поля URL появляется информация "Совпадает с X открытыми вкладками" или предупреждение. Ловит опечатки немедленно.

История изменений набора

Снимок CSS и JS создаётся через 3 секунды после последнего редактирования (debounce). Лимит 5 версий — самая старая выталкивается. При восстановлении версии текущее содержимое добавляется в историю как самый новый снимок, поэтому вы всегда можете отменить отмену.

Теги и поиск по тегам

В заголовке карточки набора есть поле для тегов — вводите через запятую. Появляются как маленькие метки в сайдбаре рядом с названием набора. Поиск находит и по тегам.

Метка и цвет каталога

У каждого каталога может быть собственная метка на плавающей кнопке (макс. 3 буквы, UPPERCASE) и цвет (color picker). Метка и цвет помогают визуально распознать, какой проект активен на данной странице.

Статистика кликов действий

Каждая кнопка действия считает, сколько раз была нажата. Помогает увидеть, какие действительно используются.

Валидация CSS

Под редактором CSS отображается полоса со списком синтаксических проблем:

Это простая синтаксическая валидация — она не проверяет корректность properties/values. CSS с ошибкой всё равно внедряется (браузер просто пропустит ошибочные правила).

Просмотр JS при импорте

В модале Импорт одного каталога, после загрузки файла, появляется список наборов с метрикой:

Содержимое файла (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 показывает полный код для просмотра перед импортом.

Try/catch изоляция JS

Каждый набор JS выполняется отдельно, с собственным try/catch. Ошибка в одном наборе не блокирует выполнение других. Ошибки логируются в консоль с названием набора/действия и полным stack trace.

Storage quota

Индикатор использования памяти в меню Настройки сайдбара (например, 1.2 MB / 10 MB). Красный выше 80%.

Фильтр "Только активные"

Чекбокс над списком — скрывает наборы, отмеченные как независимые (○), и показывает только активные в каталоге (●). Помогает отсеять "ручные" наборы, когда у каталога их много. Реагирует мгновенно на изменения переключателей.

Обновление расширения

У расширения постоянный ключ в манифесте (в сборке для Firefox — постоянный gecko.id), что означает, что ID расширения неизменен между обновлениями — данные (каталоги, наборы, настройки) сохраняются. JustZix поставляется для четырёх браузеров: Chrome, Edge, Opera и Firefox.

Уведомление о новой версии

В меню Настройки (рядом с номером версии) появляется зелёный баннер «Доступна новая версия», когда сервер публикует пакет новее установленного. Баннер содержит ссылку для скачивания. Проверка тихая — при отсутствии сети баннер просто не показывается.

Процедура обновления (Chrome / Edge / Opera)

  1. Скачайте новый ZIP с обновлением
  2. Распакуйте с перезаписью той же папки, в которой была предыдущая версия
  3. В chrome://extensions/ (Edge: edge://extensions/) найдите расширение и кликните иконку обновления на плитке
  4. Расширение перезагрузится с новыми файлами, данные остаются

Firefox

Сборка для Firefox загружается через about:debugging → «Этот Firefox» → «Загрузить временное дополнение» (указывая на manifest.json в папке justzix_firefox/). Обновление = перезагрузка после перезаписи файлов.

Что может привести к потере данных: Всегда делайте экспорт перед любой операцией с расширением. Если вы используете облачную синхронизацию — данные находятся также в облаке учётной записи.

Примеры CSS

CSS Скрытие рекламы и баннеров
/* Ukryj typowe reklamy */
.ad, .ads, .advertisement,
.banner-ad, [class*="ad-banner"],
[id*="google_ads"] {
  display: none !important;
}

/* Ukryj cookie banner */
.cookie-banner, #cookie-notice {
  display: none !important;
}
CSS Тёмный режим для страницы без поддержки dark mode
html {
  filter: invert(0.92) hue-rotate(180deg);
}
img, video, picture, iframe, [style*="background-image"] {
  filter: invert(1) hue-rotate(180deg);
}

Трюк: инверсия всей страницы и повторная инверсия изображений. Работает на удивление хорошо на большинстве страниц.

CSS Выделение элементов для тестов / e2e
/* Pokoloruj wszystkie elementy z data-testid */
[data-testid] {
  outline: 2px dashed #f59e0b !important;
  outline-offset: -2px;
}
[data-testid]::before {
  content: attr(data-testid);
  position: absolute;
  background: #f59e0b;
  color: white;
  font-size: 10px;
  padding: 2px 4px;
  z-index: 9999;
}
CSS Более читаемая административная панель
/* Zwiększ czytelność tabel admina */
table.admin-list td, table.admin-list th {
  padding: 8px 12px !important;
  font-size: 14px !important;
}

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

/* Naprzemienne wiersze */
table.admin-list tbody tr:nth-child(odd) {
  background: #f9fafb;
}
CSS Более широкий контейнер контента
/* Często strony mają sztywne max-width 1200px - wymuś szerokość */
.container, .main-content, main {
  max-width: 95% !important;
  width: 95% !important;
}
CSS Dev-окружение как очевидное (цветной баннер)
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/*, чтобы не путать окружения.

Примеры JavaScript

JS Авто-заполнение полей логина (dev-окружение)
// Tylko dla dev! Nigdy nie zapisuj prawdziwych haseł
window.addEventListener('load', () => {
  const login = document.querySelector('input[name="login"]');
  const pass = document.querySelector('input[name="password"]');
  if (login) login.value = 'admin@dev.local';
  if (pass) pass.value = 'devpass123';
});
JS Логирование аналитических событий в консоль
// 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);
  };
}

Идеально для отладки конфигурации аналитики на продакшене без правки кода.

JS Авто-пропуск intro / cookie / рекламы
// Co 500ms przez 10s sprawdzaj i klikaj przyciski "Akceptuj"
let attempts = 0;
const interval = setInterval(() => {
  if (++attempts > 20) return clearInterval(interval);

  const buttons = [...document.querySelectorAll('button, a')];
  const target = buttons.find(b =>
    /akceptuj|zgoda|accept all/i.test(b.textContent || '')
  );
  if (target) {
    target.click();
    clearInterval(interval);
  }
}, 500);
JS Добавление горячих клавиш
document.addEventListener('keydown', (e) => {
  // Ctrl+Shift+S - zapisz formularz
  if (e.ctrlKey && e.shiftKey && e.key === 'S') {
    e.preventDefault();
    document.querySelector('button[type="submit"]')?.click();
  }
  // Ctrl+Shift+E - przejdź do edycji (nieprzetestowany przykład)
  if (e.ctrlKey && e.shiftKey && e.key === 'E') {
    e.preventDefault();
    document.querySelector('a.edit-link')?.click();
  }
});
JS Отключение alert / confirm / beforeunload
// Pomijaj denerwujące confirm i beforeunload na czas testów
window.confirm = () => true;
window.alert = (msg) => console.log('[stłumiony alert]', msg);
window.onbeforeunload = null;
window.addEventListener('beforeunload', e => {
  e.stopImmediatePropagation();
}, true);
JS Перенос элемента в другое место DOM
// Pamiętaj - czysty CSS tego nie zrobi gdy rodzic ma display:none
window.addEventListener('load', () => {
  const target = document.querySelector('.important-info');
  const newParent = document.querySelector('.sidebar');
  if (target && newParent) {
    newParent.prepend(target);
  }
});
JS Отображение скрытых полей / элементов
// 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 — очистить форму

Метка: 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 — заполнить тестовые данные

Метка: 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 — добавить тестовый товар в корзину

Метка: 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 — скопировать URL страницы в буфер обмена

Метка: COPY   Цвет: фиолетовый

navigator.clipboard.writeText(location.href).then(() => {
  console.log('Skopiowano:', location.href);
});
ДЕЙСТВИЕ TKN — показать токен аутентификации

Метка: 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 — показать API-запросы в консоли

Метка: 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 — показать инфо об окружении

Метка: 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));

Сценарии использования

1. Работа с несколькими клиентами / проектами

У каждого проекта свой каталог со своим шаблоном URL. Вы можете иметь каталоги:

В правой панели приватные каталоги можно быстро включать/выключать. Экспорт одного каталога позволяет поделиться конфигурацией с командой.

2. Окружение разработки с визуальной пометкой

На каждом dev/staging добавьте баннер и авто-логин. Один набор CSS (баннер) и один JS (авто-заполнение). Создаёте отдельный каталог для каждого окружения, всё включается простым чекбоксом.

3. Инструменты для product-менеджера / QA

Панель действий с кнопками: FILL (тестовые данные), CART (тестовая покупка), CLR (очистить форму), STATE (показать состояние приложения в alert). Без программиста, без консоли, один клик.

4. Модификации публичных страниц

Любимые блоги/документация с лучшей читаемостью — более широкий контейнер, шрифт, тёмный режим. Каждая страница в отдельном каталоге, "Активный" оставлен навсегда включённым.

5. Отладка аналитики / GTM

Один набор на каждый домен с JS, перехватывающим dataLayer.push и gtag. Включаете его, когда клиент сообщает о проблеме с аналитикой, без правки кода страницы.

6. Работа с административными панелями

Шаблон *://*.justzix.com/admin/* и CSS, улучшающий таблицы, списки, формы. Плюс действие "Тестовый фильтр", автоматически устанавливающее фильтры для типичного workflow.

7. Безопасные тесты на продакшене

Действие 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');

Частые проблемы и решения

JavaScript не выполнился

CSS не работает

Плавающая кнопка не появляется

После обновления расширения потерял данные

У расширения постоянный ключ в манифесте — последующие обновления сохраняют данные. Если данные всё же исчезли:

Позиции кнопок/панелей сбрасываются

Это нормально — позиции хранятся на окно браузера в памяти сессии (chrome.storage.session). После закрытия окна позиции исчезают, в новом окне вы стартуете с дефолтных. Позиция переживает навигацию между вкладками в том же окне.

Частичный экспорт пропустил какие-то глобальные настройки

Да — частичный экспорт содержит только отмеченные каталоги и наборы плюс связанные с ними настройки видимости. Не содержит позиций плавающих панелей (они на окно) и других глобальных предпочтений. Для полного backup используйте режим "Всё".

Частичный импорт перезаписал ранее не существовавший каталог

Режим "Слить" сопоставляет каталоги по ID. Если импортируемый файл имел ID, конфликтующий с существующим каталогом (например, тот же файл уже однажды импортировался), появляется prompt: 1 перезаписать / 2 копия (по умолчанию, безопасно) / Отмена. Выбирая 2, вы получаете копии с новыми ID и припиской "(import)" в названии каталога — ничего не теряете.

Дерево каталогов не раскрывается

Стрелка раскрытия появляется только если у каталога есть наборы. Пустой каталог имеет приглушённую точку вместо стрелки. Состояние раскрытия каждого каталога запоминается в chrome.storage.local.

Не вижу кнопку Экспорт/Импорт каталога

Эти кнопки в панели каталога (вверху области редактирования), рядом с кнопкой "Удалить каталог". Не путать с кнопками в меню Настройки, которые касаются всех настроек.

AI Helper не отвечает

Конфликт с Content Security Policy

JS правил и действий выполняется в контексте страницы по многоуровневой стратегии, устойчивой к строгим правилам Content Security Policy. Большинство страниц — включая крупные сервисы вроде Facebook — работают сразу, без какой-либо настройки.

Страницы с очень строгим CSP (некоторые банки, корпоративные сайты) могут блокировать выполнение. Чтобы JS работал на любой странице, включите для JustZix опцию «Разрешить пользовательские скрипты»: откройте chrome://extensions, перейдите к сведениям о JustZix и включите переключатель (в более старых браузерах также нужен режим разработчика). Когда страница блокирует выполнение, окно JavaScript / Консоль JS показывает соответствующее сообщение.


JustZix — инструкция