Strony WWW

Skrzypek. Naprawa obuwia

Strona dla zakładu szewskiego, w której przewijanie prowadzi kamerę przez warsztat. Zrobiona z własnej inicjatywy, jeszcze niewdrożona.

Problem

Zakład Ryszarda Skrzypka przy Nowym Świecie 34 działa od ponad piętnastu lat i ma 5,0 ze 125 opinii w Google — i nie ma własnej strony. Istnieje w sieci wyłącznie przez katalogi: Cylex, Yelp, top100.pl. Ktoś, kto szuka szewca w Śródmieściu, znajduje wpis z adresem i godzinami, a nie powód, żeby przyjść akurat tutaj.

Rozwiązanie

Statyczna strona, na której przewijanie steruje ciągłym przelotem kamery przez miniaturowy świat zakładu — trzy sceny bez cięcia, od fasady kamienicy przez drzwi do warsztatu. Pod filmem pełna część informacyjna: co naprawiamy, trzy kroki, opinie, godziny i mapa. Zero backendu, zero kroku budowania, zero zależności — właściciel dostaje pliki, które postawi gdziekolwiek.

Co robi

  • Przewijanie steruje przelotem kamery przez trzy sceny bez cięcia: fasada, drzwi, warsztat
  • Tekst każdej sceny wjeżdża i gaśnie w rytm kamery; ostatnia scena trzyma numer telefonu
  • Pod filmem pełna część informacyjna: usługi, trzy kroki, opinie, kontakt z mapą
  • Telefon klikalny wszędzie, mapa dojazdu z Google Maps
  • Dane firmy w schema.org LocalBusiness — godziny, adres i ocena idą prosto do wyników wyszukiwania
  • Nawigacja kropkami po prawej: klik przeskakuje do środka wybranej sceny
  • Wersja mobilna w lżejszym trybie: bez cząstek, rzadszy seek, tekst przy dolnej krawędzi

Na czym zbudowane

  • Trzy pliki i katalog assetów: index.html z całą treścią i stylami, scrub-engine.js, trzy klipy mp4 i trzy plakaty webp
  • Silnik buduje własny DOM i wstrzykuje własny CSS w warstwie kaskady, więc tokeny strony zawsze wygrywają nad jego domyślnymi
  • Scroll mapuje się na czas odtwarzania wideo; klip ładowany jako Blob, więc hosting nie musi obsługiwać żądań zakresowych HTTP
  • Klatka goni cel interpolacją, a nowy seek nie idzie, dopóki dekoder nie skończy poprzedniego — bez tego szybkie machnięcie palcem zamraża klip na telefonie
  • iOS nie namaluje wyciszonego wideo bez gestu, więc pierwszy dotyk uruchamia i zatrzymuje każdy załadowany klip
  • Plakat sceny zostaje na wierzchu, dopóki wideo nie namaluje pierwszej klatki
  • Część informacyjna leży nad warstwami silnika i nasuwa się na film jak kurtyna
  • Zmiana samej wysokości okna jest ignorowana na dotyku — pasek adresu w telefonie zgłasza zmianę rozmiaru, a przeliczenie szarpałoby pozycją scrolla

Jak to wygląda

Co to zmieniło

  • Zakład z 5,0 ze 125 opinii i piętnastoma latami pracy istniał w sieci wyłącznie w cudzych katalogach — strona daje mu własny adres zamiast wpisu w Cylexie
  • Niewdrożona: żadnych liczb z ruchu ani telefonów, bo właściciel jeszcze jej nie widział
  • Koszt utrzymania po stronie właściciela: hosting statyczny, zero zależności, zero kroku budowania
  • 10,0 MiB wideo i 309 KiB plakatów — cała strona bez jednego bajtu zależności
  • Dwa szwy między klipami frame-locked: PSNR 22,4 i 22,3 dB przy identycznej kompozycji kadru
  • Klipy enkodowane pod scrubbing: 720p natywne, CRF 20, GOP 8, faststart, bez audio

Stack

  • Statyczny HTML
  • Vanilla JS
  • scroll-world (MIT)
  • ffmpeg
  • Higgsfield (gpt_image_2, seedance)
  • Vercel

Historia

Zakład o tę stronę nie prosił. Wybrałem go z listy warszawskich firm bez własnej witryny i zbudowałem całość na spekulację, żeby mieć co pokazać właścicielowi — dlatego strona ma jeszcze noindex, znacznik wersji poglądowej w rogu i dane firmy do potwierdzenia przy ladzie. Film jest generowany: jeden obraz startowy, trzy pięciosekundowe przeloty, a plakaty kolejnych scen wycięte z ostatnich klatek poprzednich — dlatego szwy schodzą się co do kompozycji. Zależności nie ma żadnej: to trzy pliki, które otwierają się z dysku.