shopping-centre-1

Mapa centrum handlowego

Główny cel

Mapa miała działać wewnątrz istniejącej strony WordPress, którą klient sam edytuje, więc celem był front-end bez żadnych zależności - taki, który można wkleić na dowolną podstronę i który przetrwa dowolny motyw, page builder czy plugin.

Rozwiązane problemy

Każdy lokal jest realnym elementem DOM, a nie pikselem na obrazku - można go podświetlić przy najechaniu, dotknąć na telefonie i powiązać z danymi najemcy po id. Najemcy wynajmujący kilka sąsiednich lokali podświetlają się jako jedna całość, a punkty wspólne

  • toalety, winda, wejście i wyjście ewakuacyjne - są oznaczone na obu kondygnacjach. Przesuwanie, zoom kółkiem i gestem pinch oraz przycisk dopasowania widoku sprawiają, że bardzo szeroki rzut pozostaje czytelny na telefonie. Całość trafia na stronę jako jeden samowystarczalny blok HTML: bez wtyczki, bez iframe'a i bez plików do wgrania.

Stack technologiczny

Vanilla JavaScript (ES6): około 500 linii w jednym IIFE - przełączanie pięter, przesuwanie i zoom z bezwładnością, gesty pinch i dymki z danymi. Bez frameworka, bundlera i zależności runtime.

Inline SVG: ręcznie przygotowane rzuty kondygnacji są źródłem prawdy dla renderowania. Każdy lokal to <path>, którego id wiąże go z danymi, a przesuwanie i zoom to jeden transform CSS na kontenerze - dzięki temu interakcja jest płynna także na słabszych telefonach.

Warstwa danych w JSON: nazwy najemców, dane kontaktowe i godziny otwarcia znajdują się w jednym pliku JSON, kluczowanym po id elementu SVG - aktualizacja mapy to edycja danych, a nie kodu.

Shadow DOM + skrypt budujący w Pythonie: niewielki skrypt w Pythonie wkleja SVG, CSS, JS, dane i ikony (base64) w jeden blok HTML renderowany w Shadow DOM — style motywu nie wpływają na mapę, a mapa nie wpływa na stronę. Ładunek jest dodatkowo zakodowany base64, żeby kodowanie encji przez WordPressa i pluginy minifikujące JS go nie uszkodziły.

Technologie i narzędzia

  • JS
  • SVG
  • HTML
  • CSS
  • python