Czym jest focus state? - icomMedia

Czym jest focus state?

Czym jest focus state?

Stan fokusu (focus state) to wyróżniona faza działania elementu interfejsu, w której ten element jest gotowy przyjąć dane, komendy lub aktywację z urządzenia wejściowego. W praktyce oznacza to, że pole formularza, link, przycisk, kontrolka lub kontener z logiką interaktywną jest “na celowniku” klawiatury, czytnika ekranu, pilota telewizyjnego albo innego mechanizmu sterowania. Zrozumienie i prawidłowe zaimplementowanie stanu fokusu jest podstawowe dla jakości nawigacji, jakości interakcji i dla ogólnej ergonomii serwisów WWW, a także dla zgodności z wymaganiami prawnymi i standardami dostępności.

Definicja i rola stanu fokusu

Stan fokusu to właściwość elementu interaktywnego, która informuje przeglądarkę i użytkownika, że ten element jest aktywny z punktu widzenia mechanizmów wejścia. W HTML i DOM fokus jest pojedynczy na dokument; zawsze “ktoś” ma fokus lub żaden element nie jest sfokusowany (np. po załadowaniu strony, dopóki użytkownik nie rozpocznie interakcji, choć wiele witryn ustawia fokus programowo). Kiedy element uzyskuje fokus, wyzwalane są odpowiednie zdarzenia, np. focus, a po utracie blur. Przeglądarka może też zmieniać widoczny wskaźnik, zwykle ramkę lub poświatę dookoła elementu.

Fokus różni się od aktywnego kliknięcia (active) i od stanu najechania (hover). Hover jest efektem położenia wskaźnika myszy; active to krótkotrwały stan w czasie aktywacji; fokus jest bardziej trwały i niezależny od myszy, co czyni go kluczowym dla użytkowników nawigujących bez wskaźnika. Jest także kluczowy dla osób korzystających z technologii wspomagających, takich jak czytniki ekranu, które mapują fokus na pozycję w drzewie dostępności i na element, z którym można wejść w interakcję. W tym sensie fokus pełni rolę mostu między logiką aplikacji a percepcją i działaniem użytkownika, zapewniając możliwość precyzyjnej i przewidywalnej obsługi interfejsu.

Stan fokusu ma charakter modalny: w danej chwili fokus może znajdować się tylko na jednym elementu w danym kontekście przeglądania (z wyjątkiem złożonych przypadków z iframe lub shadow DOM, gdzie istnieją zagnieżdżone konteksty). Zmiana fokusu powinna być przewidywalna, zgodna z wizualnym porządkiem interfejsu oraz z logiką zadania, które wykonuje użytkownik. Kiedy fokus ląduje “gdzieś indziej” niż oczekiwano, użytkownik może utracić orientację, co skutkuje błędami, frustracją i spadkiem wskaźników konwersji.

W projektowaniu i implementacji kluczowe jest zapewnienie widocznego wskaźnika fokusu. Użytkownik musi wiedzieć, na czym w danym momencie znajduje się fokus. Brak takiego wskaźnika jest jednym z najpoważniejszych błędów przeciwko zasadom dostępność, ponieważ uniemożliwia nawigację poprzez klawiaturę i utrudnia efektywne działanie osobom z ograniczeniami widzenia lub motoryki. Co więcej, nawet dla osób obsługujących stronę myszą, wskaźnik fokusu bywa użyteczny w złożonych interfejsach, np. w edytorach treści, kreatorach czy tabelach z dużą liczbą pól.

Elementy fokusowalne i kolejność tabulacji

Do najczęściej fokusowalnych elementów należą linki (a z atrybutem href), przyciski (button), pola formularzy (input, select, textarea), kontrolki szczególne (details/summary), media z kontrolkami (audio i video z controls) oraz elementy niestandardowe, które uzyskują fokus dzięki tabindex. Nie każdy element semantycznie powinien otrzymywać fokus: nadmierne dodawanie punktów fokusu rozbija płynność nawigacji, zaś brak fokusu na krytycznych kontrolkach uniemożliwia ich obsługę klawiaturą.

Kolejność tabulacji to droga, jaką fokus podąża przy użyciu klawisza Tab (oraz Shift+Tab wstecz). Domyślnie wynika ona z kolejności źródła (ang. source order). Ma to znaczenie: projektując layouty z użyciem CSS Grid lub Flexbox, można wizualnie przestawiać elementy, ale kolejność fokusu nadal wynika z porządku w dokumencie. Aby zachować spójność percepcyjną, zaleca się, by porządek DOM odpowiadał porządkowi wizualnemu.

