diff --git a/README.md b/README.md
index b44a670..9c9cb45 100644
--- a/README.md
+++ b/README.md
@@ -71,7 +71,12 @@ GSMTAP into this analyser.
and AUTH commands get distinctive styling in map view
- Sessions with deep links (`#session=N`), PCAP import (`.pcap/.pcapng/.cap`),
COMPRION trace import (the Device Manager *ISO Protocol Layer* text export),
- search and type filtering
+ search and a **multi-select command filter** — pick any number of commands
+ and/or the conversation presets (*Proactive sessions*: FETCH, TERMINAL
+ PROFILE and every command answered with SW 91xx; *Proactive + events*: the
+ same plus ENVELOPE; *File operations*: SELECT, READ/UPDATE BINARY and
+ READ/UPDATE RECORD, with the GET RESPONSE carrying a selected command's
+ data)
- Installable PWA, dark theme, English/Russian UI
## Prerequisites
diff --git a/README_RUS.md b/README_RUS.md
index 06c9f54..8b80907 100644
--- a/README_RUS.md
+++ b/README_RUS.md
@@ -73,7 +73,12 @@ SIM/UICC из UDP-потока GSMTAP (или импортирует файлы
TERMINAL RESPONSE, ENVELOPE и AUTH-команды выделяются в режиме карты
- Сессии с прямыми ссылками (`#session=N`), импорт PCAP
(`.pcap/.pcapng/.cap`), импорт трасс COMPRION (текстовый экспорт
- «ISO Protocol Layer» из Device Manager), поиск и фильтрация по типу
+ «ISO Protocol Layer» из Device Manager), поиск и **фильтр команд с
+ множественным выбором** — любые команды и/или готовые пресеты («Проактивные
+ сессии»: FETCH, TERMINAL PROFILE и все команды с ответом SW 91xx;
+ «Проактивные + события»: то же плюс ENVELOPE; «Файловые операции»: SELECT,
+ READ/UPDATE BINARY и READ/UPDATE RECORD, вместе с GET RESPONSE, несущим
+ данные выбранной команды)
- Устанавливаемая PWA, тёмная тема, интерфейс на английском/русском
## Требования
diff --git a/frontend/index.html b/frontend/index.html
index 56ffbbc..87080db 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -121,6 +121,24 @@ body { font: 14px/1.5 system-ui, sans-serif; background: var(--bg); color: var(-
.trace-topbar button.connect { background: var(--warn); color: #0f172a; }
.trace-topbar button.connect:hover { background: var(--warn-hover); }
.trace-topbar button.disabled { background: var(--bg-input); color: var(--text-muted); cursor: not-allowed; opacity: 0.6; }
+
+/* Command filter: a button + a checkbox dropdown (presets and commands) */
+.filter-dropdown { position: relative; }
+#filter-btn { background: var(--bg-input); color: var(--text); border: 1px solid var(--border);
+ border-radius: 4px; padding: 8px 12px; cursor: pointer; font-weight: 400;
+ max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+#filter-btn:hover { background: var(--border); }
+.filter-menu { position: absolute; top: calc(100% + 6px); left: 0; z-index: 60; min-width: 260px;
+ max-height: 60vh; overflow-y: auto; padding: 6px; background: var(--bg-panel);
+ border: 1px solid var(--border); border-radius: 4px; box-shadow: 0 8px 24px var(--modal-bg); }
+.filter-item { display: flex; align-items: center; gap: 8px; padding: 5px 8px; border-radius: 4px;
+ cursor: pointer; font-size: 13px; white-space: nowrap; }
+.filter-item:hover { background: var(--bg-input); }
+.filter-item input { margin: 0; cursor: pointer; }
+.filter-item .filter-count { margin-left: auto; color: var(--text-muted); font-size: 12px; }
+.filter-menu .filter-heading { margin: 6px 8px 2px; color: var(--text-muted); font-size: 11px;
+ text-transform: uppercase; letter-spacing: 1px; }
+.filter-sep { height: 1px; margin: 6px 4px; background: var(--border); }
.trace-main { display: flex; flex: 1; overflow: hidden; }
.trace-left { flex: 1; display: flex; flex-direction: column; overflow: hidden; }
@@ -352,10 +370,11 @@ body { font: 14px/1.5 system-ui, sans-serif; background: var(--bg); color: var(-
-
-
+
Filter
+
+
+
+