diff --git a/.paul/STATE.md b/.paul/STATE.md
index cd0666d..c32cb79 100644
--- a/.paul/STATE.md
+++ b/.paul/STATE.md
@@ -1,9 +1,9 @@
## Current Position
-Phase: 09-unit-pricing - Complete
-Plan: 09-01 complete
+Phase: 10-select2-global-search - Complete
+Plan: 10-01 complete
Status: UNIFY complete. Loop closed - ready for next PLAN.
-Last activity: 2026-05-05T00:00:00Z - Unified .paul/phases/09-unit-pricing/09-01-SUMMARY.md
+Last activity: 2026-05-16T13:40:00Z - Unified .paul/phases/10-select2-global-search/10-01-SUMMARY.md
## Loop Position
@@ -15,7 +15,7 @@ PLAN --> APPLY --> UNIFY
## Session Continuity
-Last session: 2026-05-05
-Stopped at: Phase 09 complete
-Next action: Prepare next phase with $paul-plan (po uzupelnieniu PROJECT.md/ROADMAP.md lub wskazaniu kolejnego celu)
-Resume file: .paul/phases/09-unit-pricing/09-01-SUMMARY.md
+Last session: 2026-05-16
+Stopped at: Phase 10 complete
+Next action: Prepare next phase with /paul:plan (po uzupelnieniu PROJECT.md/ROADMAP.md lub wskazaniu kolejnego celu)
+Resume file: .paul/phases/10-select2-global-search/10-01-SUMMARY.md
diff --git a/.paul/changelog/2026-05-16.md b/.paul/changelog/2026-05-16.md
new file mode 100644
index 0000000..28395e3
--- /dev/null
+++ b/.paul/changelog/2026-05-16.md
@@ -0,0 +1,18 @@
+# 2026-05-16
+
+## Co zrobiono
+
+- [Phase 10, Plan 01] Globalny auto-init Select2 z polem wyszukiwania dla selectow >4 opcji
+- Nowy modul `libraries/adspro-select2-autoinit.js` (auto-init na document.ready + ajaxComplete debounce 150ms)
+- Wyszukiwarka odblokowana dla "Grupa reklam", "Kampania", "Klient" na /campaign_terms (opt-in `data-adspro-select2="true"`)
+- Ujednolicony styl Select2 — globalne reguly w `layout/style.scss` i `layout/style.css`
+- Usuniety duplikowany blok CSS .products-page .select2-* i funkcja init_products_scope_select_search() (~80 linii)
+
+## Zmienione pliki
+
+- `libraries/adspro-select2-autoinit.js` (nowy)
+- `templates/site/layout-logged.php`
+- `layout/style.scss`
+- `layout/style.css`
+- `templates/products/main_view.php`
+- `templates/campaign_terms/main_view.php`
diff --git a/.paul/governance/governance_2026-05-16.jsonl b/.paul/governance/governance_2026-05-16.jsonl
new file mode 100644
index 0000000..236af9c
--- /dev/null
+++ b/.paul/governance/governance_2026-05-16.jsonl
@@ -0,0 +1,21 @@
+{"ts":"2026-05-16T13:32:28Z","tool":"Bash","cmd":"mkdir -p .paul/phases/10-select2-global-search\",\"description\":\"Create phase 10 directory\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutputExp","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:33:32Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\phases\\\\10-select2-global-search\\\\10-01-PLAN.md","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:33:38Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:35:05Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\libraries\\\\adspro-select2-autoinit.js","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:35:13Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\templates\\\\site\\\\layout-logged.php","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:35:25Z","tool":"Bash","cmd":"wc -l layout/style.scss; tail -3 layout/style.scss\",\"description\":\"Get scss end\"},\"tool_response\":{\"stdout\":\"3760 layout/style.scss\\n color: #000;\\r\\n justify-content: flex-start;\\r\\n","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:36:00Z","tool":"Bash","cmd":"printf '%s' '.select2-container{width:100% !important}.select2-container--default .select2-selection--single{height:38px;border:1px solid #e2e8f0;border-radius:6px;background:#fff}.select2-container--","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:36:14Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\templates\\\\products\\\\main_view.php","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:36:20Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\templates\\\\products\\\\main_view.php","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:36:25Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\templates\\\\products\\\\main_view.php","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:36:32Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\templates\\\\campaign_terms\\\\main_view.php","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:36:35Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\templates\\\\campaign_terms\\\\main_view.php","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:36:38Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\templates\\\\campaign_terms\\\\main_view.php","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:36:49Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\templates\\\\campaign_terms\\\\main_view.php","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:36:53Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\templates\\\\campaign_terms\\\\main_view.php","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:36:59Z","tool":"Bash","cmd":"php -l libraries/adspro-select2-autoinit.js 2>&1 | head -3; node --check libraries/adspro-select2-autoinit.js && echo \"JS OK\"\\nphp -l templates/products/main_view.php 2>&1 | tail -2\\nphp -l templa","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:38:25Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:40:23Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\phases\\\\10-select2-global-search\\\\10-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:40:35Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\changelog\\\\2026-05-16.md","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T13:40:41Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/adsPRO"}
+{"ts":"2026-05-16T14:12:58Z","tool":"Bash","cmd":"git status; echo \"---\"; git log --oneline -5\",\"description\":\"Check status and recent commits\"},\"tool_response\":{\"stdout\":\"On branch main\\nYour branch is up to date with 'origin/main'.\\n\","cwd":"/c/visual studio code/projekty/adsPRO"}
diff --git a/.paul/phases/10-select2-global-search/10-01-PLAN.md b/.paul/phases/10-select2-global-search/10-01-PLAN.md
new file mode 100644
index 0000000..323fd27
--- /dev/null
+++ b/.paul/phases/10-select2-global-search/10-01-PLAN.md
@@ -0,0 +1,264 @@
+---
+phase: 10-select2-global-search
+plan: 01
+type: execute
+wave: 1
+depends_on: []
+files_modified:
+ - libraries/adspro-select2-autoinit.js
+ - templates/site/layout-logged.php
+ - layout/style.scss
+ - layout/style.css
+ - templates/products/main_view.php
+ - templates/campaign_terms/main_view.php
+autonomous: false
+delegation: off
+---
+
+
+## Goal
+Globalny auto-init Select2 dla wszystkich `
+
+
+## Project Context
+@.paul/PROJECT.md
+@.paul/ROADMAP.md
+@.paul/STATE.md
+@.paul/codebase/architecture.md
+
+## Source Files
+@templates/site/layout-logged.php
+@templates/products/main_view.php
+@templates/campaign_terms/main_view.php
+@layout/style.scss
+
+
+- **Zakres** — Globalny czy lokalny?
+ → Odpowiedź: Globalny auto-init w layout; usunąć dotychczasowe indywidualne inicjalizacje gdzie auto-init je pokryje (zostawiamy specjalne przypadki jak googleCategory z `data` API i własnym placeholderem).
+- **Styl/UX** — allowClear i jednolity styl jak na /products?
+ → Odpowiedź: Tak — allowClear włączony dla selectów z pustą opcją (value="") oraz styl uogólniony z `.products-page` na cały layout.
+- **Dynamika** — sposób obsługi dynamicznie ładowanych opcji?
+ → Odpowiedź: Mniej problemów = minimalna zmiana. Auto-init oferuje helper `window.adsproSelect2Init($root)` wywoływany po AJAX-budowanym `
+
+
+
+
+## AC-1: Select "Grupa reklam" na /campaign_terms ma wyszukiwarkę
+```gherkin
+Given użytkownik jest na /campaign_terms i wybrał klienta + kampanię (załadowane >4 grupy reklam)
+When kliknie w select "Grupa reklam"
+Then otwiera się dropdown Select2 z polem wyszukiwania
+And wpisanie fragmentu nazwy filtruje listę
+And wybór grupy działa identycznie jak wcześniej (load_search_terms / load_negative)
+```
+
+## AC-2: Globalny auto-init pokrywa wszystkie selecty z >4 opcjami
+```gherkin
+Given dowolna podstrona w layout-logged ma `
+
+
+
+
+ Task 1: Utworzyć moduł auto-init Select2
+ libraries/adspro-select2-autoinit.js
+
+ Utworzyć nowy plik z modułem auto-init. Wymagania:
+
+ 1. Sprawdza `typeof $.fn.select2 !== 'undefined'` przed działaniem.
+ 2. Eksportuje `window.adsproSelect2Init($root)`:
+ - `$root` opcjonalny (domyślnie `$(document.body)`)
+ - Wyszukuje `select` w `$root` filtrując:
+ * pomija `select[multiple]` z natywną logiką jeśli ma `data-adspro-select2="false"` (multiple jest OK domyślnie)
+ * pomija `.no-select2` lub `[data-adspro-select2="false"]`
+ * pomija jeśli `$el.data('select2')` już istnieje (już zainicjalizowane)
+ * pomija jeśli select jest w `.select2-container` (wewnątrz Select2 wyświetlacza)
+ * pomija jeśli rodzic ma klasę `.dataTables_length` (długość strony DataTables — krótka lista)
+ * Inicjalizuje gdy: `select.options.length > 4` LUB ma atrybut `data-adspro-select2="true"`
+ - Dla każdego pasującego selecta:
+ * options.width = '100%'
+ * options.allowClear = true jeśli pierwsza `
+ Plik istnieje, `node -c` lub `php -r "echo file_exists('libraries/adspro-select2-autoinit.js') ? 'OK' : 'FAIL';"` zwraca OK; w przeglądarce DevTools → `typeof window.adsproSelect2Init === 'function'`.
+ AC-2, AC-3 częściowo (silnik gotowy)
+
+
+
+ Task 2: Załadować auto-init w layout i uogólnić CSS Select2
+ templates/site/layout-logged.php, layout/style.scss, layout/style.css
+
+ 1. W `templates/site/layout-logged.php` po linii `` (linia ~35) dodać:
+ ```html
+
+ ```
+ (Uwaga: w pliku są dwa źródła select2 — local i CDN. Auto-init dorzucamy raz, po obu.)
+
+ 2. W `layout/style.scss` dodać nową sekcję `// === Select2 global overrides ===` z regułami zaadaptowanymi z `templates/products/main_view.php` linie 136-189. Selektory globalne (BEZ prefiksu `.products-page`):
+ - `.select2-container` width 100%
+ - `.select2-container--default .select2-selection--single` (height 38, border #e2e8f0, radius 6, bg #fff)
+ - `.select2-selection__rendered` (line-height 36, padding 12/36, color #2d3748)
+ - `.select2-selection__placeholder` (#6c757d)
+ - `.select2-selection__arrow` (height 36, right 8)
+ - `.select2-container--focus .select2-selection--single` (border #6690f4, shadow rgba(102,144,244,.1))
+ - `.select2-dropdown` (border #e2e8f0, radius 6)
+ - `.select2-search--dropdown .select2-search__field` (border, radius, height 34, font 14)
+ - `.select2-results__option` (font 14)
+ - `.select2-container--default .select2-results__option--highlighted[aria-selected]` (bg #6690f4, color #fff)
+
+ 3. Skompilować SCSS do `layout/style.css` (lub dopisać te same reguły bezpośrednio do `layout/style.css` jeśli SCSS nie jest auto-budowane w projekcie — sprawdzić nagłówek pliku style.css czy ma marker auto-generated). Jeżeli style.css jest commitowane ręcznie, dopisać identyczny blok CSS na końcu pliku style.css.
+
+ Avoid:
+ - Nie usuwać żadnych innych istniejących reguł z style.scss/style.css.
+ - Nie zmieniać kolejności ładowania Select2 CSS (local + CDN — obecny stan zachować).
+
+ Po odświeżeniu dowolnej strony layout-logged: w DevTools `$('.select2-container').length > 0` na stronach z natywnymi selectami z >4 opcjami; computed style selecta = height 38px.
+ AC-2, AC-4
+
+
+
+ Task 3: Usunąć redundantne Select2 w products i podłączyć helper w campaign_terms
+ templates/products/main_view.php, templates/campaign_terms/main_view.php
+
+ **W `templates/products/main_view.php`:**
+ 1. Usunąć blok CSS `.products-page .select2-*` (linie ~136-189) — zastąpiony przez globalne reguły z Task 2.
+ 2. Usunąć funkcję `init_products_scope_select_search()` (linie ~610-631) ORAZ jej wywołanie w linii ~723.
+ - Jeśli wywołanie jest częścią innego bloku, zostawić sąsiednie linie nietknięte; tylko skreślić wywołanie funkcji.
+ 3. NIE ruszać `$googleCategory.select2({...})` w linii ~2414 (ma własny `data:`, `placeholder`, `allowClear` — auto-init go pominie bo będzie już zainicjalizowany przed/po; dodać przed tym wywołaniem klasę `no-select2` na `$googleCategory` LUB zostawić — auto-init nie nadpisuje istniejących instancji, więc bezpiecznie).
+ 4. Zachować wszystkie `$x.trigger('change.select2')` (linie ~1112, 1133, 1159, 1178) — nadal aktualne.
+
+ **W `templates/campaign_terms/main_view.php`:**
+ 1. W funkcji `load_campaigns()` po linii `$campaign_select.val( restore_campaign_id );` (~1791) i ogólnie po wszystkich append() w success: dodać:
+ ```js
+ if ( typeof window.adsproSelect2Init === 'function' ) window.adsproSelect2Init( $campaign_select.parent() );
+ $campaign_select.trigger( 'change.select2' );
+ ```
+ 2. W funkcji `load_ad_groups()` po pętli `ad_groups.forEach` (po ~1738): analogicznie dla `$ad_group_select`.
+ 3. Dla `#terms_client_id` (jeśli ma >4 opcji od razu po PHP render) auto-init z `$(document).ready` go pokryje — nie trzeba zmian; ale dla pewności dodać atrybut `data-adspro-select2="true"` w `
+
+ 1. Strona `/products` — wybór kampanii i grupy reklam działa, wyszukiwarka obecna, wygląd niezmieniony.
+ 2. Strona `/campaign_terms` — po wyborze klienta + kampanii select "Grupa reklam" otwiera dropdown z wyszukiwarką; filtrowanie po wpisaniu fragmentu działa; wybór wczytuje termy.
+ 3. `git diff templates/products/main_view.php` pokazuje usunięcie bloków CSS i funkcji init.
+
+ AC-1, AC-5
+
+
+
+
+ Globalny auto-init Select2 + jednolity styl + wyszukiwarka w "Grupa reklam" na /campaign_terms.
+
+
+ 1. Otwórz `https://adspro.projectpro.pl/campaign_terms`.
+ 2. Wybierz klienta, potem kampanię — poczekaj na załadowanie grup reklam.
+ 3. Kliknij select "Grupa reklam" → powinien pokazać się dropdown Select2 z polem wyszukiwania na górze.
+ 4. Wpisz fragment nazwy grupy — lista filtruje się na żywo.
+ 5. Wybierz grupę → tabela "Search terms" / "Negative" przeładowuje się jak wcześniej.
+ 6. Kliknij X (jeśli pierwsza opcja "- wszystkie grupy -") → wraca do "- wszystkie grupy -".
+ 7. Przejdź na `/products` — sprawdź że wybór kampanii i grupy reklam nadal działa (regresja).
+ 8. Przejdź na kilka innych podstron (/campaigns, /clients, /feeds) — sprawdź czy żaden select nie wygląda zepsuto.
+ 9. Sprawdź w DevTools console: brak błędów JS po załadowaniu strony i po zmianach w selectach.
+
+ Wpisz "approved" aby kontynuować lub opisz problemy do naprawy
+
+
+
+
+
+
+## DO NOT CHANGE
+- `libraries/select2/**` — biblioteka Select2 (nie modyfikujemy źródeł).
+- Logika AJAX endpointów `/campaign_terms/*` i `/products/*` (tylko frontend).
+- `$googleCategory.select2(...)` w `products/main_view.php` (~2414) — działa z własną konfiguracją.
+- Inne miejsca używające `.trigger('change.select2')` — zachować.
+- Backend (controls/factory/services) — bez zmian.
+
+## SCOPE LIMITS
+- Tylko layout-logged (panel zalogowanego użytkownika). Nie ruszamy layout-unlogged (`/login` itp.).
+- Nie wprowadzamy nowych bibliotek ani nie aktualizujemy wersji Select2.
+- Nie zmieniamy multi-select (`
+
+
+Before declaring plan complete:
+- [ ] Plik `libraries/adspro-select2-autoinit.js` istnieje i jest podłączony w layout-logged.php
+- [ ] Globalne style Select2 w `layout/style.css`
+- [ ] Blok `.products-page .select2-*` usunięty z `templates/products/main_view.php`
+- [ ] Funkcja `init_products_scope_select_search()` i jej wywołanie usunięte
+- [ ] `data-adspro-select2="true"` na 3 selectach w `templates/campaign_terms/main_view.php`
+- [ ] `window.adsproSelect2Init(...)` wywoływane po load_campaigns/load_ad_groups w campaign_terms
+- [ ] Brak błędów JS w konsoli na /campaign_terms i /products
+- [ ] Checkpoint human-verify zaakceptowany
+
+
+
+- Wszystkie zadania ukończone
+- Wszystkie kryteria akceptacji spełnione
+- Brak regresji wizualnej/funkcjonalnej na /products
+- Wyszukiwarka działa na /campaign_terms → Grupa reklam (i na każdym innym selecie z >4 opcjami w layout-logged)
+
+
+
diff --git a/.paul/phases/10-select2-global-search/10-01-SUMMARY.md b/.paul/phases/10-select2-global-search/10-01-SUMMARY.md
new file mode 100644
index 0000000..4c1a8b4
--- /dev/null
+++ b/.paul/phases/10-select2-global-search/10-01-SUMMARY.md
@@ -0,0 +1,133 @@
+---
+phase: 10-select2-global-search
+plan: 01
+subsystem: ui
+tags: [select2, jquery, ui, frontend, autoinit]
+
+requires:
+ - phase: existing layout
+ provides: Select2 library already loaded via layout-logged.php
+provides:
+ - Globalny auto-init Select2 dla wszystkich