Atrybut tabindex umożliwia modyfikowanie fokusowalności. Wartość 0 dodaje element do naturalnego porządku tabulacji na podstawie źródła; wartość -1 czyni element fokusowalnym tylko programowo (np. doFocus() w odpowiedzi na zdarzenie), ale wyłącza go z sekwencji Tab; wartości dodatnie ustawiają priorytet względem innych, jednak ich użycie rzadko jest pożądane, ponieważ prowadzi do nieintuicyjnego zachowania oraz utrudnia utrzymanie. Najbezpieczniejszym wzorcem jest wykorzystanie tabindex=0 dla elementów roli przycisków lub punktów przełączalnych, gdy muszą być osiągalne klawiaturą, oraz tabindex=-1 dla celów tymczasowego ustawienia fokusu wewnątrz kontrolowanych kontenerów (np. w pułapkach fokusu modalnych).

Specjalnym przypadkiem jest tzw. roving tabindex, wykorzystywany w złożonych komponentach jak listbox, menubar czy zakładki. Wzorzec ten utrzymuje tylko jeden element o tabindex=0 naraz, zaś pozostałe mają tabindex=-1. Strzałki zmieniają, który element jest aktywny, a Tab opuszcza komponent. Zapewnia to spójne zachowanie z oczekiwaniami klawiaturowymi oraz minimalizuje liczbę kroków potrzebnych do przejścia przez interfejs.

Warto pamiętać o zachowaniu fokusu w nowych kontekstach: po otwarciu modala fokus powinien przejść do pierwszego sensownego elementu w modalnym oknie, a po zamknięciu wrócić do kontrolki, która modal otworzyła. To samo dotyczy off-canvas, paneli bocznych, podpowiedzi typu combobox czy menu rozwijanych. Spójna i przewidywalna migracja fokusu to fundament użyteczność.

Stylowanie: selektory, wskaźniki i kontrast

Mechanizmy CSS obejmują selektory :focus, :focus-visible i :focus-within. :focus działa zawsze, gdy element ma fokus, niezależnie od sposobu jego uzyskania; :focus-visible próbuje zastosować się tylko wtedy, gdy wskaźnik fokusu jest oczekiwany (np. przy wejściu z klawiatury). Dzięki temu pozwala zachować czystość wizualną dla użytkowników korzystających z myszy, a jednocześnie nie pozbawia wskaźnika klawiaturowych nawigujących. :focus-within jest użyteczny do podświetlania kontenera, gdy fokus znajdzie się w którymś z jego potomków, co bywa kluczowe w grupach pól czy w kartach.

Tradycyjny wskaźnik to właściwość outline. Jest niezależna od modelu pudełkowego i nie wpływa na rozmiar elementu. Wiele zespołów stylizuje wskaźnik za pomocą border, box-shadow albo pseudo-elementów, aby uzyskać spójność brandową. Decydując się na niestandardowy wskaźnik, trzeba zadbać o rozpoznawalność i wystarczający kontrast względem tła i sąsiadujących elementów. Według zaleceń kryteriów WCAG 2.2 (Focus Appearance), wskaźnik powinien być wyraźny: mieć odpowiednią grubość i powierzchnię oraz osiągać co najmniej stosunek kontrastu 3:1 względem barwy otoczenia. W praktyce stosuje się jasne i ciemne motywy wskaźnika, dostosowujące się do trybu interfejsu, a także unika się subtelnych, zbyt mało widocznych odcieni.

Warto łączyć :focus i :focus-visible w parach: reguły :focus definiują “awaryjny” wskaźnik, a :focus-visible nadpisuje go w przeglądarkach, które potrafią rozróżnić metodę wprowadzenia. Typowy wzorzec to :focus { outline: 2px solid }, a następnie bardziej wyrafinowane :focus-visible z wyróżnikiem lepiej pasującym do identyfikacji wizualnej. Równocześnie można schować wskaźnik, gdy mamy silny argument, żeby nie pojawiał się po kliknięciu myszą, ale nigdy nie należy pozbawiać wskaźnika użytkowników korzystających z klawiatury.

