Ekran startowy (splash)
Źródło: repo luneta/docs/SPLASH.md — edytuj w repo, nie tutaj.
Ekran startowy (splash)
Decyzja właściciela z 2026-10-17. Przy uruchomieniu Lunety pokazuje się przezroczyste okno z jednym z sześciu wariantów, losowanym przy każdym starcie. Rogi są ścięte i półprzezroczyste (widać pulpit pod spodem). Okno jest wyłącznie informacją: nie przyjmuje kliknięć i nie dotyka gry.
Ostatnia aktualizacja: 2026-10-17. Kod: src-tauri/src/splash.rs, src/views/Splash.tsx,
src/views/splash.css, src/components/SplashSettings.tsx. Grafiki: src/assets/splash/,
źródła i skrypty: assets/design/splash/.
Dla użytkownika
Ustawienia
Zakładka ustawienia → ekran startowy (zapisuje od razu):
| ustawienie | znaczenie |
|---|---|
| pokazuj splash przy uruchomieniu | włącznik; domyślnie włączony |
| wybór wariantu | losowy (bez powtórki poprzedniego), po kolei albo stały |
| wariant | używany w trybie „stały” i w podglądzie |
| czas widoczności (suwak) | 1–10 s, domyślnie 7 s: minimum od pokazania okna; potem splash zamyka się, gdy wszystko jest gotowe |
| ▶ podgląd wariantu | pokazuje wybrany wariant od razu, także przy wyłączonym splashu |
Splash nigdy nie wisi dłużej niż 15 s (zabezpieczenie), nawet gdyby coś poszło nie tak.
Warianty
| id | tytuł | akcent |
|---|---|---|
terminal_boot |
1/6 Terminal boot | wariant kanoniczny i zapasowy |
world_map |
2/6 Mapa świata | miasto o zmierzchu, holograficzna mapa |
system_scan |
3/6 Analiza systemu | panel z modułami gier |
api_connect |
4/6 Łączenie z API | panel połączenia i autoryzacji ariku.pl |
game_modules |
5/6 Ładowanie modułów gier | lista modułów i licznik |
ready |
6/6 Gotowe | komunikat „Luneta jest gotowa.” po zakończeniu startu |
Co znaczą statusy
Wszystkie statusy są prawdziwe, nic nie jest wypalone w obrazku:
| krok | skąd |
|---|---|
| baza lokalna | odczyt kolejki SQLite |
| silnik OCR | obecność modeli OCR (brak = ostrzeżenie, praca lokalna nadal możliwa) |
| moduły gier | liczba wczytanych gier (wbudowane i pakiety) |
| ariku.pl | test połączenia: tylko odczyt zgód (GET …/me/consents), timeout 10 s |
| autoryzacja | czy serwer przyjął token |
| nakładka | czy nakładka na ekranie jest włączona |
Stany: OK, … (trwa), ! (ostrzeżenie), ✗ (błąd), — (nie dotyczy). Zasady:
- Do czasu odpowiedzi serwera ariku.pl i autoryzacja to „trwa”. Timeout to ostrzeżenie, nigdy sukces.
- Brak sieci to „tryb offline” (ostrzeżenie), a 401 to „token odrzucony” (błąd autoryzacji, połączenie jest). Brak tokenu to ostrzeżenie, nie blokada.
- Pasek postępu jest nieokreślony, bo realnego procentu nie mamy. „Gotowe.” pojawia się dopiero, gdy żaden krok już nie trwa; z ostrzeżeniami splash pisze, czego dotyczą („działa lokalnie”).
Prywatność i fair play
Okno jest zwykłym oknem pulpitu: nic nie jest wstrzykiwane do gry ani rysowane w jej procesie,
kliknięcia przechodzą przez nie dalej. Do sieci idzie jedno zapytanie tylko do odczytu (zgody).
Szanuje prefers-reduced-motion systemu (wyłącza mruganie i pasek w ruchu).
Dla deweloperów
Jak to działa
splash::spawn_startup(zsetup) czyta ustawienia, wybiera wariant (pick, czysta funkcja, testowana), zapisujesplash_lasti tworzy oknosplash(960×420, przezroczyste, bez ramki).- Okno startuje ukryte. Pierwsze
splash_statusz frontu pokazuje je (reveal: rozmiar, środek,show, zawsze na wierzchu, kliknięcia przechodzą). Równolegle idzie test API. - Front odpytuje
splash_statusco 350 ms. Zamyka okno (splash_close), gdyreadyi minął minimalny czas widoczności (minShowMsz suwaka, liczony od pierwszych danych), najwcześniej 300 ms po gotowości. Watchdog w Rust zamyka okno po 15 s. - Stan API trzyma
API_RESULT(Idle,Loading,Done);classify_apirozdziela połączenie i autoryzację, bez treści odpowiedzi serwera w szczegółach.
Klucze ustawień: splash (0/1), splash_mode (random|fixed|sequential), splash_variant,
splash_min_s (1–10), splash_last. Komendy: splash_status, splash_close, splash_preview,
splash_config_get, splash_config_set.
Pułapki (każda kosztowała zawieszenie lub puste okno)
- Komendy dotykające okna muszą być
async. Sync komendy Tauri chodzą na wątku głównym, a operacje na oknie wysyłają tam wiadomości i czekają. - Nie trzymaj guardów mutexu w literale struktury.
st.store.lock()wInputs { … }żyje do końca instrukcji, atoast::enabledblokuje ten sam mutex: samo-zakleszczenie, które zamraża całą aplikację. Odczyty rób w osobnychlet. - Ukryte okno GTK ma 10×10, dopóki rozmiar nie zostanie ustawiony jawnie (jak w
toast::place). - Timery JS w ukrytym oknie są wstrzymane (też
requestAnimationFrame). Sygnał „pokaż” idzie z Rust przy pierwszymsplash_status, nie zsetTimeout. - Okno z przezroczystością tworzymy ukryte i pokazujemy po załadowaniu treści; pokazane przed treścią nie maluje się w WebKitGTK.
is_visible()nie jest wiarygodne dla okna utworzonego jako ukryte: używamy flagiREVEALED.
Budowanie do testów na żywo
cargo build --release daje binarkę, która ładuje front z http://localhost:1420 (okno pokaże
„Could not connect to localhost”). Wersję z wbudowanym frontem robi
npm run build && npx tauri build --no-bundle (docs/BUDOWANIE.md). Do szybkiej iteracji nad CSS
można zbudować cargo build --release i uruchomić npx vite --port 1420 obok.
Grafiki
Tła to 6 plików WebP (1920 px, bez tekstu) w src/assets/splash/. Powstały z kolażu referencyjnego:
cięcie na kafle, usunięcie wypalonego tekstu i UI (clean_text.py, inpainting), upscale
RealESRGAN x4 anime (upscale.py, spandrel na XPU, bez serwera ComfyUI). Opis przebiegu,
strefy napisów i lista rzeczy do usunięcia (m.in. logotypy gier): assets/design/splash/README.md.
Podmiana grafiki: zachowaj nazwę pliku (0N-<id>.webp); proporcje ok. 2,1–2,4:1 (okno ma 2,29:1,
reszta jest przycinana cover). Pozycje paneli przy grafice (03, 04, 05) są wyliczone pod
obecne tła w splash.css; po zmianie kadru popraw je ręcznie. Brak pliku = ciemna siatka zamiast
pustego okna, a w logu pojawia się ostrzeżenie splash: brak grafiki ….
Testy
cargo test splash: wybór wariantu (bez powtórki, zawijanie, zapas), rozróżnienie offline / 401 /
5xx / odrzucone, statusy „trwa” bez fałszywego sukcesu, brak tokenu jako ostrzeżenie, zakres
suwaka 1–10 s. Logi diagnostyczne okna: splash: … (start, wariant, rozmiar widoku, błędy).
Czego nie ma
Splash przy starcie sesji gry (brief przewidywał go jako opcję) jest niezaimplementowany.
No comments to display
No comments to display