The Trivia board game is an interactive, fully client-side (serverless) quiz game built with HTML, Tailwind CSS, and vanilla JavaScript. The game allows for offline gameplay using built-in question databases (JSON files) and offers the ability to upload or paste custom question decks.
-
Offline Gameplay (Question Database):
- Convenient loading of built-in JSON question databases.
- Ability to upload your own question database file (
.json) or paste generated database text directly into the form. - Robust resilience to parsing errors (Json Healing).
-
Category Selection:
- Convenient category selection screen allowing players to select exactly 6 categories for the game.
- Random category choice option and filter by language (PL/EN).
-
Save and Restore Game State:
- The game automatically saves state to
localStorageafter every move. - Download the current state as a
.jsonfile ("Download State") and upload it later ("Load Game") to continue playing on another device.
- The game automatically saves state to
-
Premium Design and Space Optimization:
- Clear top bar indicating the active player's turn and displaying scores alongside earned wedges in the form of horizontal capsules.
- Floating 3D die in the bottom-right corner of the board, integrated with rolling mechanics and pawn movement animations.
- Complete support for multiple themes (OLED, Dark, Light) with elegant background blur (
backdrop-filter) and smooth transitions.
-
AI Question Database Generator:
- An advanced built-in developer/admin tool (
generator.htmlandjs/generator.js) for direct question generation using LLM APIs (OpenRouter, OpenAI, LM Studio, Ollama). - Supports batch generation, custom difficulty levels, automatic spoiler checks (preventing questions containing their own answers), and ZIP exporting.
- An advanced built-in developer/admin tool (
-
Progressive Web App (PWA) & Offline-First:
- The game and database generator are fully installable on desktop and mobile.
- Comprehensive caching strategy via Service Worker (
sw.js) precaching the entire app shell, CDN resources (Tailwind, JSZip, Google Fonts), and default question databases. - Runtime cache with a Stale-While-Revalidate strategy for dynamic categories, enabling offline gameplay for previously played categories while automatically updating when online.
/databases– Directory containing question databases./categories– Subdirectory containing standard category database files (e.g.general_pl.json,general_en.json,popkultura_pl.json).list.json– Automatically generated index of available databases.
/js/trivia– Main game modules:main.js– Game entry point and initialization.state.js– Dynamic game state.client-adapter.js– Offline API database adapter.board.js&ui-board.js– Grid layout generation, board, and pawn rendering logic.ui-events.js– Event handlers and screen navigation.utils.js– Helper functions, JSON parser./services/persistence-service.js– State saving, downloading, and restoring.
index.html– Main game screen.style.css– Stylesheet (Vanilla CSS integrated with Tailwind Play CDN).generator.html– Independent database generator tool (with built-in API support).manifest.json– Web App Manifest for PWA properties.sw.js– Service Worker for offline asset and category caching.icons/– Folder containing optimized launcher icons (icon-192.png,icon-512.png).
Install development dependencies (ESLint, Prettier, Vitest):
npm installThe easiest way to run the game is using a local static server, for example, http-server:
npx http-server -p 8220The game will be available at: http://127.0.0.1:8220.
After committing a new .json database file to the /databases folder, run the scan script to automatically update the list.json index:
npm run scan-dbThe new database will immediately appear in the game setup screen!
Run automated unit tests (board logic, JSON parsing, persistence):
npm run testFormat the code with Prettier:
npm run formatLint the code for static errors with ESLint:
npm run lintGra planszowa Trivia to interaktywna, w pełni kliencka (bezserwerowa) gra quizowa oparta na HTML, Tailwind CSS i czystym JavaScripcie. Gra pozwala na rozgrywkę offline przy użyciu wbudowanych baz pytań (plików JSON) oraz daje możliwość wczytywania własnych talii pytań.
-
Rozgrywka Offline (Baza Pytań):
- Wygodne wczytywanie wbudowanych baz pytań JSON.
- Możliwość wgrania własnego pliku bazy pytań (
.json) lub wklejenia wygenerowanego tekstu bazy bezpośrednio w formularzu. - Pełna odporność na błędy parsowania (Json Healing).
-
Wybór Kategorii:
- Intuicyjny panel wyboru pozwalający graczom wybrać dokładnie 6 kategorii do rozgrywki.
- Opcja losowego wyboru kategorii oraz filtrowanie po języku (PL/EN).
-
Zapis i Odtwarzanie Stanu Gry (Save/Restore):
- Gra automatycznie zapisuje stan po każdym ruchu w
localStorage. - Możliwość pobrania aktualnego stanu jako plik
.json(„Pobierz zapis”) i późniejszego wgrania („Wczytaj grę”) w celu kontynuowania rozgrywki na innym urządzeniu.
- Gra automatycznie zapisuje stan po każdym ruchu w
-
Premium Design i Optymalizacja Przestrzeni:
- Przejrzysta górna belka informująca o aktualnej turze gracza oraz wyświetlająca punktację wraz ze zdobytymi cząstkami (klinami) w formie poziomych kapsułek.
- Pływająca kostka 3D w prawym dolnym rogu planszy, zintegrowana z systemem rzutów i animacji ruchu pionków.
- Pełne dopasowanie do motywów (OLED, Dark, Light) z efektownym rozmyciem tła (
backdrop-filter) i płynnymi animacjami.
-
Generator Baz Pytań AI:
- Zaawansowane wbudowane narzędzie (
generator.htmlijs/generator.js) do bezpośredniego generowania pytań za pomocą API modeli LLM (OpenRouter, OpenAI, LM Studio, Ollama). - Wspiera generowanie partiami (batch), dostosowanie poziomu trudności, automatyczne sprawdzanie spoilerów (wykrywanie pytań zawierających własne odpowiedzi) oraz eksport do plików JSON/ZIP.
- Zaawansowane wbudowane narzędzie (
-
Aplikacja PWA i Tryb Offline (Offline-First):
- Gra oraz generator baz pytań są w pełni instalowalne na urządzeniach mobilnych i stacjonarnych.
- Zaawansowana strategia cache'owania za pomocą Service Workera (
sw.js) – zapisuje w pamięci podręcznej pliki aplikacji, zasoby CDN (Tailwind, JSZip, czcionki Google) oraz domyślne bazy pytań. - Strategia Stale-While-Revalidate dla kategorii wczytywanych w trakcie gry, umożliwiająca zabawę offline we wcześniej uruchamiane tematy z automatyczną aktualizacją pytań po połączeniu z siecią.
/databases– Katalog na bazy pytań./categories– Podkatalog zawierający pliki baz danych poszczególnych kategorii (np.general_pl.json,general_en.json,popkultura_pl.json).list.json– Indeks dostępnych baz pytań generowany automatycznie.
/js/trivia– Moduł główny gry:main.js– Punkt wejścia i inicjalizacja gry.state.js– Dynamiczny stan gry.client-adapter.js– Offline'owy adapter API baz danych.board.js&ui-board.js– Logika generowania siatki pól oraz rysowania planszy i pionków.ui-events.js– Obsługa zdarzeń i nawigacja ekranów.utils.js– Funkcje pomocnicze, parser JSON./services/persistence-service.js– Zapis, pobieranie oraz przywracanie stanu rozgrywki.
index.html– Główny ekran gry.style.css– Arkusz stylów (arkusz stylów Vanila CSS zintegrowany z Tailwind Play CDN).generator.html– Niezależne narzędzie do bezpośredniej generacji baz pytań przez API LLM (z obsługą weryfikacji spoilerów, edycji CMS oraz eksportu ZIP).manifest.json– Manifest PWA z konfiguracją aplikacji.sw.js– Service Worker do obsługi trybu offline i cache'owania zasobów.icons/– Katalog z ikonami launchera (icon-192.png,icon-512.png).
Instalacja zależności deweloperskich (ESLint, Prettier, Vitest):
npm installNajprostszym sposobem na uruchomienie gry jest postawienie lokalnego serwera statycznego, np. http-server:
npx http-server -p 8220Gra będzie dostępna pod adresem: http://127.0.0.1:8220.
Po zacommitowaniu nowego pliku .json z bazą pytań w katalogu /databases, uruchom skrypt skanujący w celu automatycznego zaktualizowania indeksu list.json:
npm run scan-dbNowa baza pytań natychmiast pojawi się na liście wyboru w grze!
Uruchomienie automatycznych testów jednostkowych (logika planszy, parsowanie JSON, persistence):
npm run testFormatowanie kodu za pomocą Prettiera:
npm run formatSprawdzanie błędów statycznych w kodzie (ESLint):
npm run lint