Interakcja wskaźników z ruchomymi i półprzezroczystymi elementami wymaga testów. Wskaźnik oparty o box-shadow może zostać przycięty przez overflow: hidden w rodzicu; outline bywa niewidoczny w trybach wysokiego kontrastu systemowego; a w środowiskach Forced Colors należałoby przewidzieć spójne zachowanie (np. pozwolić systemowi narzucić kolory). Dodatkowo należy szanować preferencje prefer-reduced-motion: animowane wskaźniki (np. pulsujący cień) mogą rozpraszać, a dla części użytkowników być problematyczne.

Dobrym zwyczajem jest standaryzacja wskaźników jako tokenów design systemu: określamy domyślne i alternatywne style wskaźników, ich nazwane warianty oraz zasady stosowania na różnych komponentach — przyciskach, polach, kartach, tabach, elementach list i siatek. Umożliwia to spójność wizualną i ułatwia skalowanie w dużych zespołach.

Zarządzanie fokusem w JavaScript i frameworkach

API przeglądarki oferuje metody focus i blur dla elementów, a także dokument-level focus events. Programowe ustawianie fokusu jest typowym zadaniem w modalach, podczas zmiany podstron w SPA oraz w komponentach sterowanych klawiaturą. Należy jednak unikać “kradzieży” fokusu użytkownikowi: automatyczny focus po każdym załadowaniu sekcji lub w trakcie wpisywania danych może powodować utratę kontekstu i błędy. Reagujmy inteligentnie — ustawiajmy fokus tam, gdzie użytkownik logicznie go oczekuje, i zawsze zapewniajmy powrót po zamknięciu tymczasowego kontekstu.

Istotnym mechanizmem jest pułapka fokusu (focus trap), polegająca na ograniczeniu tabulacji do obszaru aktywnego, np. modala. Lista elementów dziewczyn do tabulacji powinna być aktualizowana dynamicznie, ponieważ w trakcie życia komponentu elementy mogą być włączane i wyłączane. Pomocny jest atrybut inert na kontenerach tła (jeśli wspierany), który wyłącza je z interakcji i z drzewa akcji. Element dialog pozwala obsłużyć wiele niuansów “modalności” zgodnie z natywną semantyką; w połączeniu z metodami showModal i close umożliwia tworzenie modali przyjaznych dla klawiatury i technologii wspomagających.

W komponentach niestandardowych (np. przyciski z div) należy zapewnić prawidłową rolę, obsługę klawiszy Enter/Space i fokusowalność. To tutaj wchodzą w grę atrybuty i stany z domeny ARIA, ale tylko jako uzupełnienie brakującej semantyki — nie zastępują one natywnych zachowań. Przykładowo, zamiast tworzyć przycisk z div i role=button, lepiej użyć natywnego button, a ARIA stosować jedynie w miejscach, gdzie HTML nie udostępnia odpowiednich elementów.

Frameworki takie jak React, Vue, Angular czy Svelte wprowadzają cykl życia komponentów. Manipulacja focusem wymaga często odczekania do momentu, gdy element pojawi się w DOM (np. użycie requestAnimationFrame lub mikro-zadań), w przeciwnym razie focus() zignoruje wywołanie. W SSR i podczas hydracji szczególnie ważne jest, by nie dublować automatycznego ustawienia fokusu w kodzie serwera i klienta, bo może to skutkować przeskokami. W SPA po zmianie trasy (route) warto przenosić fokus na główny nagłówek strony lub na kontener głównej treści, aby czytniki ekranu zakomunikowały nowy kontekst. Dobrą praktyką jest wprowadzenie linka “skocz do treści” widocznego przy nawigacji klawiaturą.

Względy mobilne komplikują sprawę: dotyk zwykle nie aktywuje tradycyjnego fokusu tak, jak klawiatura, a wirtualne klawiatury wywołują własne reguły przeskoku i przewijania. iOS Safari i niektóre przeglądarki na Androidzie mają odmienne zasady dotyczące fokusu linków i programowego focus() na elementach bez wejścia tekstowego. Dlatego obsługę fokusu na urządzeniach dotykowych należy testować osobno i przewidywać wyjątki, na przykład poleganie na roli przycisków oraz na rozległych powierzchniach dotyku zamiast mikroskopijnych obszarów.

Dostępność, standardy i dobre praktyki projektowe

