11 KiB
IJsbreker Workshop Spel
Browser-based interactief workshop spel waarbij deelnemers fysiek kiezen tussen twee stellingen die op een beamer worden getoond.
Project Overzicht
Type: Hobby project / Workshop tool Status: Volledig functioneel v1.0 Gemaakt: 2025-11-03
Wat doet het?
Een presentatie tool voor workshops waar deelnemers tussen twee stellingen moeten kiezen. De facilitator toont stellingen op een beamer, een timer loopt visueel rond het scherm, en daarna zie je de stellingen grayed out terwijl mensen fysiek naar links/rechts bewegen.
Features
- Startscherm met controle over startmoment
- Fullscreen modus voor presentaties zonder browser UI
- Timer animatie die synchroon rond het scherm loopt
- Geluidssignaal bij einde timer
- Overlay met stellingen na timer
- Stelling counter rechtsonder (toont voortgang)
- Keyboard shortcuts (spatiebalk voor volgende, ESC voor fullscreen uit)
- Direct eindscherm bij laatste stelling
- Web-based stellingen editor met Flask backend
- Workshop sets systeem (meerdere configuraties)
- Stellingkast met bibliotheek voor snelle import
- Drag & drop om stellingen te herordenen
- Real-time CRUD operaties op stellingen
- Kleurenpicker voor achtergronden
- Volledig offline werkend
Tech Stack
- Frontend: Pure HTML/CSS/JavaScript
- Backend: Python Flask + flask-cors
- Config driven via JSON (sets.json voor meerdere configuraties)
- Geen externe dependencies voor presentatie modus
Bestandsstructuur
/ijsbreker
├── index.html # Presentatie modus (hoofdspel)
├── app.js # Game logic en timer animatie
├── style.css # Presentatie styling
├── config.json # Actieve configuratie (gebruikt door presentatie)
├── sets.json # Database met alle workshop sets
├── stellingkast.json # Bibliotheek met stellingen voor import
├── editor.html # Web-based config editor met sets beheer
├── editor.js # Editor functionaliteit en sets management
├── editor.css # Editor styling
├── server.py # Flask backend voor editor en sets API
├── requirements.txt # Python dependencies
├── .gitignore # Exclude venv, .DS_Store, etc
└── README.md # Uitgebreide documentatie
Gebruik
Presentatie Modus
# Start Flask server (nodig voor config.json laden)
source venv/bin/activate
python server.py
# Open in browser
open http://localhost:8000/index.html
Controls:
- Groene "Start IJsbreker" knop om te beginnen
- Fullscreen knop rechtsonder voor volledig scherm
- Spatiebalk: Start spel of ga naar volgende stelling
- ESC: Verlaat fullscreen modus
- Automatische timer animatie
- Geluidssignaal bij einde
Stellingen Bewerken
# Start Flask server
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python server.py
# Open editor
open http://localhost:8000/editor.html
Editor features:
- Sets beheer: Meerdere workshop configuraties opslaan en laden
- Sets dropdown: Selecteer actieve set of maak nieuwe set aan
- Toevoegen/verwijderen stellingen via drag & drop
- Stellingkast met bibliotheek voor snelle import
- Timer aanpassen per set
- Kleuren aanpassen per set
- Auto-save naar sets.json en config.json
Session History
2025-11-03 - Initiële Ontwikkeling
Nieuwe features:
- Browser-based interactief workshop spel gebouwd
- Timer animatie met visuele rand rond scherm
- Geluidssignaal implementatie bij timer einde
- Overlay systeem voor stellingen na timer
- Keyboard shortcuts voor presentatie flow
- Web-based stellingen editor met Flask backend
- Real-time CRUD operaties op config.json
- Kleurenpicker voor achtergrond customization
- Validatie en filtering van lege stellingen
- Volledig offline werkend systeem
Tech beslissingen:
- Pure HTML/CSS/JavaScript voor maximale portabiliteit
- Flask backend voor eenvoudige config management
- JSON als database voor simpele deployment
- Geen build process nodig voor presentatie modus
- flask-cors voor lokale development
Deployment:
- Eerste commit en push naar Forgejo
- Repository: git.dutchstack.nl:frankmeeuwsen/ijsbreker.git
- Volledig functionele v1.0 klaar voor gebruik
Status:
- Presentatie modus volledig werkend
- Editor volledig functioneel
- Documentatie compleet in README.md
- Klaar voor workshop gebruik
2025-11-07 - Startscherm Toegevoegd
Nieuwe feature:
- Startscherm met groene "Start IJsbreker" knop toegevoegd
- Timer begint nu pas na klik op startknop (voorheen automatisch)
- Gebruiker heeft volledige controle over startmoment presentatie
- Spatiebalk werkt op startscherm voor snelle start
Gewijzigde bestanden:
index.html- Startscherm HTML toegevoegd, statementScreen krijgt .hidden class bij ladenstyle.css- Styling voor start-screen en start-button (groene knop met hover effecten)app.js- Flow aangepast: nieuwe functiesshowStartScreen()enstartGame(), event listeners voor startButton, spatiebalk werkt nu op startscherm EN overlayconfig.json- Kleine config aanpassingen
Waarom: Voorheen begon de timer meteen bij het laden van de pagina, wat onhandig is bij voorbereiding van een workshop presentatie. Nu kan de facilitator in alle rust de browser op de beamer zetten voordat het spel daadwerkelijk start.
Status:
- Feature volledig werkend en getest
- Klaar voor workshop gebruik met betere controle over presentatie flow
2025-11-14 - UI Verbeteringen en Flow Fixes
Nieuwe features:
- Stelling counter rechtsonder toegevoegd (toont bijv. "1/8", "2/8" tijdens presentatie)
- Overlay transparantie verhoogd naar 0.4 voor betere leesbaarheid stellingen
- "Volgende stelling" knop verplaatst naar bovenkant (15vh) voor betere zichtbaarheid
Bug fixes:
- Laatste stelling flow gefixed: toont nu correct overlay voordat eindscherm verschijnt
- Voorheen ging laatste stelling direct naar finish screen zonder overlay tonen
Gewijzigde bestanden:
style.css- Overlay opacity aangepast, knop positie gewijzigd, counter styling toegevoegdapp.js- Statement counter logica toegevoegd, laatste stelling flow aangepastindex.html- Statement counter div toegevoegd
Waarom: Tijdens gebruik bleek de knop onderaan moeilijk leesbaar door de overlay, en de laatste stelling miste de overlay fase waardoor deelnemers geen tijd hadden om te kiezen. Counter helpt facilitator bij het bijhouden van voortgang.
Status:
- Alle wijzigingen getest en werkend
- Gecommit en gepusht naar remote (commit
e1f1659) - UX verbeterd voor workshop gebruik
2025-12-12 - Stellingkast en Drag & Drop
Nieuwe features:
- Stellingkast: Nieuw inschuif-paneel in de editor om direct stellingen uit een bibliotheek (
stellingkast.json) te importeren. - Drag & Drop: Stellingen kunnen nu in de editor versleept worden om de volgorde aan te passen.
- Cache Busting: Toegevoegd aan fetch calls om laadproblemen met verouderde JSON bestanden te voorkomen.
- Validatie:
stellingkast.jsonis opgeschoond en bevat nu valide JSON.
Gewijzigde bestanden:
editor.html- HTML structuur voor Stellingkast panel en nieuwe header knopeditor.css- Styling voor slide-in panel, sleep-handvatten en responsive designeditor.js- Logica voor drag & drop, stellingkast import, verbeterde foutafhandeling en loading statesstellingkast.json- Opgeschoond (regelnummers verwijderd)
Status:
- Features volledig werkend en getest in browser
- Editor robuuster gemaakt tegen laadfouten
2025-12-16 - Workshop Sets Management
Nieuwe features:
- Sets systeem: Meerdere complete workshop configuraties kunnen opslaan en laden
- Sets dropdown: Bovenaan editor voor eenvoudig switchen tussen sets
- "Opslaan als Nieuwe Set" knop voor nieuwe configuraties aanmaken
- Automatische migratie: Huidige config.json wordt bij eerste gebruik omgezet naar default set
- Backwards compatibility: Systeem blijft werken zonder sets.json (legacy fallback)
Gewijzigde bestanden:
server.py- Nieuwe endpoints: GET/POST/api/sets, helper functies voor sets managementeditor.html- Sets sectie met dropdown en knoppen toegevoegdeditor.css- Styling voor sets UI (blauwe border-left accent)editor.js- Complete sets management logica: laden, switchen, opslaan, nieuwe sets aanmakenconfig.json- Blijft actieve configuratie voor presentatie modus
Nieuwe bestanden:
sets.json- Database met alle workshop sets (wordt automatisch aangemaakt)
Hoe het werkt:
- Editor openen → Zie dropdown met alle sets
- Set selecteren → Laadt stellingen en instellingen van die set
- Bewerken en opslaan → Overschrijft huidige set
- "Opslaan als Nieuwe Set" → Maakt nieuwe set aan met custom naam
- Presentatie starten → Gebruikt laatst opgeslagen set uit config.json
Data structuur sets.json:
{
"sets": [
{
"id": "default",
"name": "Standaard Set",
"config": { /* complete config */ }
},
{
"id": "set-1234567890",
"name": "PKM Workshop 2025",
"config": { /* complete config */ }
}
],
"activeSetId": "default"
}
Waarom: Facilitators kunnen nu meerdere workshop configuraties voorbereiden (bijv. verschillende doelgroepen, thema's) en eenvoudig tussen sets wisselen zonder telkens stellingen handmatig te moeten aanpassen.
Status:
- Backend endpoints volledig werkend (GET/POST /api/sets)
- Frontend UI en logic compleet geïmplementeerd
- Automatische migratie van bestaande config.json getest
- Sets kunnen worden aangemaakt, geladen, gewijzigd en opgeslagen
- Backwards compatible met oude systeem
- Klaar voor productie gebruik
2025-12-17 - Fullscreen Modus
Nieuwe feature:
- Fullscreen knop: Semi-transparante knop rechtsonder (naast counter) om presentatie in volledig scherm te tonen
- Toggle functionaliteit: Klik op knop om fullscreen te activeren/deactiveren
- Visuele feedback: Icoon draait 180° wanneer in fullscreen modus
- ESC toets support: Browser standaard ESC werkt om fullscreen te verlaten
- Glasmorphism styling: Moderne semi-transparante knop met blur effect
Gewijzigde bestanden:
index.html- Fullscreen knop met SVG icoon toegevoegdstyle.css- Styling voor fullscreen button met hover states en is-fullscreen classapp.js- toggleFullscreen() functie, event listeners voor knop en fullscreenchangeREADME.md- Documentatie bijgewerkt met fullscreen instructiesCLAUDE.md- Features lijst en Session History bijgewerkt
Waarom: Voor workshop presentaties is het belangrijk dat de browser UI (adresbalk, tabs, bookmarks) niet zichtbaar is op de beamer. De fullscreen knop maakt het eenvoudig om de presentatie volledig scherm te tonen zonder browser elementen.
Hoe het werkt:
- Gebruikt Fullscreen API (
document.documentElement.requestFullscreen()) - Knop blijft zichtbaar in fullscreen modus voor gemakkelijke toggle
- Event listener voor
fullscreenchangezorgt voor correcte state sync bij ESC toets - Icoon rotatie geeft visuele feedback over huidige fullscreen state
Status:
- Feature volledig werkend en getest
- Documentatie bijgewerkt (README.md en CLAUDE.md)
- Klaar voor gebruik bij workshop presentaties