Prawidłowo wdrożony fokus jest jednym z fundamentów dostępność. Standardy WCAG określają minimalne wymagania dla porządku nawigacji, widoczności wskaźnika oraz spójności interakcji. Nadrzędną zasadą jest przewidywalność: fokus porusza się w logicznym, wizualnie uzasadnionym porządku; wskaźnik jest widoczny i odpowiednio kontrastowy; a przejście między kontekstami (dialog, menu, panel) zachowuje orientację użytkownika. Projektowanie powinno uwzględniać minimalne rozmiary celów dotykowych oraz przestrzeń wokół, bo cień wskaźnika nie powinien zlewać się z sąsiadami.

Wytyczne projektowe obejmują między innymi:

  • Wyraźny wskaźnik, zawsze obecny przy wejściu z klawiatury; brak “wyłącznika” wskaźnika w stylach globalnych.
  • Kolory i kształty wskaźnika zgodne z brandingiem, ale testowane w trybach wysokiego kontrastu i w motywach jasnym/ciemnym.
  • Pewny porządek tabulacji bez dodatnich wartości tabindex, z wyjątkiem ściśle kontrolowanych wzorców roving tabindex.
  • Spójne zachowanie komponentów złożonych (listbox, menubar, tabs) względem wzorców WAI-ARIA Authoring Practices.
  • Skuteczne fallbacki dla starszych przeglądarek, jeśli używane są nowoczesne selektory jak :focus-visible.
  • Łagodne animacje lub ich brak; respektowanie preferencji prefer-reduced-motion.

Ważnym elementem są wskazówki typograficzne i rozmieszczenie. Wskaźnik, który jest “na skraju” obszaru przewijanego, może wywołać skok scrolla, co dezorientuje. Aby tego uniknąć, można przewidywać marginesy przewijania (scroll-margin) na elementach, które zwykle otrzymują fokus, w tym na kotwicach w nawigacji bocznej. W tabelach i siatkach należy dopracować zachowanie klawiszy strzałek oraz szybkie opuszczanie komponentu klawiszem Tab — to ściśle powiązane z ergonomią i zrównoważeniem między „w obrębie komponentu” a „na skróty dalej”.

W sprawach semantycznych natywny HTML jest pierwszym wyborem. Gdy natywne elementy nie pokrywają wymagań, stosujemy właściwą semantyka i role z ARIA, ale bez nadużyć. Np. role=button na spanie nie zastąpi w pełni zachowania button, dlatego warto poszukać sposobu na rozbudowę natywnych elementów zamiast od zera pisać kontrolki. Łącząc semantykę, sprawne zarządzanie fokusem i jasny wskaźnik, budujemy interfejs przewidywalny i solidny.

Testowanie, narzędzia i najczęstsze błędy

Testy stanów fokusu należy prowadzić na poziomach: jednostkowym (komponent), integracyjnym (moduł UI) i e2e (cała ścieżka użytkownika). Mechaniczny test to przejście Tab i Shift+Tab przez wszystkie obszary strony, sprawdzając, czy wskaźnik jest zawsze widzialny, a porządek — sensowny. Do automatyzacji można wykorzystać Playwright lub Cypress, symulując klawiaturę i weryfikując widoczność wskaźnika (np. przez sprawdzenie właściwości stylów lub obecności klas stanu). Analiza dostępności z użyciem axe-core, Lighthouse i WAVE szybko wyłapuje globalne błędy: globalne wyłączenie wskaźnika, brak skip linków, błędne role.

Narzędzia systemowe i przeglądarkowe, jak panel Accessibility w DevTools, pokazują drzewo dostępności i element posiadający fokus. Czytniki ekranu (NVDA, JAWS, VoiceOver) pozwalają odsłuchać, w jaki sposób fokus jest anonsowany. Testy powinny obejmować różne systemy i przeglądarki, ponieważ interpretacja :focus-visible, stylów outline oraz trybów wysokiego kontrastu nie jest całkowicie jednolita.

Typowe błędy to:

  • Ustawienie outline: none globalnie bez zamiennika, co usuwa widoczny wskaźnik.
  • Korzystanie z dodatnich tabindex, co rozbija intuicyjną kolejność i komplikuje utrzymanie.
  • Brak przechwycenia fokusu w modalach i brak zwrotu fokusu po zamknięciu.
  • Fokus na elementach ukrytych display: none lub visibility: hidden, co wywołuje nieprzewidywalność i błędy.
  • Fokus kradziony programowo bez intencji użytkownika (np. w interwałach), skutkujący utratą danych wpisywanych w inne pola.
  • Wskaźnik zbyt subtelny, nieosiągający minimalnych wymagań kontrastowych ani grubości.
  • Brak obsługi roving tabindex w komponentach wymagających strzałek, przez co Tab przechodzi przez dziesiątki elementów.
  • Niedostosowanie do prefer-reduced-motion i Forced Colors, co psuje widoczność wskaźnika lub obciąża percepcję.

Wydajność również ma znaczenie: agresywne re-renderowanie komponentów na każdy klawisz może spowodować utratę fokusu lub opóźnienia w jego przeniesieniu. Wzorce kontroli stanu powinny gwarantować stabilność referencji elementów otrzymujących fokus (np. unikanie bez potrzeby ich odmontowania). Dla dostępnych komponentów polegamy na płynnej, nieprzerywanej obsłudze kluczowych zdarzeń.

Przykłady zastosowań i scenariusze brzegowe

W modalnych oknach fokus trafia do sensownego miejsca startowego — zwykle tytułu lub pierwszego interaktywnego elementu (np. pola lub przycisku Zamknij). Skrót Escape zamyka modal i odtwarza fokus na aktywator. W pułapce fokusu Tab krąży w obrębie modala, a Shift+Tab działa wstecznie. Osadzenie dodatkowych paneli jak menu rozwijane nie powinno wyprowadzać fokusu poza modal.

Dla komponentów autosugestii (combobox) fokus znajduje się na polu wejściowym. Strzałki przemieszczają zaznaczenie na liście propozycji; Enter wybiera element i przenosi fokus z powrotem do pola. To wymaga zgodnej współpracy roving tabindex i odpowiednich ról ARIA (listbox, option), ale nadrzędne pozostają natywne możliwości elementu input.

W siatkach i w tabelach fokus może przechodzić komórka po komórce, a Tab opuszcza siatkę po osiągnięciu jej końca. Częstym problemem jest mieszanie roli grid z natywnymi tabelami, co komplikuje interakcję. Jeżeli nie potrzebujemy zaawansowanej interakcji komórka-po-komórce, lepiej pozostać przy prostych listach i tabelach z minimalną ilością niestandardowej logiki.

Shadow DOM i iframy wprowadzają niezależne korzenie dokumentu. Fokus może być w środku cienia lub w ramce zewnętrznej; trzeba zapewnić klarowne przejście oraz unikać “uwięzienia” bez możliwości wyjścia. Atrybuty delegowania fokusu w shadow root (delegatesFocus) wpływają na kierowanie fokusu do hosta; należy to testować, zwłaszcza w połączeniu z roving tabindex.

Elementy contenteditable zmieniają zasady gry, bo działają jak edytor. Przeniesienie fokusu programowo może skutkować skokiem kursora, więc wymaga delikatności i dokładnego zarządzania selection. Tu nacisk kładzie się na stabilność; automatyczne odświeżanie nie powinno przerwać kontekstu edycji.

W nawigacji głównej fokus musi wspierać skróty i przewidywalne przechodzenie po elementach. Rozwijane menu otwierają się po aktywacji klawiaturą, pozwalają poruszać się strzałkami i zamykają się klawiszem Escape. Jednocześnie wąskie zasięgi hover i dynamiczne ukrywanie nie mogą odcinać elementów od fokusu. W praktyce wymaga to ścisłej współpracy CSS, skryptów i semantyki.

Wreszcie, reklamy i osadzone skrypty mogą nieoczekiwanie przechwytywać fokus. Ograniczajmy wstrzykiwanie aktywnych elementów do krytycznych części interfejsu. Jeżeli integracja jest konieczna, sandbox i kontrola atrybutów, a także monitorowanie zmian DOM, pomagają utrzymać przewidywalność.

FAQ

  • Czym dokładnie jest focus state? To stan, w którym element interfejsu jest aktywnym celem dla wejścia z klawiatury i innych urządzeń. Przeglądarka i technologia wspomagająca traktują go jako bieżący punkt interakcji.
  • Czym różni się :focus od :focus-visible? :focus stosuje się zawsze, gdy element ma fokus; :focus-visible tylko wtedy, gdy wskaźnik powinien być widoczny (np. po wejściu z klawiatury). Dzięki temu nie pokazujemy wskaźnika po kliknięciu myszą, a jednocześnie nie odbieramy go użytkownikom klawiatury.
  • Czy można bezpiecznie usunąć outline? Można zastąpić go innym wyraźnym wskaźnikiem, ale nie usuwać bez zamiennika. Globalne outline: none jest poważnym błędem dostępności.
  • Czy dodatnie tabindex to dobry pomysł? Zwykle nie. Dodatnie wartości zaburzają naturalną kolejność i utrudniają utrzymanie. Preferuj tabindex=0 lub -1, albo wzorzec roving tabindex tam, gdzie to uzasadnione.
  • Jak przenosić fokus w modalach? Po otwarciu ustaw fokus na sensownym elemencie (np. tytule, pierwszym polu, przycisku Zamknij), zawęź tabulację do modala, a po zamknięciu przywróć fokus na element wywołujący.
  • Dlaczego mój styl :focus nie działa? Element może nie być fokusowalny (brak href/disabled), mieć tabindex=-1, być ukryty display: none, albo styl jest nadpisany przez bardziej specyficzną regułę. Sprawdź także, czy przeglądarka stosuje :focus-visible i czy nie łączysz niekompatybilnych warunków.
  • Jak dobrać kolory wskaźnika? Zapewnij co najmniej 3:1 kontrastu wskaźnika względem otoczenia i testuj w jasnym oraz ciemnym motywie i w trybach wysokiego kontrastu. Rozważ tokeny design systemu do standaryzacji.
  • Czy focus() programowy jest zły? Nie, o ile jest uzasadniony i przewidywalny. Stosuj go do zachowania orientacji (np. po otwarciu dialogu). Unikaj kradzieży fokusu podczas wpisywania danych lub bez wyraźnej potrzeby.
  • Jak przetestować kolejność tabulacji? Wykonaj ręcznie Tab/Shift+Tab przez cały interfejs; zautomatyzuj z Playwright/Cypress; użyj narzędzi axe, Lighthouse i podglądu accessibility tree. Sprawdź różne przeglądarki i systemy.
  • Co z urządzeniami mobilnymi? Dotyk nie zawsze ustawia fokus jak klawiatura, a wirtualna klawiatura zmienia zachowanie przewijania. Testuj osobno na iOS i Androidzie, opieraj się na natywnych kontrolkach i dużych celach dotykowych.
  • Czy potrzebuję ARIA dla fokusu? ARIA uzupełnia semantykę, ale nie zastępuje natywnych elementów. Używaj jej, gdy HTML nie zapewnia właściwego znaczenia, i zawsze testuj z czytnikami ekranu.
  • Jak połączyć fokus i animacje? Stosuj delikatne efekty lub statyczne wskaźniki. Szanuj prefer-reduced-motion. Unikaj migotania, które może rozpraszać lub wywoływać dyskomfort.
  • Po zmianie trasy w SPA gdzie ustawić fokus? Najlepiej na główny nagłówek strony lub kontener treści, aby komunikat o zmianie kontekstu dotarł do czytników ekranu. Udostępnij link “skocz do treści”.
  • Czy hover jest zamiennikiem fokusu? Nie. Hover zależy od wskaźnika myszy i nie działa na klawiaturze ani dotyku. Fokus jest niezależny i kluczowy dla wszystkich metod wejścia.
  • Jak poradzić sobie z Focus Appearance w WCAG 2.2? Zapewnij wystarczającą grubość/obszar wskaźnika i kontrast 3:1 względem otoczenia. Testuj w warunkach wysokiego kontrastu i w motywach jasnym/ciemnym. Ustal standard w design systemie.

Stan fokusu to nie detal, ale podstawowy mechanizm kierujący interakcją. Dobrze zaprojektowany i zaimplementowany pozwala budować interfejsy, które są szybkie, czytelne, przewidywalne i przyjazne dla wszystkich użytkowników, niezależnie od sposobu wejścia czy preferencji.

Chcesz mieć dobrą stronę internetową?

Zadzwoń do nas. Porozmawiamy o stronie dopasowanej
do Twoich potrzeb.

601 162 666

Poprzedni wpis
SEO kategorii w e-commerce – jak zaplanować content i strukturę
Następny wpis
Strona internetowa na WordPress dla biura projektowego
Zadzwoń Konsultacja