App-info

Versiehistoriek

Elke versie en subversie met publicatiedatum, omschrijving en de wijzigingen die werden uitgevoerd.

Huidige versie

v1.1.177

Ook op een kleine telefoon ruimte voor alle warmtevlammetjes

Versiereeks

1.1.x

178 versies
v1.1.177 Ook op een kleine telefoon ruimte voor alle warmtevlammetjes
Probleem / foutmelding

Bij het bekijken van de native websiteproef op een scherm van ongeveer 320 pixels breed konden de warmte-icoontjes naast de andere sessiegegevens te weinig ruimte krijgen.

Oplossing

Op extra smalle breedtes krijgt de sessietekst meer ruimte tussen de tijd en het portret. De pijl voor details staat boven het portret en de vijf warmte-icoontjes worden compacter weergegeven.

Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Sessies op extra smalle schermen over drie kolommen verdelen
CSS
@container (max-width:330px) {
    .session-row { grid-template-columns:68px minmax(0,1fr) 44px; gap:8px; }
    .session-time time { font-size:22px; }
    .signature { overflow-wrap:anywhere; }
    .row-portraits { align-self:start; margin-top:48px; }
    .row-portraits .avatar { width:40px; height:40px; }
    .session-detail > summary { width:44px; }
    .session-body .flames span { font-size:16px; }
    .people .person { font-size:20px; }
}

Wat doet dit?Alleen wanneer het programmablok maximaal 330 pixels breed is, delen tijd, sessietekst en portret de rij in drie kolommen. De tijd krijgt 68 pixels zodat ook 20:00 past. Lange themawoorden mogen afbreken; de detailpijl krijgt ruimte boven het portret en de warmtevlammetjes worden iets kleiner.

Resultaat in de appTijden, lange themawoorden en alle vijf warmtevlammetjes blijven binnen de sessierij op extra smalle telefoons; bredere mobiele en desktopweergaven behouden hun bestaande indeling.

1 wijziging

  • De websiteproef overzichtelijker op extra smalle telefoons: tijd, sessietekst en portret staan op de kleinste breedtes in drie duidelijke kolommen. De klok krijgt voldoende ruimte en lange themawoorden breken netjes af in plaats van buiten het blok te lopen. De detailpijl schuift boven het portret en alle vijf vlammetjes passen met een iets kleiner formaat beter bij de warmte-aanduiding. De aanpassing geldt alleen voor een programmablok tot 330 pixels breed; op bredere telefoons en desktop blijft de indeling hetzelfde. De bestaande gastenapp, interne planner, echte Shopify-site, tv-weergave en planning zijn niet gewijzigd.
v1.1.176 Een herkenbare gastenervaring in de websiteproef zonder iframe
Probleem / foutmelding

De eerste vormgeving van de native websiteproef was compacter en minder herkenbaar dan de gastenapp die in het eerdere iframe-voorbeeld wordt getoond.

Oplossing

De proef op /thewhiteoak-integratie/native/ volgt nu de vertrouwde White Oak-stijl met duidelijke dagknoppen, grote foto's, ruimere sessiegegevens en ronde portretten. De kalender en persoonlijke agenda's blijven bereikbaar in hetzelfde automatisch meegroeiende programmablok. Dit blijft een afzonderlijke proef, geen volledige kopie van de gastenapp en geen installatie in de echte Shopify-webshop.

Technisch

Het programma blijft een native element met afgeschermde opmaak, zonder iframe of eigen vaste scrolhoogte. De nieuwe vormgeving gebruikt dezelfde openbare programmabron als voorheen; er zijn geen wijzigingen aan het rooster of de tv-logica. De proef benadert de vertrouwde appopmaak, maar biedt niet automatisch alle functies van de volledige gastenapp. Favorieten bestaan alleen in het geheugen van het huidige paginabezoek. Deze wijziging installeert niets in het echte Shopify-thema.

Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 Zeven dagknoppen op brede en smalle pagina's indelen
CSS
.day-row { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); border:1px solid var(--line); border-radius:6px; background:color-mix(in srgb,var(--soft) 35%,var(--paper)); overflow:hidden; }
.day-row-more { grid-template-columns:repeat(4,minmax(0,1fr)); margin-top:8px; }
@container (max-width:650px) {
    .day-row-more { grid-template-columns:repeat(2,minmax(0,1fr)); }
    .day-row-more .day-button:nth-child(2) { border-right:0; }
    .day-row-more .day-button:nth-child(-n+2) { border-bottom:1px solid var(--line); }
}

Wat doet dit?De eerste rij heeft drie kolommen. De tweede rij krijgt vier kolommen op een brede pagina en twee op een smalle pagina, zonder de overige dagen achter een horizontale scrolbalk te verbergen.

Resultaat in de appDe vertrouwde indeling toont alle zeven dagknoppen als 3 + 4 op desktop en 3 + 2 + 2 op mobiel.

Wijziging 2 Ingevulde sfeer, gastentekst en warmte bij de beleving tonen
JavaScript
const profile = session.sessionProfile;
if (profile?.theme || profile?.teaser || profile?.heatLevel) {
    const signature = element('div', 'signature');
    signature.append(element('small', 'signature-label', this.words.signatureLabel));
    if (profile.theme) signature.append(element('h4', '', profile.theme));
    if (profile.teaser) signature.append(element('p', '', profile.teaser));
    const heat = this.heat(profile); if (heat) signature.append(heat);
    body.append(signature);
}

Wat doet dit?Het uitgelichte sessieblok gebruikt het al gepubliceerde persoonlijke profiel. Alleen ingevulde onderdelen worden toegevoegd; er worden geen thema's, teksten of warmteniveaus verzonnen.

Resultaat in de appBij de grote belevingsfoto ziet de gast de eigen sessietitel, beschikbare extra tekst en warmtevlammetjes wanneer die zijn ingevuld.

Wijziging 3 Zoekterm en gekozen teamfilter samen toepassen
JavaScript
const matches = this.data.hosts.filter(host => normalize(host.name).includes(normalize(this.query)) && (this.hostFilter === 'all' || (this.hostFilter === 'opgieter' && host.isOpgieter) || (this.hostFilter === 'sound' && host.isSoundHealer) || (this.hostFilter === 'favourites' && this.favourites.has(host.name))));

Wat doet dit?De teamlijst combineert de ingetypte naam met Iedereen, Opgieters, Sound healing of de favorieten die tijdens dit paginabezoek zijn gemarkeerd. De kaarten blijven doorlinken naar de persoonlijke agenda.

Resultaat in de appJe vindt een begeleider sneller terug tussen de ruimere teamkaarten, zonder te suggereren dat bezoekfavorieten permanent worden onthouden.

Wijziging 4 De gekozen dag- of avondweergave afstemmen op de Brusselse tijd
JavaScript
const hour = Number(new Intl.DateTimeFormat('en-GB', { timeZone: 'Europe/Brussels', hour: '2-digit', hourCycle: 'h23' }).format(new Date()));
this.content.dataset.appearance = ['light', 'dark'].includes(this.getAttribute('appearance')) ? this.getAttribute('appearance') : hour < 6 || hour >= 18 ? 'dark' : 'light';

Wat doet dit?Een expliciete keuze voor Dag of Avond blijft leidend. Bij Auto bepaalt de Brusselse klok welke kleurweergave bij het opbouwen van het programmablok wordt gebruikt.

Resultaat in de appDe proef toont herkenbare lichte of donkere kleuren zonder afhankelijk te zijn van de tijdzone van het toestel.

Wijziging 5 De gekozen dag delen via de bestaande gastenapp
JavaScript
const share = element('a', 'share-day');
share.href = origin + '/thewhiteoak/delen/?date=' + day.iso + '&lang=' + this.lang;
share.target = '_blank'; share.rel = 'noopener';
share.append(icon('share'), element('span', '', this.words.share));
meta.append(share); header.append(meta);

Wat doet dit?De deelknop neemt de geselecteerde datum en taal mee naar de bestaande deelpagina. Die opent afzonderlijk, zodat de native proef geen tweede, afwijkende deelfunctie hoeft te onderhouden.

Resultaat in de appDe dagplanning is deelbaar via de vertrouwde gastenapp, terwijl het programma en uitklapbare details in de proefpagina beschikbaar blijven.

5 wijzigingen

  • Je dag kiezen met herkenbare knoppen: Vandaag, Morgen en Overmorgen staan samen op de eerste rij. De vier volgende dagen staan op een breed scherm op één rij en op mobiel in twee rijen van twee. De gekozen dag is duidelijk gemarkeerd; beschikbare informatie over badkleding, evenementen en klankbeleving blijft bij de dag staan. De kalender blijft een andere manier om een datum te kiezen.
  • De beleving groter en persoonlijker in beeld: bij één uitgelichte sessie staat een grote beschikbare locatie- of belevingsfoto op desktop naast de sessiegegevens en op mobiel erboven. Bij meerdere uitgelichte sessies krijgt elke beleving haar eigen blok. Een ingevuld thema, de gastentekst en warmtevlammetjes verschijnen bij de sessie, zodat de sfeer en voorbereiding direct herkenbaar zijn.
  • Begeleiders makkelijker terugvinden: namen krijgen meer ruimte en beschikbare profielfoto's worden rond getoond. Zonder foto blijft een initiaal zichtbaar. Team krijgt ruimere kaarten, een zoekveld en filters voor opgieters en sound healers. Vanuit een naam of kaart blijft de persoonlijke agenda bereikbaar. Je kunt favorieten markeren en filteren voor het huidige paginabezoek; deze keuze wordt niet blijvend opgeslagen en begint na opnieuw laden weer leeg.
  • Vertrouwde kleuren en bediening onderaan: de proef heeft een lichte dagweergave en donkere avondweergave. Je kunt Auto, Dag of Avond kiezen; Auto gebruikt de Brusselse tijd. De herkenbare ondernavigatie bundelt Vandaag, Kalender, Team, Reserveren en Praktisch. De bediening blijft onderdeel van het programmablok en er ontstaat geen tweede scrolvenster.
  • Details in de pagina, aanvullende acties in de gastenapp: sessiedetails klappen binnen de proef open en de pagina groeit mee. Dagprogramma, kalender en begeleidersagenda's blijven in het blok werken. Deel dagplanning opent de bestaande deelpagina voor de gekozen datum; Reserveren en Praktisch openen de bestaande gastenapp in een nieuw tabblad. Alleen de proefvormgeving is aangepast: de echte Shopify-site, bestaande apps, tv-weergave, planning en eerdere iframe-proef blijven behouden.
v1.1.175 Het programma in de proef zonder iframe start correct
Probleem / foutmelding

Het nieuwe programmablok zonder iframe kon bij de eerste opening stoppen, omdat er op dat moment nog geen geopende sessiedetails waren om te onthouden.

Oplossing

De proef kan nu correct omgaan met een lege lijst van geopende details. Het programma start daardoor ook bij het eerste bezoek.

Technisch

De controle op geopende details gebruikt nu een verzameling die ook leeg mag zijn. Daardoor veroorzaakt het ontbreken van een geopend detail geen fout meer tijdens het opbouwen van de weergave.

Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Ook zonder geopende details de weergave opbouwen
JavaScript
const openIds = new Set(Array.from(this.shadowRoot.querySelectorAll('details[open]')).map(node => node.dataset.key));

Wat doet dit?De selectie levert nul, één of meerdere detailblokken op. Een lege selectie is geldig, zodat ook het eerste bezoek zonder geopende details kan worden verwerkt.

Resultaat in de appHet nieuwe websiteprogramma start correct en kan bij latere vernieuwingen geopende details blijven onthouden.

1 wijziging

  • De nieuwe hostingproef zonder opstartfout bekijken: het programmablok op /thewhiteoak-integratie/native/ opent nu betrouwbaar wanneer er nog geen sessiedetails openstaan. De proefpagina en downloadbare Liquid-sectie verwijzen naar de gecorrigeerde scriptversie. Deze correctie verandert geen planning, bestaande gastenapp, interne planner of tv-scherm en installeert niets in de echte Shopify-webshop.
v1.1.174 Een websiteproef zonder extra scrolvenster
Probleem / foutmelding

De eerste Shopify-proef heeft een apart venster met een eigen hoogte en scrolbalk. Om ook een programma te kunnen beoordelen dat rechtstreeks onderdeel van de webpagina is, was een tweede, zelfstandige proef nodig.

Oplossing

De nieuwe proef op /thewhiteoak-integratie/native/ toont het echte openbare programma zonder iframe. Dagkeuze, kalender, begeleidersagenda's en sessiedetails groeien mee met de pagina. De eerdere proef blijft beschikbaar ter vergelijking. Deze versie is alleen op de eigen hosting geplaatst, niet in de echte Shopify-webshop.

Technisch

De tweede integratie gebruikt het custom element white-oak-programma met Shadow DOM voor afgebakende opmaak. De centrale feed stuurt alleen geselecteerde openbare velden en accepteert uitsluitend GET en OPTIONS. Een exacte CORS-lijst bepaalt welke afgesproken websites deze gegevens vanuit de browser kunnen lezen; CORS is geen loginbeveiliging en de informatie is bewust openbaar. De widget gebruikt geen service worker of login en stuurt bij het ophalen geen aanmeldcookies mee. Shadow DOM is een opmaakgrens, geen beveiligingssandbox: het script draait in de website zelf. Dit blijft een integratieproef op de eigen hosting; er is niets in Shopify geïnstalleerd.

Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 Een automatisch meegroeiend programma-element zonder iframe gebruiken
HTML
<white-oak-programma language="nl" start-view="today">
    <p><a href="https://www.coonweb.com/thewhiteoak/">Open het actuele programma</a></p>
</white-oak-programma>
<script src="/opgietplanner/gasten/assets/white-oak-programma.js?v=1" defer></script>

Wat doet dit?Het script bouwt het programma rechtstreeks binnen het eigen element op, met afgebakende stijlen. Er wordt geen iframe met een vaste hoogte geplaatst. De link naar de gastenapp blijft een terugval wanneer het script niet beschikbaar is.

Resultaat in de appHet programma en opengeklapte sessiedetails bewegen mee met de gewone webpagina, zonder een tweede scrolvenster.

Wijziging 2 De gekozen kalenderdag en geplande sessies herkenbaar markeren
JavaScript
item.setAttribute('aria-pressed', String(this.selectedIso === day.iso));
if (day.iso === this.data.todayIso) item.setAttribute('aria-current', 'date');
item.append(element('span', '', Number(day.iso.slice(8))));
const dots = element('span', 'calendar-dots'); dots.setAttribute('aria-hidden', 'true');
if (day.sessions.some(session => session.type !== 'sound')) dots.append(element('i'));
if (day.sessions.some(session => session.type === 'sound')) dots.append(element('i', 'sound'));
item.append(dots); grid.append(item);

Wat doet dit?Vandaag en de geselecteerde dag krijgen eigen markeringen. Stippen geven aan dat de centrale bron sessies voor die dag bevat, met een aparte aanduiding voor sound healing. Een datumkeuze toont de bijbehorende sessies in dezelfde pagina.

Resultaat in de appJe vindt geplande belevingen visueel terug in de kalender en kunt vanuit het programma verder naar de beschikbare begeleidersagenda's.

Wijziging 3 Alleen lezen toestaan op het openbare gegevensadres
PHP
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
if ($origin !== '' && !in_array($origin, $allowedOrigins, true)) {
    http_response_code(403);
    echo json_encode(['error' => 'origin_not_allowed']);
    exit;
}
if ($origin !== '') header('Access-Control-Allow-Origin: ' . $origin);
header('Access-Control-Allow-Methods: GET, OPTIONS');
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
if ($method === 'OPTIONS') {
    http_response_code(204);
    exit;
}
if ($method !== 'GET') {
    header('Allow: GET, OPTIONS');
    http_response_code(405);
    echo json_encode(['error' => 'method_not_allowed']);
    exit;
}

Wat doet dit?De feed vergelijkt een meegegeven browserherkomst exact met de lijst van toegestane domeinen en weigert schrijfacties. De uitgegeven inhoud bestaat uitsluitend uit geselecteerde openbare programmavelden; dit is geen beheerkoppeling.

Resultaat in de appHet websiteblok kan openbare sessiegegevens lezen zonder toegang te krijgen tot het wijzigen van planning of beheerinstellingen.

Wijziging 4 Regelmatig controleren en een waarschuwing tonen bij oudere gegevens
JavaScript
this.poll = setInterval(() => { if (!document.hidden) this.load(); }, 60000);

let message = this.data ? this.words.liveProgramme : this.words.loading;
if (this.failed) message = this.words[this.data ? 'stale' : 'error'];
else if (this.data?.isFallback) message = this.words.fallback;
const status = element('span', 'status-message', message);
status.setAttribute('role', 'status');
this.statusBar.classList.toggle('warning', this.failed || !!this.data?.isFallback);
this.statusBar.append(status);

Wat doet dit?Het blok vraagt tijdens zichtbaar gebruik ongeveer iedere minuut nieuwe informatie op. Bij een fout of wanneer de bron terugvalgegevens levert, krijgt de bestaande informatie een zichtbare waarschuwing in plaats van ten onrechte volledig actueel te lijken.

Resultaat in de appBezoekers houden bruikbare programma-informatie en zien wanneer die mogelijk niet de nieuwste versie is.

Wijziging 5 Taal, starttab en breedte in de losse hostingproef kiezen
JavaScript
language.addEventListener('change', function () { programme.setAttribute('language', language.value); });
view.addEventListener('change', function () { programme.setAttribute('start-view', view.value); });
width.addEventListener('change', function () { document.getElementById('nativePreview').classList.toggle('is-mobile', width.value === 'mobile'); });

Wat doet dit?De voorbeeldbediening wijzigt alleen de instellingen en voorbeeldbreedte van het nieuwe programma-element op de hostingproef. Voor een latere themakopie zijn apart de Liquid-sectie en installatiehandleiding beschikbaar.

Resultaat in de appDe tweede integratie kan eerst worden beoordeeld zonder wijzigingen aan de echte Shopify-webshop.

5 wijzigingen

  • Eén pagina, één scrolbeweging: het nieuwe programmablok heeft geen afzonderlijk scrolvenster of vaste hoogte. De dagknoppen blijven zichtbaar in een overzichtelijke indeling en sessiedetails klappen binnen de pagina open. Gepubliceerde thema's, gastenteksten, warmte en beschikbare profiel- en locatiefoto's komen uit de bestaande programmabron. De eigen opmaak blijft gescheiden van die van de omringende website.
  • Van kalenderdag naar favoriete begeleider: de kalender markeert dagen met geplande sessies en toont de gekozen dag. Via Team of een begeleidersnaam bekijk je de beschikbare komende sessies van die opgieter of sound healer. De bediening kan in Nederlands, Frans of Engels worden getoond; persoonlijke thema's en berichten worden niet automatisch vertaald en blijven in de taal van de schrijver.
  • Alleen openbare informatie uit de centrale bron: het nieuwe websiteblok leest een afzonderlijk openbaar gegevensoverzicht met de benodigde sessies, begeleiders en foto's. Er zit geen login, API-sleutel of beheerdata in de widget en het gegevensadres biedt geen schrijfacties. Browsertoegang is beperkt tot de opgegeven White Oak- en Shopify-domeinen en de eigen hosting. Rooster, accounts en tv-instellingen worden niet gewijzigd.
  • Bijwerken met duidelijke melding bij problemen: zolang de pagina zichtbaar is, controleert het blok ongeveer elke minuut op wijzigingen. Bestaande broncaches blijven van toepassing, dus dit is geen garantie dat een spreadsheetwijziging binnen een minuut verschijnt. Tijdens het bekijken van details of invoer wordt nieuwe informatie even vastgehouden. Bij een verbindingsprobleem blijft eerder geladen programma-informatie met een waarschuwing staan; de volledige gastenapp blijft via een link bereikbaar.
  • Afzonderlijk testen vóór Shopify-installatie: de hostingproef laat taal, beginweergave en voorbeeldbreedte kiezen. Download de nieuwe Liquid-sectie en handleiding om deze later in een niet-gepubliceerde themakopie te proberen. In de sectie zijn onder meer titel, inleiding, taal, kleuren en maximale breedte instelbaar; de hoogte groeit vanzelf mee. De echte Shopify-site is niet aangepast en installatie in de echte thema-editor moet nog worden gecontroleerd. Beide bestaande apps, de tv-weergave en de eerdere iframe-proef blijven behouden.
v1.1.173 Betrouwbaar wisselen van starttab in de Shopify-proef
Probleem / foutmelding

Het voorbeeld op de Shopify-proefpagina reageerde niet altijd op een andere keuze bij ‘Begin bij’ wanneer de taal onveranderd bleef.

Oplossing

Een keuze voor Dagprogramma, Kalender of Team start het voorbeeld opnieuw met de juiste tab. Je hoeft daarvoor niet ook van taal te wisselen.

Technisch

De proefpagina geeft het voorbeeldvenster bij een nieuwe taal of starttab een tijdelijk vernieuwingsadres, zodat de beginweergave opnieuw wordt ingelezen. De downloadbare Shopify-sectie en de kopieerbare insluitcode worden hierdoor niet gewijzigd.

Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Ook zonder taalwijziging de gekozen tab inlezen
JavaScript
var url = 'https://www.coonweb.com/thewhiteoak-integratie/?lang=' + language.value + '#' + view.value;
if (reload) frame.src = url.replace('?', '?_preview=' + Date.now() + '&');

Wat doet dit?Het tijdelijke deel van het adres dwingt een nieuwe start van het voorbeeld af. Daardoor wordt de geselecteerde tab ook verwerkt wanneer verder alleen het adresfragment verandert.

Resultaat in de appHet hostingvoorbeeld schakelt naar Dagprogramma, Kalender of Team zoals je hebt gekozen.

1 wijziging

  • Je gekozen beginweergave direct bekijken: wissel op de hostingproefpagina tussen Dagprogramma, Kalender en Team en het voorbeeld toont nu betrouwbaar de geselecteerde starttab, ook bij dezelfde taal. Deze correctie verandert alleen het proefvoorbeeld; er is niets aangepast aan de echte Shopify-webshop.
v1.1.172 Een aparte websiteweergave met Shopify-proefpagina
Probleem / foutmelding

Het openbare gastenprogramma kon nog niet via een afzonderlijke, begrensde insluitpagina op de White Oak-website worden uitgeprobeerd. Ook ontbrak een eenvoudige proefopstelling voor de mogelijke Shopify-installatie.

Oplossing

De nieuwe integratiepagina toont dezelfde echte gastenapp in een websiteblok. Een aparte Shopify-proefpagina laat taal, starttab en voorbeeldbreedte kiezen en biedt installatiebestanden en korte insluitcode. De webshop zelf is niet aangepast en de werking in het echte Shopify-thema moet nog worden gecontroleerd. Ook is een onterechte blokkade van de automatische programmaverversing opgelost.

Technisch

De websiteweergave hergebruikt de bestaande gastenapp met een aparte weergave-instelling en is geen Shopify App Store-app. De Liquid-sectie toont haar in een iframe met eigen scrollruimte; taal, starttab, titel en afmetingen zijn na installatie via de themasectie instelbaar. Er zijn geen API-sleutels nodig voor dit openbare blok. De eigen stijlen blijven gescheiden van het webshopthema. De gedeelde verversingscode gebruikt voortaan de werkelijke zichtbaarheid van dialoogvensters; de controle-intervallen en servercache blijven ongewijzigd. Installatie en werking in het echte Shopify-thema zijn nog niet uitgevoerd of bevestigd.

Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Het bestaande openbare programma in dezelfde gastenweergave laden
PHP
$schedule = guestBuildSchedule(7);
echo $twig->render('index.twig', [
    'schedule' => $schedule,
    'scheduleJson' => json_encode($schedule, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP),
    'appRelease' => null,
    'guestChangelog' => [],
    'basePath' => '/thewhiteoak',
    'assetRoot' => '/opgietplanner/assets',
    'guestAssetRoot' => '/opgietplanner/gasten',
    'developerPhoto' => null,
    'screenProfiles' => [],
    'guestEmbed' => true,
]);

Wat doet dit?De integratiepagina haalt het programma op via dezelfde bestaande bron en gebruikt dezelfde gastenpagina, met de speciale insluitweergave aangezet. Er wordt geen kopie van het rooster opgeslagen of teruggeschreven.

Resultaat in de appDe websiteweergave houdt dezelfde dagkeuze, kalender, teamagenda's en sessie-informatie als de openbare gastenapp.

Wijziging 2 Een instelbaar voorbeeld op de proefpagina tonen
JavaScript
var url = 'https://www.coonweb.com/thewhiteoak-integratie/?lang=' + language.value + '#' + view.value;
if (reload) frame.src = url;
wrap.classList.toggle('is-mobile', width.value === 'mobile');

Wat doet dit?Een andere taal of starttab laadt het bijbehorende programma in het voorbeeldvenster. De breedtekeuze wisselt tussen een breed voorbeeld en een mobiele presentatie. De proefpagina gebruikt de gekozen taal en starttab ook voor de kopieerbare insluitcode.

Resultaat in de appDe koppeling kan op de bestaande hosting worden bekeken voordat de downloadbare sectie of Custom Liquid-code aan een niet-gepubliceerd Shopify-thema wordt toegevoegd.

Wijziging 3 Insluiten beperken tot de afgesproken websites
Apache
Header unset X-Frame-Options
Header always unset X-Frame-Options
Header always set Content-Security-Policy "frame-ancestors 'self' https://www.thewhiteoak.be https://thewhiteoak.be https://qixvvh-qv.myshopify.com https://admin.shopify.com;"

Wat doet dit?Deze regels gelden uitsluitend voor de indexpagina's binnen de nieuwe publieke integratiemap. Daar vervangt een expliciete lijst van toegestane insluitdomeinen de algemene frameblokkade; de gewone app-routes worden niet aangepast.

Resultaat in de appDe bedoelde White Oak-website en Shopify-omgeving kunnen de integratie tonen, zonder alle websites toestemming te geven de gewone apps in te sluiten.

Wijziging 4 Een gesloten dialoog niet als open behandelen
JavaScript
function scheduleRefreshIsBlocked() {
    var active = document.activeElement;
    var modalVisible = Array.from(document.querySelectorAll('dialog[open], [aria-modal="true"]')).some(function (modal) {
        return modal.getClientRects().length > 0 && getComputedStyle(modal).visibility !== 'hidden';
    });
    return modalVisible
        || !!(active && /^(INPUT|TEXTAREA|SELECT)$/.test(active.tagName));
}

Wat doet dit?De verversing bekijkt niet alleen de dialoogmarkering, maar ook of het venster werkelijk zichtbaar is. Zolang een detailvenster zichtbaar is of je een invoerveld gebruikt, wordt het overnemen van nieuwe planning nog steeds uitgesteld.

Resultaat in de appDe gastenapp en websiteweergave kunnen wijzigingen weer overnemen wanneer alle vensters gesloten zijn, zonder je midden in een sessiedetail of invoer te onderbreken.

4 wijzigingen

  • Hetzelfde programma als insluitbaar websiteblok: /thewhiteoak-integratie/ toont het bestaande openbare rooster, met dagkeuze, kalender, Team, persoonlijke agenda's en sessiedetails. Er wordt geen tweede planning aangemaakt. Het blok gebruikt dezelfde gegevens en verversing als de gastenapp; planningswijzigingen verschijnen dus niet noodzakelijk onmiddellijk.
  • Eerst proberen zonder de webshop te veranderen: op /thewhiteoak-integratie/shopify/ kun je Nederlands, Frans of Engels kiezen, beginnen bij het dagprogramma, de kalender of Team en wisselen tussen volledige en mobiele voorbeeldbreedte. Download daarna desgewenst de Liquid-themasectie en handleiding, of kopieer de korte code voor een Custom Liquid-blok. De instructies beginnen met een niet-gepubliceerde kopie van het Shopify-thema. Er is nog niets in de echte webshop geïnstalleerd of getest.
  • Een afzonderlijk en begrensd integratiepad: alleen de nieuwe integratiepagina mag worden ingesloten op de opgegeven White Oak- en Shopify-domeinen en de eigen hosting. Het blok vraagt niet om app-installatie, toont geen ontwikkelaarscontact en registreert geen eigen service worker. De bestaande framebeveiliging van de gewone gastenapp en interne planner blijft behouden. Planning, accounts en tv-instellingen veranderen niet.
  • Programmawijzigingen niet meer tegenhouden door een gesloten venster: de automatische verversing in de gewone gastenapp en het websiteblok controleert nu of een dialoogvenster echt zichtbaar is. Een gesloten venster wordt niet langer onterecht als geopend beschouwd. Een daadwerkelijk geopend sessiedetail of actief invoerveld blijft beschermd, zodat je niet midden in het lezen of invullen wordt onderbroken. De gebruikelijke controle na 15 seconden en daarna iedere minuut blijft hetzelfde.
v1.1.171 Locatie en duur samen voor een rustiger tv-beeld
Probleem / foutmelding

De duur van de uitgelichte tv-sessie stond op een aparte regel met een gele lijn erboven. Dit zorgde voor extra onderverdeling terwijl de duur ook compact bij de locatie kan worden gelezen.

Oplossing

Locatie en sessieduur staan nu samen bij de gegevens van de beleving. De aparte duurregel met gele lijn verdwijnt en de bestaande toelichting over warmte verhuist bij één sessie naar de vlammetjes.

Technisch

Alleen de plaats van bestaande informatie in de foto-gerichte tv-avondlayout verandert. De duur wordt nog steeds uit dezelfde sessiegegevens gehaald, inclusief bestaande uitzonderingen. De tv-bestanden en gastencache krijgen nieuwe versies; de gegevensverversing, andere tv-layouts en gewone gastenpagina's blijven ongewijzigd.

Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Dezelfde duurtekst met een klein klokicoon tonen
JavaScript
var facts=tvNode('span','tv-session-facts');facts.appendChild(room);
var durationLabel=session.durationLabel||sessionDurationMinutes(session)+' min';
var duration=tvNode('span','tv-session-duration');duration.setAttribute('aria-label',replace(text('duration'),{duration:durationLabel}));duration.appendChild(tvIcon('clock'));duration.appendChild(document.createTextNode(durationLabel));facts.appendChild(duration);
if(session.temperatureLabel)facts.appendChild(tvNode('span','tv-session-temperature',session.temperatureLabel));
copy.appendChild(facts)

Wat doet dit?De locatie en duur worden in één gegevensgroep geplaatst. De bestaande duurtekst blijft leidend; alleen de plek verandert. Aanwezige temperatuurinformatie blijft bij die groep, die één keer per sessie wordt opgebouwd.

Resultaat in de appJe leest waar de beleving plaatsvindt en hoelang zij duurt direct bij elkaar, zonder dubbele vermelding bij een duo.

Wijziging 2 De bestaande warmtetoelichting bij de vlammetjes houden
JavaScript
var heat=tvHeat(session);var heatSlot=tvNode('div','tv-heat-slot');
if(heat){
    heatSlot.appendChild(heat);
    if(!multiple)heatSlot.appendChild(tvNode('small','tv-heat-nuance',text('heatNuance')))
}
identity.appendChild(heatSlot);details.appendChild(identity);

Wat doet dit?Als er een warmteprofiel is, wordt de bijbehorende toelichting bij één uitgelichte sessie aan dezelfde groep als de vlammetjes toegevoegd. Het warmteprofiel zelf wordt niet veranderd.

Resultaat in de appDe nuance over warmte blijft bij de informatie waar zij over gaat, terwijl de onderzijde van de beleving rustiger wordt.

2 wijzigingen

  • Locatie en duur in één compact geheel: naast de locatie staat een klein klokicoon met de bestaande sessieduur. Deze informatie verschijnt één keer per sessie, ook wanneer twee begeleiders samen opgieten. Eventuele temperatuurinformatie blijft bij dezelfde gegevens staan. De aparte duurregel en de gele lijn erboven zijn niet meer nodig.
  • De toelichting over warmte bij de vlammetjes: bij één uitgelichte sessie staat de bestaande veiligheidsnuance nu bij de warmteweergave: warmte beschrijft de beleving en is geen vaste temperatuur. De informatie blijft behouden, zonder een extra regel onderaan de beleving. Duurwaarden, tijden, planning, overige vormgeving en het volledige dagprogramma veranderen niet.
v1.1.170 De volledige locatiefoto en meer rust in het tv-beeld
Probleem / foutmelding

Een extra breed of laag scherm kon een groot deel van de locatiefoto afsnijden. Ook versprongen de tekstonderdelen soms tussen twee belevingen, bijvoorbeeld wanneer één daarvan geen warmteprofiel had.

Oplossing

De foto-gerichte groene tv-layout krijgt volledig passende foto's, een compactere indeling voor één beleving en afgestemde teksthoogtes voor twee belevingen. Meer tussenruimte maakt het geheel rustiger, met behoud van het volledige programma en de bestaande informatie.

Technisch

Deze aanpassing geldt alleen voor de foto-gerichte tv-avondweergave. De echte locatiefoto wordt proportioneel passend getoond, terwijl een vervaagde achtergrond dezelfde foto gebruikt om vrije ruimte op te vullen. De benodigde hoogtes van de twee sessiepanelen worden op elkaar afgestemd. De vernieuwde tv-bestanden krijgen nieuwe versies en de gastencache wordt bijgewerkt; de bestaande gegevensverversing, andere tv-layouts en gewone gastenpagina's blijven behouden.

Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Een volledige foto boven een zachte achtergrondvulling plaatsen
CSS
.tv-focus-photo > img { position: relative; display: block; width: 100%; height: 100%; object-fit: contain; }
.tv-focus-photo::before { content: ''; position: absolute; inset: -8%; background: var(--tv-location-photo) center / cover no-repeat; filter: blur(calc(var(--tv-u) * 1.6)); opacity: .35; animation: tv-photo-drift 40s ease-in-out infinite alternate; }

Wat doet dit?De voorste afbeelding past volledig in het fotovak, zonder vervorming of uitsnede. De vervaagde achtergrond vult eventuele overgebleven ruimte op een rustige manier.

Resultaat in de appDe hele locatiefoto blijft herkenbaar, ook wanneer het scherm een afwijkende brede of lage verhouding heeft.

Wijziging 2 Portret en sessiegegevens compacter naast elkaar plaatsen
CSS
.tv-focus-grid:not(.has-multiple) .tv-focus-card:not(.has-multiple-hosts) .tv-focus-identity { display: grid; grid-template-columns: var(--tv-portrait) minmax(0, 1fr); column-gap: calc(var(--tv-u) * .75); }
.tv-focus-grid:not(.has-multiple) .tv-focus-card:not(.has-multiple-hosts) .tv-avatar { grid-column: 1; grid-row: 1 / span 4; align-self: center; }
.tv-focus-grid:not(.has-multiple) .tv-focus-card:not(.has-multiple-hosts) .tv-theme-slot { grid-column: 2; grid-row: 3; }
.tv-focus-grid:not(.has-multiple) .tv-focus-card:not(.has-multiple-hosts) .tv-heat-slot { grid-column: 2; grid-row: 4; }

Wat doet dit?Bij één sessie met één begeleider staat het portret naast de tekstonderdelen. Thema en warmte gebruiken dezelfde tekstkolom in plaats van elk extra ruimte onder het volledige portretblok op te eisen.

Resultaat in de appDe sessiegegevens staan overzichtelijk bij elkaar en er blijft meer hoogte over voor de locatiefoto.

Wijziging 3 De onderdelen van twee sessies op gelijke hoogte houden
CSS
.tv-focus-card { display: grid; grid-template-rows: minmax(30%, 1fr) var(--tv-details-height, auto); min-height: 0; min-width: 0; animation: tv-reveal .7s ease both; }
.tv-focus-grid.has-multiple .tv-focus-identity > .tv-people { min-height: var(--tv-people-height, 0px); }
.tv-focus-grid.has-multiple .tv-focus-identity > .tv-status { min-height: var(--tv-status-height, 0px); }
.tv-focus-grid.has-multiple .tv-theme-slot { min-height: var(--tv-theme-slot-height, 0px); }
.tv-focus-grid.has-multiple .tv-heat-slot { min-height: var(--tv-heat-slot-height, 0px); }

Wat doet dit?De tv meet hoeveel hoogte ieder onderdeel nodig heeft en gebruikt voor beide sessiepanelen de passende gezamenlijke hoogte. Een leeg thema- of warmtevak behoudt de uitlijning, maar voegt geen fictieve informatie toe.

Resultaat in de appTwee belevingen zijn gemakkelijker naast elkaar te bekijken, met gelijklopende foto- en tekstonderdelen.

Wijziging 4 Extra tussenruimte rond de hoofdonderdelen voorzien
CSS
#screenApp.is-immersive .screen-main {
    gap: calc(var(--tv-u) * 1.25);
    background: var(--tv-background);
    padding: calc(var(--tv-u) * .45) calc(var(--tv-u) * .85) calc(var(--tv-u) * 1.2) calc(var(--tv-u) * .75);
}

Wat doet dit?De ruimte tussen de uitgelichte sessie en het programma wordt vergroot. De onderrand krijgt eveneens extra ruimte, zodat de klok niet tegen de rand van het scherm staat.

Resultaat in de appHet tv-beeld oogt rustiger zonder de klok, sessiegegevens of het volledige dagprogramma weg te laten.

4 wijzigingen

  • De hele sauna op de foto zien: de locatiefoto blijft volledig zichtbaar en behoudt haar juiste verhoudingen, ook op extra brede of lage schermen. Vrije ruimte rond de foto krijgt een zachte, onscherpe achtergrondvulling. Het originele fotobestand wordt niet aangepast.
  • Meer ruimte voor de foto bij één beleving: de naam, het thema en de warmte staan compacter bij elkaar naast het ronde portret. Daardoor neemt het tekstgedeelte minder onnodige hoogte in en kan de locatiefoto meer ruimte krijgen. De gastentekst en overige sessie-informatie blijven beschikbaar.
  • Twee belevingen netjes op gelijke hoogte: de foto, begeleidersnamen, status, thema's en warmte-indicaties sluiten horizontaal beter op elkaar aan. Ook als één sessie geen thema of warmteprofiel heeft, blijft de uitlijning behouden zonder daarvoor inhoud te verzinnen.
  • Meer rust rondom de klok en het dagprogramma: er is extra tussenruimte naast het uitgelichte deel en onder de tijdsbalk. Huidige tijd, starttijd, afteller en het volledige dagprogramma blijven zichtbaar; de tijden en planning zelf veranderen niet.
v1.1.169 Grote foto's en duidelijke tijden voor je volgende tv-beleving
Probleem / foutmelding

Bij het bekijken van het tv-programma waren de huidige tijd en de starttijd niet altijd meteen uit elkaar te houden. De namen, foto's en persoonlijke sessie-informatie mochten prominenter, terwijl het volledige programma in beeld moest blijven.

Oplossing

De groene tv-avondvormgeving is vernieuwd volgens het goedgekeurde foto-ontwerp. Links staan de lopende of eerstvolgende belevingen met grote foto's en de twee duidelijk benoemde tijden; rechts blijft het volledige dagprogramma zichtbaar. Dit verandert alleen die tv-layout, niet de planning of de pagina's in de gastenapp.

Technisch

Deze tv-weergave gebruikt dezelfde openbare planning, beschikbare portretten en opgeslagen sessieprofielen. Er zijn geen sessies of foto's uit het fictieve ontwerpvoorbeeld toegevoegd. De bestaande sessieduren, ROTS-afwijkingen en gegevensverversing blijven behouden. Een nieuwe versie van de tv-bestanden en de gastencache zorgt dat de gewijzigde opmaak bij het gebruikelijke vernieuwen beschikbaar komt. Andere tv-layouts en de gewone gastenpagina's blijven ongewijzigd.

Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 Elke beleving en begeleider een herkenbare plek geven
JavaScript
var photo=tvNode('div','tv-focus-photo');var image=document.createElement('img');image.src=session.image||eventFallbackImage;image.alt=sessionRoomLabel(session);image.decoding='async';photo.appendChild(image);card.appendChild(photo);
var details=tvNode('div','tv-focus-details');details.appendChild(tvHostList(session,'focus'));

Wat doet dit?Iedere uitgelichte sessie krijgt de beschikbare locatiefoto en een eigen lijst met begeleiders. De begeleiderslijst maakt voor iedere naam een aparte rij met het bijbehorende beschikbare portret; bij een ontbrekende foto blijft de bestaande terugval gebruikt.

Resultaat in de appNamen, portretten en locatie horen visueel duidelijk bij dezelfde beleving, ook bij meerdere begeleiders of gelijktijdige sessies.

Wijziging 2 De ingevulde warmte als vijf herkenbare vlammetjes tonen
JavaScript
var profile=sessionProfile(session);if(!profile||!profile.heatLevel)return null;
var flames=tvNode('span','tv-flames');
for(var i=1;i<=5;i+=1){var flame=tvIcon('flame');if(i<=profile.heatLevel)flame.classList.add('is-filled');flames.appendChild(flame)}
heat.appendChild(flames);heat.appendChild(tvNode('span','tv-heat-label',heatLabel(profile.heatLevel)));return heat

Wat doet dit?Alleen een bestaand warmteprofiel wordt weergegeven. De vijf symbolen tonen de ingevulde waarde met gevulde en open vlammetjes, aangevuld met het vertrouwde warmtelabel. Thema en gastentekst worden uit hetzelfde sessieprofiel gehaald.

Resultaat in de appJe ziet de persoonlijke warmtebeleving bij het thema en de extra uitleg, zonder een cijferbreuk of automatisch verzonnen warmteniveau.

Wijziging 3 Een volgende beleving al naast de lopende tonen
JavaScript
var future=state.programme.filter(function(session){return minutesUntil(session)>0});
var next=future.length?future.filter(function(session){return session.startsAt===future[0].startsAt}):[];
if(live.length)return next.length&&minutesUntil(next[0])<=screenTiming().announceMinutes?next.concat(live):live;

Wat doet dit?De tv verzamelt de eerstvolgende sessies met dezelfde starttijd. Zodra die binnen de ingestelde aankondigingstermijn vallen, worden ze samen met de nog lopende sessies uitgelicht. De tijdsbalk toont de huidige klok en de volgende start afzonderlijk.

Resultaat in de appJe hoeft niet te wachten tot een lopende beleving is afgerond om te zien wat er binnenkort begint.

Wijziging 4 Het volledige programma tonen met duidelijke sessiestatussen
JavaScript / CSS
if(usesFullDayOverview()){
    renderCompleteDayProgramme(list,programme,displayState);
    fitCompleteDayProgramme(list);return
}

.tv-programme-row[data-stage="live"] { background: #cbe8b0; }
.tv-programme-row:is([data-stage="afterglow"], [data-stage="finished"]) { --tv-gold: var(--tv-muted); color: var(--tv-muted); }
.tv-programme-row:is([data-stage="afterglow"], [data-stage="finished"]) .tv-avatar { filter: grayscale(1); opacity: .68; }

Wat doet dit?Deze layout bouwt het programma in één overzicht op en past de schaal aan de beschikbare ruimte aan. De sessiestatus bepaalt de achtergrond en tekstweergave; afgelopen portretten worden grijs in plaats van verwisseld of uit het programma verwijderd.

Resultaat in de appHet volledige programma blijft zichtbaar, met duidelijk onderscheid tussen wat komt, bezig is en al is afgelopen.

Wijziging 5 Zachte animaties uitschakelen wanneer minder beweging gewenst is
CSS
@media (prefers-reduced-motion: reduce) {
    .tv-focus-card, .tv-programme-row, .tv-focus-photo > img, .tv-countdown-ring { animation: none; }
    #screenApp.is-immersive .tv-focus-photo .focus-audience-message,
    #screenApp.is-immersive .tv-focus-rest .focus-audience-message { animation: none; }
}

Wat doet dit?De foto, overgangen, aftelring en motto-weergave krijgen geen animatie wanneer het toestel minder beweging vraagt. De inhoud blijft beschikbaar en de klok blijft werken.

Resultaat in de appEen verzorgde, levendige tv-presentatie die ook rustig zonder animaties bekeken kan worden.

5 wijzigingen

  • Zie meteen wie je begeleidt en waar: één uitgelichte sessie krijgt één grote locatiefoto. Wanneer meerdere belevingen tegelijk relevant zijn, krijgt elke beleving haar eigen foto en informatie. Namen staan prominent bij de beschikbare ronde profielfoto's; meerdere begeleiders staan onder elkaar met hun portret naast de juiste naam. De datum staat bovenaan en overbodige dubbele koppen verdwijnen.
  • Thema, extra uitleg en warmte samen: het persoonlijk ingevulde thema en de korte gastentekst staan rechtstreeks bij de uitgelichte beleving. De warmte wordt herkenbaar getoond met vijf vlammetjes, waarvan het passende aantal gevuld is, en het bijbehorende woord zoals ‘Intens’. Zonder ingevuld warmteprofiel verschijnt er geen verzonnen warmte-indicatie. Warmte blijft een indicatie van de beleving, geen vaste temperatuur.
  • Huidige tijd en volgende start bij elkaar: de duidelijk benoemde klok en starttijd staan samen in de balk onder de foto, met een bescheiden aftelring. Binnen de in beheer ingestelde aankondigingstermijn verschijnt de volgende sessie ook naast een beleving die nog bezig is. Sessies die samen starten worden samen getoond; iedere beleving heeft haar eigen status en tijd.
  • Het hele programma in één oogopslag: alle sessies blijven in het overzicht staan, zonder wisselende pagina's. Dunne lijnen maken de lijst rustiger. Komende sessies houden hun kleurenfoto's, een binnenkort beginnende sessie krijgt een gouden achtergrond en een lopende sessie een lichtgroene. Afgelopen sessies worden neutraal grijs met een gedempt portret. De opmaak past zich aan de beschikbare ruimte aan.
  • Rustige beweging en af en toe een levensmotto: foto's bewegen heel zacht, sessies verschijnen met een subtiele overgang en de aftelring beweegt rustig mee. Bestaande levensmotto's en gastgerichte woorden verschijnen af en toe op de foto, zonder de sessietekst te vervangen. De voorkeur van het toestel voor minder beweging wordt gerespecteerd.
v1.1.168 Verder navigeren vanaf de gekozen kalenderdag
Probleem / foutmelding

Bij het springen naar de eerstvolgende sessie kon de toetsenbordbediening haar plek in de persoonlijke kalender verliezen.

Oplossing

De geselecteerde dag krijgt nu de focus nadat de kalender is bijgewerkt, zonder onnodige scrollsprong.

Technisch

Alleen de focusoverdracht in de gedeelde persoonlijke kalender is aangepast. Sessies en andere gegevens blijven ongewijzigd.

Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 De gekozen datum opnieuw bereikbaar maken voor het toetsenbord
JavaScript
var selected = body.querySelector('.host-agenda-calendar-day[aria-pressed=true]');
if (selected) selected.focus({ preventScroll:true });

Wat doet dit?Na het vernieuwen krijgt de gekozen datumknop focus, zonder automatisch naar een andere scrollpositie te springen.

Resultaat in de appJe hoeft na het kiezen van een dag niet opnieuw je weg te zoeken in de agenda.

1 wijziging

  • Je plek in de kalender behouden: kies een datum of gebruik ‘Ga naar de eerstvolgende sessie’ en navigeer daarna met het toetsenbord verder vanaf die dag. De kalenderopmaak en het programma blijven hetzelfde.
v1.1.167 Plan je bezoek via de kalender van je begeleider
Probleem / foutmelding

Om te ontdekken wanneer je favoriete begeleider aanwezig is, moest je de persoonlijke sessielijst doorlopen. Dat gaf nog geen direct overzicht van de beschikbare dagen in een maand.

Oplossing

De persoonlijke agenda opent nu met een maandkalender. Kies in Team een opgieter of sound healer en zie welke dagen sessies bevatten. Het profiel met ronde foto en de eerstvolgende beleving met locatiefoto blijven in beeld naast de kalender op desktop en erboven op mobiel.

Technisch

Dit is een nieuwe weergave van hetzelfde programma. Sessies, begeleiders en reserveringsvoorwaarden veranderen niet. De kalender blijft de bestaande planningverversing en cache gebruiken; wijzigingen aan de planning zijn dus niet noodzakelijk onmiddellijk zichtbaar.

Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Verschillende markeringen voor sessies en datums gebruiken
CSS
.host-agenda-calendar-dot { display:inline-block; flex:none; width:5px; height:5px; border-radius:50%; background:#44785d; }
.host-agenda-calendar-dot.is-sound { background:var(--ha-gold); border-radius:1px; transform:rotate(45deg); }
.host-agenda .host-agenda-calendar-day[aria-current=date] { border-color:var(--ha-ink); }
.host-agenda .host-agenda-calendar-day[aria-pressed=true] { background:#214d3b; color:#fff; border-color:#214d3b; }

Wat doet dit?Kleur en vorm maken onderscheid tussen opgieten of verzorging en sound healing. Vandaag krijgt een rand, terwijl de aangeklikte datum wordt ingevuld.

Resultaat in de appJe ziet snel op welke dagen je begeleider een sessie verzorgt en welke datum je bekijkt.

Wijziging 2 De gekozen dag koppelen aan de persoonlijke sessielijst
JavaScript
function selectCalendarDay(iso) {
    selectedDate = iso; calendarMonth = iso.slice(0, 7); agendaView = 'calendar'; calendarMotion = 'day'; render();
}
var shown = upcoming.filter(function (entry) { return agendaView === 'calendar' ? entry.day.iso === selectedDate : range === 'all' || entry.day.iso < end; });

Wat doet dit?De agenda onthoudt de datum die je aanklikt en toont de nog lopende of komende sessies van die dag. Kies je de lijst, dan wordt weer het bijbehorende bredere overzicht gebruikt.

Resultaat in de appVanuit een kalenderdag vind je direct de juiste tijden, locaties en uitklapbare sessiedetails.

Wijziging 3 Ontbrekende planning niet als vrije dag voorstellen
JavaScript
control.disabled = offset < 0 ? calendarMonth <= firstMonth : calendarMonth >= lastMonth;
choice.disabled = iso < today || calendarDays.indexOf(iso) === -1;
var label = dateLabel(iso, false) + ' · ' + (iso < today ? t('pastDay') : choice.disabled ? t('notPublished') : sessions.length ? sessions.length + ' ' + t(sessions.length === 1 ? 'sessionOne' : 'sessionMany') : t('emptyDay'));

Wat doet dit?Niet-beschikbare datums worden uitgeschakeld en krijgen een andere omschrijving dan ingelezen dagen zonder aangekondigde sessies. De maandpijlen laten je niet voorbij de beschikbare planning bladeren.

Resultaat in de appJe ziet wat er werkelijk is aangekondigd, zonder dat ontbrekende sessies als zekere afwezigheid worden gepresenteerd.

3 wijzigingen

  • Herkenbare dagen en sessiesoorten: een groene stip staat voor opgieten of verzorging; een gouden ruit voor sound healing, ook wanneer de begeleider live klanken bij een opgieting verzorgt. Vandaag en je gekozen datum zijn apart gemarkeerd. De kalender volgt de dag- of avondweergave en respecteert de pauzeknop voor animaties en de instelling voor minder beweging.
  • Kies een dag en bekijk de belevingen: tik een datum aan om de lopende en komende sessies van die begeleider te zien, met tijden, locaties, thema's en eventuele medebegeleiders. Klap een sessie open voor extra informatie. Met ‘Kalender’ of ‘Lijst’ kun je steeds tussen beide overzichten wisselen.
  • Alleen beschikbare planning als basis: je bladert met de maandpijlen binnen de beschikbare periode. Datums buiten het ingelezen programma en voorbije dagen zijn niet aanklikbaar. Staat er nog geen komende sessie bij een dag, dan wordt dat zo vermeld; het betekent niet dat de begeleider zeker vrij is.
v1.1.166 Gelijkmatig ronde portretten in het teamoverzicht
Probleem / foutmelding

De portretten in het teamoverzicht hadden nog niet overal dezelfde ronde vorm en vaste verhoudingen als de vernieuwde teamweergave.

Oplossing

Foto's en initialen verschijnen in een vaste cirkel, netjes gecentreerd naast de naam en informatie van de begeleider. Dezelfde portretvorm wordt gebruikt in de gastenapp en de interne planner.

Technisch

Alleen de vormgeving is aangepast. De originele foto's, namen, persoonsgegevens en planning blijven behouden. Er zijn geen ontbrekende foto's toegevoegd en de manier waarop foto's worden opgehaald verandert niet.

Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Foto's en initialen in dezelfde ronde portretcontainer plaatsen
CSS
.host-portrait { width: 112px; height: 112px; overflow: hidden; display: grid; place-items: center; border-radius: 50%; background: var(--green-soft); }
.host-portrait img, .host-initial { width: 100%; height: 100%; }
.host-portrait img { display: block; object-fit: cover; object-position: center; }

Wat doet dit?De buitenste cirkel bepaalt de vaste verhouding voor zowel foto's als initialen. Een foto vult deze ruimte met een gecentreerde uitsnede, zonder het fotobestand zelf te bewerken.

Resultaat in de appDe begeleiders worden in Team met gelijkmatig ronde portretten weergegeven.

1 wijziging

  • Een rustig en herkenbaar teamoverzicht: iedere beschikbare profielfoto vult een ronde uitsnede vanuit het midden; initialen krijgen dezelfde cirkelvorm. De grootte is standaard 112 bij 112 pixels en op schermen tot en met 390 pixels breed 96 bij 96 pixels. Namen en sessie-informatie kunnen meer ruimte innemen zonder de vorm van het portret te veranderen.
v1.1.165 Je volgende beleving in beeld — en eenvoudig te delen
Probleem / foutmelding

Bij het plannen van een bezoek was de persoonlijke agenda nog vrij tekstgericht. Een herkenbare locatie, tijd tot de volgende sessie en een directe deelmogelijkheid ontbraken.

Oplossing

De agenda van je begeleider toont de eerstvolgende beleving met een beschikbare locatiefoto en afteller. Komende sessies staan in een overzichtelijke tijdlijn per dag. Je kunt het profiel rechtstreeks delen en zelf kiezen of je de subtiele animaties wilt zien.

Technisch

Het programma zelf verandert niet. De afteller gebruikt de al beschikbare begin- en eindtijd; nieuwe programmagegevens worden nog steeds ongeveer elke minuut opgevraagd met de bestaande cache. Een gedeelde profiellink bevat geen interne teamnotities of persoonlijke plannergegevens.

Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 De locatie van de eerstvolgende sessie herkenbaar tonen
JavaScript
var countdown = node('p', 'host-agenda-countdown'); countdown.append(icon('clock'), node('span', '', countdownText(entry))); copy.appendChild(countdown);
if (entry.session.image) {
    var media = node('div', 'host-agenda-next-media'); var image = node('img'); image.src = entry.session.image; image.alt = entry.session.room; image.decoding = 'async';
    image.addEventListener('error', function () { media.remove(); next.classList.remove('has-photo'); });
    media.appendChild(image); next.appendChild(media); next.classList.add('has-photo');
}
setInterval(updateCountdown, 15000);

Wat doet dit?De agenda gebruikt de beschikbare foto die bij de sessie hoort en voegt een afteller toe. Als een afbeelding ontbreekt of niet laadt, blijft de tekstweergave beschikbaar. Een lokale timer werkt de afteller bij.

Resultaat in de appJe ziet in één overzicht waar de sessie plaatsvindt en hoeveel tijd er nog is.

Wijziging 2 Een later bezoek direct zichtbaar maken en de sessies tellen
JavaScript
var upcoming = forPerson(activeName);
var end = addDays(isoNow(), 7);
if (range === 'auto') range = upcoming.length && upcoming[0].day.iso >= end ? 'all' : 'week';
var shown = upcoming.filter(function (entry) { return range === 'all' || entry.day.iso < end; });
if (shown.length) {
    var days = new Set(shown.map(function (entry) { return entry.day.iso; })).size;
    section.appendChild(node('p', 'host-agenda-summary', days + ' ' + t(days === 1 ? 'dayOne' : 'dayMany') + ' · ' + shown.length + ' ' + t(shown.length === 1 ? 'sessionOne' : 'sessionMany')));
}

Wat doet dit?Wanneer de eerste komende sessie buiten zeven dagen valt, kiest de agenda automatisch het ruimere overzicht. Daarna telt ze de verschillende datums en de sessies die daarin zichtbaar zijn.

Resultaat in de appJe vindt ook een later gepland bezoek meteen terug, met een samenvatting van de beschikbare dagen en sessies.

Wijziging 3 De juiste openbare profielagenda delen
JavaScript
function profileUrl(name) {
    var url = new URL('/thewhiteoak/', location.origin);
    url.searchParams.set('host', key(name).replace(/ /g, '-')); url.searchParams.set('lang', language()); url.hash = 'hosts'; return url.href;
}

Wat doet dit?De link gebruikt de naam van de bekeken begeleider en de taal van de agenda. Hij verwijst altijd naar de openbare gastenapp, niet naar de interne planner.

Resultaat in de appIemand met wie je de link deelt, komt rechtstreeks bij dezelfde begeleider terecht.

Wijziging 4 Beweging aanpassen aan jouw voorkeur
JavaScript
var paused = motionPaused || reducedMotion.matches;
dialog.classList.toggle('is-motion-paused', paused);
motionButton.replaceChildren(icon(paused ? 'play' : 'pause'));
motionButton.disabled = reducedMotion.matches;
motionButton.setAttribute('aria-pressed', String(!paused));
motionButton.setAttribute('aria-label', t(reducedMotion.matches ? 'reduced' : paused ? 'play' : 'pause'));

Wat doet dit?De beweging staat uit zodra de pauzeknop of de toestelinstelling dat vraagt. De knop wordt daarop aangepast, terwijl de inhoud beschikbaar blijft.

Resultaat in de appJe kunt de persoonlijke agenda rustig zonder animaties bekijken.

4 wijzigingen

  • Zie waar en wanneer je volgende beleving begint: de uitgelichte sessie krijgt de beschikbare foto van de locatie en een afteller tot de start. Tijdens een lopende sessie zie je de verwachte resterende tijd. De tijdweergave wordt iedere 15 seconden bijgewerkt zolang de agenda zichtbaar is.
  • Gemakkelijker je bezoek vooruit plannen: op desktop staan het overzicht en de tijdlijn naast elkaar, op mobiel onder elkaar. Je ziet hoeveel dagen en sessies het gekozen overzicht bevat. Is de eerstvolgende sessie pas na de komende zeven dagen, dan opent meteen ‘Alle geplande dagen’, zodat die sessie niet buiten beeld blijft.
  • Nodig iemand uit met een profiellink: deel de agenda van je favoriete begeleider via de deelknop. De link opent rechtstreeks het juiste openbare profiel en bewaart de gekozen taal. Als delen via het toestel niet beschikbaar is, kun je de link kopiëren.
  • Subtiele beweging die je kunt pauzeren: de agenda verschijnt rustig en het favorietenhartje geeft een korte reactie. Met de pauzeknop zet je animaties uit zonder de afteller stil te zetten. Als je toestel minder beweging vraagt, volgt de agenda die voorkeur.
v1.1.164 Verzorgde lettertypes in je persoonlijke sessieagenda
Probleem / foutmelding

Bij het bekijken van de agenda van een begeleider gebruikte de gastenapp nog vervangende lettertypes. Namen, koppen en toelichtingen kregen daardoor niet de bedoelde uitstraling.

Oplossing

De persoonlijke agenda laadt nu de gekozen lettertypes voor de sierlijke koppen en de heldere gewone tekst. Zo sluit de vormgeving aan bij dezelfde agenda in de interne app.

Technisch

De benodigde lettertypes worden nu ook voor de gastenagenda geladen. Tijdens het ophalen blijft de tekst leesbaar in een vervangend lettertype. Dit is uitsluitend een verbetering van de opmaak.

Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 De bedoelde agenda-lettertypes beschikbaar maken
HTML
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@400;600&family=Inter:wght@400;500;600;700&display=swap">

Wat doet dit?Cormorant Garamond en Inter worden expliciet geladen voor het gedeelde agendavenster. De bestaande agenda-opmaak kan daardoor de gekozen lettertypes gebruiken in plaats van alleen de vervangende browserlettertypes.

Resultaat in de appDe agenda van je begeleider krijgt de bedoelde herkenbare vormgeving, zonder veranderingen aan het programma.

1 wijziging

  • Een rustigere, consistente agendaweergave: namen, sessietijden, koppen en toelichtingen gebruiken nu de bedoelde lettertypes, passend bij de White Oak-opmaak. Je vindt nog steeds dezelfde sessies, details en favorieten; de inhoud en planning veranderen niet.
v1.1.163 Ontdek de komende sessies van je favoriete begeleiders
Probleem / foutmelding

Om te weten wanneer een favoriete opgieter of sound healer opnieuw aanwezig is, moest je verschillende dagprogramma's doorzoeken. Een teamprofiel bood nog geen eigen overzicht van komende sessies.

Oplossing

Klik in Team op een begeleider of kies een naam in het programma, de kalender of het sessiedetail. De nieuwe persoonlijke agenda toont de beschikbare profielfoto, de lopende of eerstvolgende beleving en de komende sessies. De rustige opmaak volgt de dag- of avondweergave; de bediening is beschikbaar in het Nederlands, Frans en Engels. Met een lokaal bewaarde favoriet vind je iemand later gemakkelijk terug.

Technisch

Deze agenda gebruikt de bestaande openbare planning en neemt ook gepubliceerde last-minute wijzigingen mee. Een geopend profiel vraagt ongeveer elke minuut opnieuw gegevens op; de bestaande cache blijft gelden, zodat wijzigingen niet noodzakelijk onmiddellijk verschijnen. Onderaan zie je tot welke datum er planning beschikbaar is. Bij verbindingsproblemen wordt aangegeven wanneer je de laatst beschikbare planning bekijkt.

Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Uur, sessietitel en locatie samen in een uitklapbare rij tonen
JavaScript
var detail = node('details', 'host-agenda-entry'); detail.dataset.entryId = session.id;
var summary = node('summary', 'host-agenda-row'); summary.dataset.agendaFocus = 'session-' + session.id;
var time = node('time', '', session.timeDisplay); time.dateTime = session.startsAt;
var copy = node('span', 'host-agenda-row-copy');
copy.appendChild(node('b', '', sessionTitle(session)));
copy.appendChild(node('span', '', session.room));

Wat doet dit?Elke sessie krijgt een eigen uitklapbare rij met de begintijd, het persoonlijke thema of de sessienaam en de locatie. Aanvullende informatie staat onder diezelfde rij.

Resultaat in de appJe kunt komende belevingen rustig vergelijken en de details openen van de sessie die je interesseert.

Wijziging 2 Alleen nog lopende en komende sessies van deze persoon selecteren
JavaScript
function forPerson(name) {
    var id = key(name);
    return entries.filter(function (entry) { return entry.end > Date.now() && entry.people.some(function (p) { return key(p.name) === id; }); });
}

Wat doet dit?De agenda kijkt of de persoon voorkomt bij de begeleiders of live sound healers van een sessie. Daarnaast moet de geplande eindtijd nog in de toekomst liggen; een sessie die bezig is, blijft dus zichtbaar.

Resultaat in de appOok gezamenlijke sessies verschijnen bij de juiste persoon, terwijl afgelopen belevingen niet tussen de komende sessies blijven staan.

Wijziging 3 Favorieten op het toestel bewaren met duidelijke terugkoppeling
JavaScript
var saved = true;
try { localStorage.setItem(favouriteKey, JSON.stringify(favourites)); } catch (error) { saved = false; }
paint();
body.querySelector('.host-agenda-local').textContent = t(saved ? 'local' : 'temporary');
document.dispatchEvent(new CustomEvent('whiteoak:host-favourites'));

Wat doet dit?De browser bewaart de favoriete namen lokaal en geeft het teamoverzicht door dat de keuze is gewijzigd. Als bewaren geblokkeerd wordt, verschijnt een melding dat de keuze alleen op de geopende pagina geldt.

Resultaat in de appJe vindt favoriete begeleiders terug via Team, zonder registratie of automatische berichten.

3 wijzigingen

  • Wanneer kun je jouw begeleider beleven?: bovenaan staat de lopende of eerstvolgende sessie. Kies ‘7 dagen’ of ‘Alle geplande dagen’ om verder te kijken binnen de beschikbare planning van deze en volgende maand. Per datum zie je uur, locatie en thema of sessienaam. Klap een sessie open voor de beschikbare beschrijving, warmtebeleving, duur, prijs, reservatievoorwaarden en andere begeleiders.
  • Ook duo's en live klanken in de juiste agenda: ieder lid van een duo heeft een eigen aanklikbare naam. Een sound healer toont zowel losse klanksessies als gezamenlijke opgietingen met live klanken. Afgelopen sessies verdwijnen bij het bijwerken uit het komende overzicht zodra hun geplande eindtijd voorbij is.
  • Je favorieten bij de hand: kies ‘Bewaar als favoriet’ en gebruik in Team het filter Favorieten. Je hebt geen account nodig. De keuze blijft in deze browser op dit toestel, zonder meldingen of synchronisatie naar andere toestellen. Kan je browser de keuze niet bewaren, dan wordt dat duidelijk vermeld.
v1.1.162 Een actueel programma bij last-minute wijzigingen
Probleem / foutmelding

Bij een onverwachte wijziging van begeleider, uur of locatie kon het gastenprogramma nog de oorspronkelijke gegevens tonen. Een geannuleerde sessie moest bovendien duidelijk onderscheiden worden van wat wel doorgaat.

Oplossing

Het team kan wijzigingen voor één datum publiceren die de gastenapp en tv bij hun volgende verversing overnemen. Je ziet de bijgewerkte namen, beschikbare profielfoto's, uren, locaties en sessienamen, met een openbare toelichting wanneer nodig. Een annulering staat apart vermeld en verschijnt niet meer als huidige of volgende beleving. Interne teamnotities worden niet aan gasten getoond.

Technisch

De app en tv nemen gepubliceerde wijzigingen mee bij de volgende gegevenscontrole, doorgaans ongeveer elke 60 seconden. Alleen openbare meldingen worden gedeeld; interne notities blijven voor het team. Een wijziging van de sessienaam verandert niet automatisch de prijs, duur of voorwaarden van een bijzonder ritueel.

Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 De nieuwe begeleiders in de planning tonen
PHP
$session['host'] = implode(' & ', $patch['hosts']);
$session['opgieterPhotos'] = guestParticipantPhotos($patch['hosts'], $photos);
$session['hostCount'] = count($patch['hosts']);

Wat doet dit?Bij een gepubliceerde vervanging worden de actuele namen en beschikbare profielfoto's gebruikt. Een duo behoudt beide namen in dezelfde sessie.

Resultaat in de appGasten herkennen wie de sessie daadwerkelijk begeleidt, ook na een last-minute wissel.

Wijziging 2 Een annulering uit de actieve sessies halen maar wel melden
PHP
if ($record['status'] === 'cancelled') return null;
$day['lastMinuteNotices'] = sessionChangesNotices($day['iso'], $store);

Wat doet dit?De geannuleerde sessie wordt niet meer als beschikbare beleving opgenomen. De aparte datumgebonden meldingen blijven wel bij het programma beschikbaar.

Resultaat in de appEen vervallen sessie wordt niet meer aangekondigd als ‘Nu’ of ‘Straks’, terwijl gasten de annulering wel kunnen terugvinden.

2 wijzigingen

  • De actuele gegevens van je sessie: last-minute vervangingen en wijzigingen van uur, locatie of sessienaam verschijnen in het programma en op tv, met de beschikbare foto's van de begeleiders. Een korte melding legt uit wat er voor die datum is veranderd.
  • Duidelijk zien wat wel en niet doorgaat: geannuleerde sessies staan als aparte melding en niet meer bij ‘Nu’ of ‘Straks’. Als er uitzonderlijk geen sound healing is, kan een gecombineerde opgieting wel doorgaan zonder live klanken. Meerdere tv-meldingen worden automatisch afgewisseld.
v1.1.161 Luxe scrubsessie om 14:00 en 18:00 herkenbaar in het programma
Probleem / foutmelding

De gewone scrub om 14:00 stond soms nog onder de algemene naam ‘Scrubsessie’, terwijl de bedoelde standaardbenaming ‘Luxe scrubsessie’ is.

Oplossing

De standaardscrubs om 14:00 en 18:00 heten voortaan allebei ‘Luxe scrubsessie’ in het gastenprogramma en op tv, met passende Franse en Engelse vertalingen. Bijzondere sessies houden hun eigen titel, thema en eventinformatie. Dit is een aanpassing van de benaming; prijzen, duurtijden, begeleiders en ingevulde sessie-inhoud veranderen niet.

Technisch

De opgeslagen programmakopie en offlinebestanden worden vernieuwd, zodat de aangepaste benaming ook na opnieuw openen wordt gebruikt. De onderliggende planning en sessiegegevens blijven ongewijzigd.

Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 De luxe-benaming in drie talen tonen
PHP
$titles = !$isDefaultScrubTitle
    ? ['nl' => $description, 'fr' => $description, 'en' => $description]
    : [
        'nl' => $isLuxury ? 'Luxe scrubsessie' : 'Scrubsessie',
        'fr' => $isLuxury ? 'Rituel de gommage premium' : 'Rituel de gommage',
        'en' => $isLuxury ? 'Luxury scrub ritual' : 'Scrub ritual',
    ];

Wat doet dit?Voor een standaardscrub kiest het programma de bijbehorende benaming in de gekozen taal. Een eigen sessienaam krijgt voorrang en blijft behouden.

Resultaat in de appGasten herkennen de Luxe scrubsessie om 14:00 en 18:00, ongeacht de gekozen taal.

1 wijziging

  • Twee duidelijke momenten voor de Luxe scrubsessie: de standaardscrubs om 14:00 en 18:00 staan onder dezelfde naam in de gastenapp en op tv, ook in het Frans en Engels. Eigen sessietitels en informatie over bijzondere rituelen blijven behouden.
v1.1.160 De juiste sound-healingduur en eerder weten wat volgt
Probleem / foutmelding

Gewone sound healing werd met een te lange duur getoond. Daardoor kon de tv de sessie te lang als bezig laten staan. Ook was tijdens een lopende beleving niet altijd duidelijk welke sessie daarna zou beginnen.

Oplossing

Gewone sound healing staat nu als 30 minuten in de planning. De tv gebruikt die duur ook voor de verwachte afronding en nazorg; bijzondere events met een eigen opgegeven duur blijven ongewijzigd. Tijdens een actieve beleving kondigt de tv de eerstvolgende sessie alvast aan, ook als die nog buiten het normale aankondigingsvenster valt. Het team kan daarnaast de opmaak per tv centraal kiezen en eerst bekijken voordat die wordt gepubliceerd.

Technisch

De vernieuwde planning gebruikt de nieuwe standaardduur ook na het opnieuw laden van eerder bewaarde gegevens. Expliciete eventduren hebben voorrang. Een aangepaste tv-layout wordt pas na bewaren bij de volgende automatische gegevenscontrole overgenomen.

Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 De gewone klanksessie als 30 minuten tonen
PHP
'type' => 'sound',
'durationMinutes' => 30,
'durationLabel' => '30 min',

Wat doet dit?De standaardplanning gebruikt dezelfde duur voor het zichtbare label en de berekende eindtijd van gewone sound healing. Eventinformatie kan een andere duur voorschrijven.

Resultaat in de appGasten zien de juiste duur en de tv gaat op het bijbehorende moment over naar afronding en nazorg.

Wijziging 2 Ook een latere volgende sessie tijdens de beleving aankondigen
JavaScript
if(minutesUntil(future[0])>screenTiming().announceMinutes&&!state.programme.some(isSessionLive))return[];
return future.filter(function(session){return session.startsAt===future[0].startsAt})

Wat doet dit?Zolang er een sessie bezig is, hoeft de volgende startgroep niet op het gewone aankondigingsvenster te wachten. Zonder lopende sessie blijft die ingestelde grens van toepassing.

Resultaat in de appGasten kunnen tijdens de huidige sessie al zien wat de eerstvolgende keuze is.

Wijziging 3 Nieuwe tv-opmaak eerst als voorbeeld tonen
JavaScript
if (frame.contentWindow) frame.contentWindow.postMessage({type:'whiteoak:preview-layout', layout:layout}, window.location.origin);

Wat doet dit?Het team bekijkt een aangepaste layout eerst in een apart tv-voorbeeld. Deze tijdelijke keuze wordt niet automatisch op het echte scherm toegepast.

Resultaat in de appDe bestaande tv-weergave blijft stabiel totdat het team de gewenste opmaak bewust bewaart.

3 wijzigingen

  • Sound healing met de juiste duur: een gewone klanksessie wordt als 30 minuten weergegeven. De tv sluit met de verwachte afronding en nazorg daarop aan. Bijzondere sessies, zoals een expliciet aangekondigde XL-beleving of een ROTS-ritueel, behouden hun eigen opgegeven duur.
  • Al tijdens de huidige sessie weten wat volgt: de tv kondigt de eerstvolgende beleving aan terwijl er nog een sessie bezig is. Sessies die op hetzelfde eerstvolgende tijdstip beginnen, verschijnen samen. Buiten een lopende sessie volgt de aankondiging de tijden die het team heeft ingesteld.
  • Tv-opmaak afgestemd op het scherm: het team kan per tv de indeling, kleurweergave en leesgrootte kiezen, met een voorvertoning vóór publicatie. De bestaande opmaak blijft staan totdat een nieuwe keuze wordt bewaard; de planning zelf verandert hierdoor niet.
v1.1.159 Op tv duidelijk zien wat straks begint en bijna afgerond is
Probleem / foutmelding

Tijdens een lopende beleving kon de aankondiging van de volgende sessie uit beeld blijven. Ook het naderende einde en de nazorg hadden geen vaste zichtbare plek boven het dagprogramma.

Oplossing

Boven de tv-planning verschijnt een vaste aankondiging met startuur, afteller, naam en locatie. Die blijft zichtbaar wanneer bijvoorbeeld een sound healing nog bezig is. Standaard zie je de volgende sessie 30 minuten vooraf, krijgt ze vanaf 15 minuten de melding ‘Begint zo’ en verschijnt 5 minuten vooraf waar je kunt verzamelen. Voor het geschatte einde komt een afrondingsmelding, gevolgd door passende nazorg. Het team kan deze tijdsvensters per scherm aanpassen.

Technisch

Het team kan de aankondigings- en nazorgtijden per tv instellen. De tv neemt bewaarde instellingen mee bij de volgende automatische gegevenscontrole. Aftellers en afrondingsmeldingen volgen de starttijd en geplande duur; een vermelde eindtijd blijft een schatting.

Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Aankondigingen los van de onderste balk weergeven
Twig
<aside class="screen-announcements" id="screenAnnouncements" aria-label="Aankondigingen en nazorg" aria-live="polite" hidden></aside>
<div class="upcoming-list" id="upcomingList"></div>

Wat doet dit?De aankondiging krijgt een eigen plek direct boven de daglijst. Ze hoeft daardoor niet te wachten tot de groot getoonde sessie of de onderste informatiebalk verandert.

Resultaat in de appGasten zien wat straks begint terwijl een andere beleving nog bezig is.

Wijziging 2 Een duidelijke opbouw naar de start gebruiken
PHP
function schermenDefaultTiming(): array
{
    return [
        'announceMinutes' => 30,
        'soonMinutes' => 15,
        'entranceMinutes' => 5,
        'endingMinutes' => 5,
        'afterglowMinutes' => 5,
    ];
}

Wat doet dit?De standaardtijden geven gasten eerst een aankondiging, daarna extra nadruk en vlak voor de start de vraag om te verzamelen. Het team kan deze minuten per scherm aanpassen.

Resultaat in de appGasten hebben tijd om zich voor te bereiden en weten wanneer ze bij de begeleider worden verwacht.

Wijziging 3 Nazorg laten aansluiten bij de beleving
JavaScript
if(type==='sound')return[session&&session.isSpecialEventSession&&tips.length?tips[tips.length-1]:text('tipAfterSound')];
if(type==='aufguss'||type==='heat'||type==='live')return[text('tipAfterHeat')];

Wat doet dit?De nazorgmelding gebruikt bij sound healing een rustige afsluiting en bij warme sessies een afkoeltip. Specifieke aanwijzingen voor een bijzonder event krijgen waar van toepassing voorrang.

Resultaat in de appDe melding na afloop past bij de sessie die de gast zojuist heeft beleefd.

3 wijzigingen

  • De volgende beleving op een vaste plek: kijk boven het dagprogramma voor het startuur, de afteller, naam en locatie. De aankondiging blijft zichtbaar tijdens een andere lopende sessie, ook wanneer de onderste informatiebalk niet in beeld staat.
  • Op tijd klaar voor de start: de tv kondigt standaard 30 minuten vooraf aan wat volgt. Vanaf 15 minuten staat er ‘Begint zo’ en vanaf 5 minuten vraagt het scherm je bij de ingang of het aangeduide verzamelpunt te wachten op de begeleider.
  • Rustig afronden en nagenieten: standaard verschijnt 5 minuten vóór het geschatte einde een afrondingsmelding en blijft na afloop 5 minuten passende nazorg zichtbaar. Na sound healing gaat het om rustig nagenieten; na een warme sessie om afkoelen. De begeleider bepaalt het echte einde en informatie over bijzondere rituelen blijft leidend.
v1.1.158 Geen wachttijd meer op de rest van het tv-dagprogramma
Probleem / foutmelding

Op extra brede schermen was soms maar een deel van het programma zichtbaar. De letters en foto's werden door de extra breedte groter, waarna de tv de overige sessies op een volgende pagina plaatste. Op een kleiner scherm kon hetzelfde programma wel volledig zichtbaar zijn.

Oplossing

In de tv-weergave met de grote sfeerfoto staat het dagprogramma voortaan samen in één overzicht, zonder automatisch wisselende programmapagina's. De grootte van teksten en portretten wordt afgestemd op de werkelijke ruimte, met aandacht voor zowel de schermhoogte als de breedte. De sfeerfoto blijft ongeveer de helft van het scherm innemen. Het overzicht behoudt alle sessies, tijden, locaties en volledige namen, met de beschikbare profielfoto's. Afgelopen sessies blijven gedimd zichtbaar.

Technisch

De tv controleert de ruimte die de sessieregels werkelijk nodig hebben en past hun grootte zo nodig samen aan. Dit wordt opnieuw gecontroleerd na een formaatwijziging, het laden van de letters en het opnieuw weergeven van het programma. De aanpassing geldt voor de avondweergave met grote sfeerfoto; andere tv-indelingen blijven ongewijzigd.

Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Het volledige programma op dezelfde pagina houden
JavaScript
if(usesFullDayOverview()){
    renderCompleteDayProgramme(list,programme,displayState);
    fitCompleteDayProgramme(list);return
}

Wat doet dit?De tv bouwt de volledige daglijst op en zoekt een passende grootte. Deze weergave schakelt daarna niet meer over naar vervolgpagina's.

Resultaat in de appGasten zien de hele dagplanning samen en hoeven niet te wachten op de overige sessies.

Wijziging 2 De beschikbare schermhoogte meenemen
CSS
--tv-programme-unit: min(1vw, 2.5vh);
--tv-programme-title: calc(clamp(23px, var(--tv-programme-unit) * 1.45, 64px) * var(--tv-programme-scale, 1));
--tv-programme-photo: calc(clamp(54px, var(--tv-programme-unit) * 3.5, 144px) * var(--tv-programme-scale, 1));

Wat doet dit?Tekst en foto's worden niet meer alleen door de breedte van het scherm groter. Ook de hoogte telt mee, waarna de ruimtemeting de grootte indien nodig verder aanpast.

Resultaat in de appEen extra breed scherm toont geen kleiner deel van het dagprogramma doordat de letters en foto's te groot worden.

2 wijzigingen

  • Bekijk meteen het hele programma: naast de grote foto staat de volledige daglijst. Je hoeft niet op een paginawissel te wachten om te zien wat er later op de dag gepland is.
  • Ook op een extra breed scherm een compleet overzicht: de tekst en portretten passen zich aan de beschikbare hoogte en breedte aan. De volledige namen en beschikbare foto's blijven staan en de grote sfeerfoto behoudt haar plaats.
v1.1.157 Een grote sfeerfoto én het hele dagprogramma op tv
Probleem / foutmelding

De foto op tv werd te smal wanneer het programma meer ruimte nodig had. De planning bevatte tegelijk herhaalde tekst en duoportretten die veel breedte innamen. De animatie bij het verschijnen kon daarnaast onnodig een tweede pagina veroorzaken.

Oplossing

De sfeerfoto krijgt op breedbeeld weer ongeveer de helft van het scherm, naast het volledige dagprogramma. De sessierijen benutten hun ruimte beter: foto's van duo's staan onder het uur, met de volledige namen ernaast. Het sessiethema is meteen de titel en een samenwerking met live klank krijgt een kortere omschrijving. Tijden, sauna's, namen, portretten en warmte-informatie blijven zichtbaar. Sessies verschijnen rustig zonder te verschuiven, zodat een passend overzicht niet door de animatie alsnog over pagina's wordt verdeeld.

Technisch

De foto behoudt haar halve schermbreedte. Het programma wint ruimte door de onderdelen van iedere sessie anders te plaatsen en herhaalde tekst weg te laten. De regels worden op hun vaste plek zichtbaar, zodat de ruimtemeting klopt. De huidige elf sessies zijn in het Nederlands gecontroleerd op HD, Full HD en 4K.

Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 De grote foto evenveel ruimte geven als het programma
JavaScript
if(style==='evening'&&focus.enabled){focus.span=6;programme.span=6}

Wat doet dit?In de weergave met grote foto worden de twaalf beschikbare kolommen gelijk verdeeld tussen sfeerbeeld en planning.

Resultaat in de appDe foto blijft ongeveer een halve tv breed, met het dagprogramma ernaast.

Wijziging 2 De sessietitel kort en duidelijk houden
JavaScript
var programmeTitle=usesFullDayOverview()&&profile&&profile.theme?profile.theme:(usesFullDayOverview()&&session.liveWith?text('compactLiveSession'):sessionProgrammeTitle(session));

Wat doet dit?Het thema van een sessie wordt direct getoond, zonder ervoor nog eens het sessietype te herhalen. Een samenwerking zonder thema krijgt de korte titel ‘Opgiet & live klank’.

Resultaat in de appEr blijft meer ruimte voor de volledige namen, portretten en andere informatie bij de sessie.

Wijziging 3 Het overzicht rustig zichtbaar maken
CSS
@keyframes screen-row-fade {
    from { opacity: 0; }
    to { opacity: 1; }
}

.screen-app[data-layout-style="evening"][data-layout-composition="cinematic-media"] .upcoming-list.programme-complete .upcoming-row {
    animation-name: screen-row-fade;
}

Wat doet dit?De sessieregels blijven op hun plaats terwijl ze zichtbaar worden. De ruimte die ze nodig hebben, verandert tijdens die overgang niet.

Resultaat in de appGasten zien een passend dagprogramma op één overzicht en hoeven niet door een onnodige paginawissel te wachten.

3 wijzigingen

  • Weer een grote sfeerfoto: de foto en het programma nemen op breedbeeld elk ongeveer de helft van het scherm in. Zo krijgt de sfeer van de sauna opnieuw alle ruimte.
  • Het volledige dagprogramma blijft ernaast: duoportretten staan onder het uur, de namen blijven volledig leesbaar en een sessiethema wordt direct de titel. De huidige planning blijft samen in beeld, met de tijden, sauna's, foto's en warmte-informatie.
  • Het passende dagprogramma blijft samen in beeld: de animatie bij het verschijnen van sessies veroorzaakt geen onnodige tweede pagina meer. De regels worden rustig zichtbaar, terwijl de foto, afteller en andere bewegingen behouden blijven.
v1.1.156 Het hele dagprogramma naast de grote sfeerfoto
Probleem / foutmelding

De lijst naast de grote tv-foto toonde niet altijd alle sessies van de dag. De groot uitgelichte sessie ontbrak in die lijst en de herhaalde tekst ‘Opgieter/opgietster’ zorgde voor extra drukte.

Oplossing

Naast de grote sfeerfoto staat nu het volledige ‘Dagprogramma’, inclusief de uitgelichte sessie en de gedimde afgelopen sessies. De planning krijgt meer ruimte wanneer dat nodig is, zodat de huidige dagplanning in één overzicht past op de gecontroleerde breedbeeldformaten. Bij een drukkere planning kan een derde kolom helpen. De foto's en volledige namen blijven zichtbaar; de algemene opgietersrol verdwijnt en de aanduiding van de sound healer blijft staan.

Technisch

De tv-weergave met de grote sfeerfoto gebruikt voortaan de volledige daglijst en controleert hoeveel breedte die nodig heeft. De bestaande vervolgpagina's blijven als opvang beschikbaar wanneer een uitzonderlijk volle planning niet tegelijk past; andere tv-indelingen behouden hun eigen verdeling.

Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 De volledige daglijst tonen
JavaScript
if(usesFullDayOverview()||showsFullProgramme()||state.tomorrow)return{sessions:state.programme,state:state,tomorrow:state.tomorrow,completed:state.finished&&!state.tomorrow};

Wat doet dit?De weergave met grote foto kiest de volledige planning van de dag. Sessies verdwijnen daardoor niet uit dit overzicht zodra ze afgelopen zijn.

Resultaat in de appGasten kunnen het hele programma terugzien, met afgelopen sessies duidelijk gedimd.

Wijziging 2 Het programma extra breedte en zo nodig een derde kolom geven
JavaScript
if(completeDayProgrammeOverflows(list))screenApp.classList.add('has-expanded-programme');
if(completeDayProgrammeOverflows(list)&&programme.length>7){
    list.replaceChildren();renderCompleteDayProgramme(list,programme,displayState,3)
}

Wat doet dit?Het scherm meet of de sessies passen en gebruikt waar nodig meer ruimte naast de foto. Een langere planning kan over drie kolommen worden verdeeld.

Resultaat in de appMeer van het dagprogramma blijft tegelijk in beeld, met behoud van de sfeerfoto.

Wijziging 3 De namen in beeld houden
JavaScript
if(role.kind==='sound')roleLine.appendChild(Object.assign(document.createElement('b'),{textContent:role.label}));
roleLine.appendChild(Object.assign(document.createElement('span'),{textContent:role.name}));

Wat doet dit?De naam van iedere deelnemer blijft rechtstreeks zichtbaar. De algemene roltekst is overbodig; de specifieke aanduiding van de sound healer blijft behouden.

Resultaat in de appGasten zien duidelijk wie de sessie verzorgt, met minder herhaalde tekst.

3 wijzigingen

  • Alle sessies in het tv-dagoverzicht: onder ‘Dagprogramma’ staan ook de sessie bij de grote foto en de afgelopen sessies. Wat al voorbij is, wordt gedimd weergegeven.
  • De ruimte op het scherm beter benut: waar nodig krijgt de planning meer breedte naast de foto of een extra kolom. De huidige dagplanning is zo in één overzicht te bekijken, met behoud van de grotere tekst en herkenbare profielfoto's.
  • Een rustigere naamweergave: de tekst ‘Opgieter/opgietster’ wordt weggelaten bij de grote foto en gecombineerde rollen. Namen en foto's blijven zichtbaar; ‘Sound healer’ maakt de samenwerking nog steeds duidelijk, ook in de Franse en Engelse weergave.
v1.1.155 Lees het tv-dagprogramma gemakkelijker vanop afstand
Probleem / foutmelding

De dagplanning naast de grote sfeerfoto bevatte kleine tekst en portretten. Daardoor moesten gasten dichter bij het tv-scherm komen om een tijd, naam of sessietitel goed te kunnen lezen.

Oplossing

De tv toont grotere tijden, sessietitels, sauna's, opgietersnamen en profielfoto's, met behoud van de grote sfeerfoto. De inhoud groeit mee met grotere schermen en hoge resoluties. Lange namen en titels worden volledig over meerdere regels getoond. Het programma blijft op één overzicht staan als er genoeg ruimte is en wisselt anders automatisch tussen maximaal twee pagina's. Het scherm controleert opnieuw of alles past wanneer de beschikbare ruimte of het geladen lettertype verandert.

Technisch

De tv stemt de tekstgrootte en portretten af op de schermbreedte en controleert opnieuw hoeveel ruimte nodig is na een formaatwijziging of het laden van de letters. Zo blijft de grotere dagplanning overzichtelijk.

Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Profielfoto's en belangrijke tekst groter tonen
CSS
--tv-programme-time: clamp(32px, 2.2vw, 92px);
--tv-programme-title: clamp(23px, 1.45vw, 64px);
--tv-programme-host: clamp(20px, 1.2vw, 52px);
--tv-programme-photo: clamp(54px, 3.5vw, 144px);

Wat doet dit?De grootte van tijden, titels, namen en foto's groeit mee met de schermbreedte, met een vaste onder- en bovengrens.

Resultaat in de appGasten kunnen de planning van verderaf lezen en de opgieters gemakkelijker herkennen.

Wijziging 2 Lange namen ruimte geven
CSS
overflow: visible;
line-height: 1.12;
text-overflow: clip;
white-space: normal;
overflow-wrap: anywhere;

Wat doet dit?De naamweergave laat tekst op een nieuwe regel verdergaan. Ook lange sessietitels krijgen ruimte om over meerdere regels te lopen.

Resultaat in de appDe volledige titel en beide namen bij een duo blijven zichtbaar.

Wijziging 3 Bij ruimtegebrek maximaal twee programmapagina's gebruiken
JavaScript
if(wideEvening)pageSize=Math.max(pageSize,Math.ceil(programme.length/2));
var pageGroups=programmePageGroups(programme,pageSize,wideEvening?2:0);

Wat doet dit?Als het volledige programma niet naast de grote sfeerfoto past, verdeelt deze weergave de sessies over hoogstens twee pagina's. Het scherm wisselt die automatisch af.

Resultaat in de appDe planning blijft groter leesbaar zonder dat gasten op een lange reeks pagina's moeten wachten.

3 wijzigingen

  • Groter dagprogramma en grotere profielfoto's: tijden, sessies, sauna's en opgieters zijn van verderaf leesbaar en herkenbaar. De grote sfeerfoto blijft behouden en ook op een 4K-tv groeien de portretten mee.
  • Alle namen en titels blijven leesbaar: lange sessietitels en de namen van beide duo-opgieters mogen over meerdere regels lopen, zodat je de volledige informatie ziet.
  • Het overzicht past zich aan de ruimte aan: je ziet het volledige programma wanneer dat past, anders wisselt de tv tussen maximaal twee pagina's. De sessie die al groot wordt uitgelicht, staat niet nog eens in de lijst.
v1.1.154 Meer inspiratie en warme woorden tijdens je wellnessdag
Probleem / foutmelding

De inspirerende teksten mochten meer afwisseling bieden en vaker aandacht geven aan de gasten en de mensen die de sessies verzorgen.

Oplossing

De gastenapp gebruikt nu 30 levensmotto's, 10 gastboodschappen en 10 boodschappen voor opgieters, beschikbaar in het Nederlands, Frans en Engels. Het motto wisselt elke vijf minuten. Bij de warme woorden wisselt de app elke minuut tussen gasten en team, met iedere vijf minuten een volgende tekst uit elke verzameling. Ook de interne planner en het tv-scherm gebruiken deze teksten. Alles blijft op de bestaande plekken; persoonlijke sessiebedankjes en de informatie over nazorg blijven behouden.

Technisch

De gastenapp, interne planner en tv gebruiken één verzameling teksten. Ze kiezen automatisch een volgende tekst op basis van de dag en de tijd. Alleen de inhoud op de bestaande tekstplekken verandert; de planning hoeft niet opnieuw te laden.

Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Een motto kiezen in de taal van de gast
JavaScript
var message = window.WhiteOakInspiration.get('mottos', currentLanguage, day.iso);

Wat doet dit?De gastenapp vraagt het actuele motto op voor de gekozen dag en taal. De gezamenlijke verzameling kiest standaard iedere vijf minuten een volgende tekst.

Resultaat in de appGasten zien afwisselende motto's in het Nederlands, Frans of Engels zonder de pagina te vernieuwen.

Wijziging 2 Aandacht voor gasten en opgieters afwisselen
JavaScript
var kind = Math.floor(Date.now() / 60000) % 2 === 0 ? 'guests' : 'team';
var message = window.WhiteOakInspiration.get(kind, currentLanguage, day.iso);

Wat doet dit?Elke minuut wisselt de tekstplek tussen een boodschap voor gasten en een boodschap voor opgieters. Iedere verzameling bevat tien teksten en gaat elke vijf minuten verder.

Resultaat in de appEr is regelmatig een nieuw woord van welkom of waardering, zonder extra drukte in het dagprogramma.

Wijziging 3 Op tv voldoende leestijd geven
JavaScript
var seconds=stage==='finished'?40:24;
var sequence=session&&stage!=='finished'?['tip','mottos','guests','tip','mottos','team']:['mottos','guests','team'];

Wat doet dit?Het tv-scherm wisselt praktische tips af met motto's en warme woorden. Tijdens het programma krijgt iedere boodschap 24 seconden; bij de afsluiting wordt dat 40 seconden.

Resultaat in de appGasten krijgen rustige afwisseling op het grote scherm, met behoud van de nuttige tips rond hun sessie.

3 wijzigingen

  • 30 momenten van inspiratie: elke vijf minuten verschijnt een volgend levensmotto, zonder dat je de pagina hoeft te vernieuwen. De tekst volgt de taal die je in de gastenapp kiest.
  • Een warm welkom en waardering voor het team: 10 gastboodschappen en 10 boodschappen voor opgieters wisselen op de bestaande tekstplek. Zo lees je naast je programma ook regelmatig iets over rust, aandacht en waardering voor elkaar.
  • Dezelfde warmte op het tv-scherm: tijdens het programma wisselen tips, motto's en warme woorden om de 24 seconden. Bij de afsluiting blijft iedere boodschap 40 seconden staan, zodat je rustig kunt lezen.
v1.1.153 Veeg soepel vanaf een dagknop of sessie naar de volgende dag
Probleem / foutmelding

Op een telefoon kon een veeg vanaf tekst, een dagknop of een sessie meteen worden afgebroken. De planning bleef dan op dezelfde dag staan, ook wanneer de veeg lang genoeg was.

Oplossing

De gastenapp volgt de volledige veegbeweging vanaf de plek die je aanraakt. Veeg naar rechts voor de volgende dag of naar links voor de vorige, ook over tekst, dagknoppen en sessies. De zeven dagknoppen blijven zichtbaar en gewoon aantikbaar; dezelfde verbetering is toegepast in de interne planner.

Technisch

De gastenapp laat een begonnen veeg doorgaan wanneer je vinger van een knop of tekst verder over het programma beweegt. Alleen het werkelijke einde van de beweging sluit de bediening af.

Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 De volledige vingerbeweging blijven volgen
JavaScript
surface.addEventListener('lostpointercapture', function (event) {
    if (gesture && event.target === surface && event.pointerId === gesture.id) resetGesture();
});

Wat doet dit?De gastenapp controleert of de melding echt bij het actieve veeggebied en dezelfde vingerbeweging hoort. Een melding van de eerst aangeraakte knop of tekst stopt de veeg niet meer.

Resultaat in de appGasten kunnen vanaf de dagknoppen of een sessie betrouwbaar naar een andere dag vegen.

1 wijziging

  • Betrouwbaar swipen over je dagplanning: begin je veeg gerust op een dagknop, tekst of sessie. Rechts gaat naar de volgende dag, links naar de vorige en alle dagknoppen blijven zichtbaar en aantikbaar.
v1.1.152 Naar rechts naar de volgende dag, met je dagknoppen behouden
Probleem / foutmelding

Swipen naar rechts ging naar de vorige dag in plaats van de volgende. De veeg kon bovendien niet op een dagknop beginnen en de interne planner gebruikte op mobiel een andere indeling voor de latere dagen.

Oplossing

In de gastenapp en opgietplanner ga je nu naar de volgende dag door naar rechts te vegen en naar de vorige dag door naar links te vegen. Je kunt over de dagknoppen of het programma vegen. De vertrouwde knoppen blijven staan en gewoon aantikken blijft werken. Beide apps tonen op mobiel Vandaag, Morgen en Overmorgen op de eerste rij en de vier volgende dagen op twee rijen van twee.

Technisch

Een horizontale veeg gebruikt in beide apps dezelfde dagrichting. Dagknoppen kunnen het begin van een veeg zijn; de app onderscheidt die beweging van een gewone tik. De vaste indeling blijft staan tijdens het wisselen van dag.

Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 De veeg naar rechts aan de volgende dag koppelen
JavaScript
var dx = event.clientX - gesture.startX;
gesture.delta = dx > 0 ? 1 : -1;
gesture.target = data.days[index + gesture.delta] || null;

Wat doet dit?De gastenapp vergelijkt de huidige vingerpositie met het begin van de veeg. Een beweging naar rechts kiest het volgende beschikbare dagprogramma; links kiest het vorige.

Resultaat in de appGasten gaan met één veeg naar rechts van Vandaag naar Morgen.

Wijziging 2 De vertrouwde mobiele dagindeling in beide apps gebruiken
CSS
@media (max-width: 839px) {
    .public-oak-app .day-row-more,
    .internal-oak-app .day-weekgrid .day-row-more {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

Wat doet dit?De eerste drie dagen houden hun eigen rij. De vier vervolgknoppen staan in twee kolommen, zodat ze ook op een telefoon volledig binnen de pagina blijven.

Resultaat in de appGasten en opgieters behouden dezelfde zeven zichtbare dagknoppen naast de veegbediening.

2 wijzigingen

  • Veeg naar rechts voor de volgende dag: rechts brengt je één dag vooruit, links één dag terug. De gastenapp en interne planner reageren hetzelfde en tonen de juiste uitleg bij de dagkeuze.
  • Alle dagknoppen blijven behouden: veeg ook over de knoppen of tik rechtstreeks op een datum. Op mobiel blijft de overzichtelijke indeling van drie, twee en twee knoppen zichtbaar en gebruikt de interne planner dezelfde indeling.
v1.1.151 Volledige duonamen, vaste dagknoppen en beter leesbare tv-tekst
Probleem / foutmelding

Bij langere duonamen kon op tv, in de gedeelde planning of in een detailweergave een deel van de naam verdwijnen. Tegelijk mocht de nieuwe mogelijkheid om tussen dagen te swipen de vertrouwde dagknoppen niet vervangen. Het volledige dagprogramma op tv was voor gasten op grotere afstand nog te klein.

Oplossing

Iedere duo-sessie toont nu beide namen volledig zoals ze zijn aangeleverd, met behoud van alle profielfoto's en zonder zelf ontbrekende achternamen te verzinnen. De gastenapp en interne app laten horizontaal swipen tussen dagen toe, maar houden alle zeven dagen zichtbaar in een raster van drie plus vier; de interne app behoudt ook de vorige- en volgendepijl en blijft na swipen op dezelfde hoogte staan. Op tv zijn tijd, titel, sauna en opgietersnaam groter gemaakt. Alleen wanneer het volledige programma werkelijk niet past, gebruikt het scherm de bestaande opvang van maximaal twee pagina's.

Technisch

De publieke presentatie gebruikt voortaan regelomloop in plaats van afkapping, voegt swipe toe naast de vaste dagbediening en vergroot de tv-typografie zonder de bestaande maximale tweepagina-opvang te wijzigen.

Technische stappen
  1. Lange duo-aanduidingen krijgen regelomloop zonder puntjes; bestaande naam- en fotogegevens worden ongewijzigd hergebruikt.
  2. Swipe is toegevoegd aan de bestaande dagkeuze en verbergt of vervangt geen knoppen; de interne dagwissel behoudt de scrollpositie.
  3. De tv-typografie is opgeschaald en de bestaande hoogtemeting bewaakt of één pagina volstaat dan wel de tweede pagina nodig is.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Een duo volledig en met beide foto's presenteren
JSON
{
  "host": "Alex Radaman & Jasmien Verlinden",
  "display": "volledig, meerdere regels toegestaan",
  "profilePhotos": 2,
  "inventMissingSurnames": false
}

Wat doet dit?De gastgerichte weergaven nemen exact de beschikbare namen en foto's over en korten de combinatie niet meer stil af.

Resultaat in de appBij een duo is meteen duidelijk wie de sessie samen verzorgt.

Wijziging 2 Zeven dagen zichtbaar houden naast swipe
JSON
{
  "visibleDayButtons": 7,
  "layout": [3, 4],
  "tap": true,
  "swipeLeftRight": true,
  "internalPreviousNext": true,
  "scrollJumpAfterSwipe": false
}

Wat doet dit?Swipen komt bovenop de bestaande bediening; alle dagen blijven rechtstreeks aantikbaar en de interne pijlen verdwijnen niet.

Resultaat in de appGasten en opgieters wisselen op hun favoriete manier van dag zonder overzicht of positie te verliezen.

Wijziging 3 De tv-planning vanop afstand leesbaar houden
JSON
{
  "emphasize": ["tijd", "sessietitel", "sauna", "opgieter"],
  "fontScale": "groter",
  "maximumProgrammePages": 2
}

Wat doet dit?De kerninformatie krijgt een grotere schaal, terwijl de bestaande plaatscontrole voorkomt dat regels over elkaar vallen.

Resultaat in de appMeer gasten kunnen het dagprogramma zonder bril lezen en hoeven hoogstens op één volgende pagina te wachten.

3 wijzigingen

  • Volledige duonamen met alle foto's: beide aangeleverde namen blijven zichtbaar op tv, bij delen, in het gastendetail en in de klassieke interne kalender; er worden geen namen bij verzonnen.
  • Swipen zonder dagknoppen te verliezen: beide apps houden zeven klikbare dagknoppen in een 3+4-raster; intern blijven de pijlen staan en blijft de scrollpositie na swipen behouden.
  • Grotere tekst in het tv-dagprogramma: tijden, titels, sauna's en opgieters zijn van verderaf leesbaar en gebruiken bij plaatsgebrek hoogstens twee pagina's.
v1.1.150 Tv toont de eerstvolgende beleving nog maar één keer
Probleem / foutmelding

De sessie die groot als eerstvolgende beleving of actuele sessie werd uitgelicht, kon tegelijk opnieuw in het programma rechts staan. Daardoor ging beschikbare schermruimte verloren en leek het alsof dezelfde sessie tweemaal gepland was.

Oplossing

De grote focus blijft ongewijzigd, maar precies die zichtbare sessie verdwijnt tijdelijk uit het tweede programma. Bij meerdere gelijktijdige focussessies gebeurt dat voor alle betrokken sessies. Het rechterdeel heet voortaan ‘Verder vandaag’ of ‘Verder morgen’ en het totale aantal sessies blijft het volledige dagtotaal tonen.

Technisch

Het scherm vergelijkt stabiele sessie-identiteiten van het zichtbare focusblok met de tweede programmalijst. Alleen overeenkomsten worden uit die presentatie verwijderd; brondata, totalen en automatische verversing blijven behouden.

Technische stappen
  1. Alleen de visuele programmalijst wordt gefilterd; de planning en sessiegegevens blijven volledig behouden.
  2. De filtering is uitsluitend actief wanneer het focusblok in de gekozen tv-layout zichtbaar is.
  3. De nieuwe teksten zijn beschikbaar in Nederlands, Frans en Engels en de tv-assets zijn opnieuw gecachet.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 De focus maar één keer tonen
JavaScript
const focusIds = new Set(focus.map(sessieId));
const overigeSessies = programma.filter(sessie => !focusIds.has(sessieId(sessie)));

Wat doet dit?De tv herkent welke sessie al groot in beeld staat en slaat uitsluitend die sessie over in de tweede lijst.

Resultaat in de appGasten zien geen schijnbare dubbele planning meer.

Wijziging 2 Meteen tonen wat nog volgt
JSON
{
  "heading": "Verder vandaag",
  "programme": "overige sessies",
  "simultaneousFocusHandled": true
}

Wat doet dit?De kop en inhoud zijn afgestemd op de resterende sessies, ook wanneer meerdere belevingen gelijktijdig in de focus staan.

Resultaat in de appBeschikbare schermruimte wordt nuttiger gebruikt en gasten lezen sneller wat hierna komt.

Wijziging 3 Het volledige dagtotaal behouden
JSON
{
  "dailyTotal": 11,
  "focusVisible": 1,
  "listedAfterFocus": 10,
  "emptyText": "Geen andere sessies meer"
}

Wat doet dit?De teller gebruikt de volledige dagplanning, terwijl alleen de tweede visuele lijst de focus overslaat.

Resultaat in de appHet scherm blijft inhoudelijk correct en communiceert ook een lege restplanning duidelijk.

3 wijzigingen

  • Geen dubbele sessie meer: wat groot als eerstvolgende of actuele beleving staat, wordt niet opnieuw rechts herhaald.
  • Meer ruimte voor wat daarna komt: het programma rechts toont onder ‘Verder vandaag’ of ‘Verder morgen’ meteen de overige sessies.
  • Dagoverzicht blijft volledig: het totaal bovenaan blijft alle sessies tellen en een rustige lege melding verschijnt wanneer niets anders meer volgt.
v1.1.149 Last-minute locatiewijzigingen verschijnen automatisch
Probleem / foutmelding

Wanneer een opgietsessie last minute naar een andere sauna verhuisde, kon de publieke planning nog de oorspronkelijke ruimte en ruimtefoto tonen. Daardoor moesten gasten de juiste locatie soms ter plaatse navragen.

Oplossing

De gastenapp gebruikt nu automatisch de actuele, door de toegewezen opgieter gekozen sauna. De wijziging verschijnt in het dagprogramma, de kalender, gedeelde dagplanningen en op het tv-scherm, samen met de juiste locatie-afbeelding. Zodra de opgieter opnieuw voor de roosterlocatie kiest, keert alles automatisch naar die standaard terug.

Technisch

De publieke dataset scheidt de vaste roosterlocatie van de actuele weergavelocatie. Hierdoor blijven links en sessie-identiteiten stabiel, terwijl ruimte, foto, delen en tv automatisch met de wijziging meegaan.

Technische stappen
  1. De publieke planning houdt de oorspronkelijke sessie-identiteit stabiel en gebruikt daarnaast de actuele effectieve ruimte voor tekst en beeld.
  2. Na een locatiekeuze wordt de planningscache vernieuwd; gastenapp en tv nemen de aanpassing via hun bestaande automatische controle over.
  3. Bestaande sessies zonder locatie-afwijking blijven exact hun geplande ruimte gebruiken.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 De werkelijk gebruikte sauna tonen
JSON
{
  "scheduledRoom": "Panorama Sauna",
  "room": "The Barn",
  "roomChanged": true
}

Wat doet dit?De planning kent zowel de oorspronkelijke als de actuele ruimte en toont aan gasten altijd de actuele keuze.

Resultaat in de appGasten lopen meteen naar de juiste sauna.

Wijziging 2 De juiste locatie-afbeelding koppelen
JSON
{
  "room": "Forest Sauna",
  "detailImage": "forest-sauna",
  "updatedAutomatically": true
}

Wat doet dit?De ruimtefoto wordt opnieuw bepaald nadat de effectieve locatie bekend is.

Resultaat in de appNaam en beeld spreken elkaar niet tegen en de nieuwe locatie is sneller herkenbaar.

Wijziging 3 Alle publieke weergaven samen vernieuwen
JSON
{
  "sameRoomIn": ["dagprogramma", "kalender", "gedeelde planning", "tv-scherm"],
  "manualRefreshRequired": false
}

Wat doet dit?Alle publieke kanalen lezen dezelfde actuele planningsbron en controleren die automatisch opnieuw.

Resultaat in de appGasten krijgen overal dezelfde locatie te zien zonder extra handelingen van het team.

Wijziging 4 De sessie-identiteit stabiel houden
JSON
{
  "sessionIdUses": ["datum", "tijd", "roosterlocatie"],
  "displayRoomUses": "actuele locatie"
}

Wat doet dit?De technische identiteit blijft aan het oorspronkelijke tijdslot gekoppeld, terwijl alleen de zichtbare ruimte verandert.

Resultaat in de appEen verplaatsing veroorzaakt geen dubbele kaart, gebroken detailweergave of verloren selectie.

4 wijzigingen

  • Altijd naar de juiste sauna: dagprogramma en kalender tonen automatisch de last-minute gekozen opgietlocatie.
  • De ruimtefoto volgt mee: het detailscherm gebruikt direct het passende beeld van The Barn, Panorama Sauna of Forest Sauna.
  • Delen en tv blijven gelijk: een gedeelde planning en het grote scherm gebruiken dezelfde actuele locatie als de gastenapp.
  • De sessie blijft herkenbaar: een verplaatsing verandert alleen de locatie en maakt geen dubbele of nieuwe sessie.
v1.1.148 Thema en warmte verschijnen automatisch op tv
Probleem / foutmelding

Het tv-scherm maakte nog niet duidelijk genoeg zichtbaar welke sfeer en warmte een opgieter voor een sessie had voorbereid. Alle extra informatie overal volledig tonen zou het rustige dagoverzicht echter onnodig druk maken.

Oplossing

Zodra een opgieter een thema, warmteniveau of korte boodschap bewaart, neemt de tv die informatie automatisch over bij de volgende gegevenscontrole, binnen maximaal 60 seconden. De grote eerstvolgende beleving toont het volledige verhaal met vijf vlammen, niveau, label en optionele boodschap. Het dagprogramma gebruikt een compacte versie met thema en warmte. Zonder ingevuld profiel blijft de vertrouwde presentatie ongewijzigd.

Technisch

De tv ontvangt de centrale sessiesignatuur via dezelfde actuele planning. Volledige profielinformatie staat in de focus, compacte informatie in het programma en ontbrekende profielen krijgen geen lege aanduidingen.

Technische stappen
  1. De publieke planning krijgt na bewaren meteen toegang tot de bijgewerkte sessiesignatuur en de tv leest die volgens zijn gewone verversritme.
  2. De extra tv-opmaak wordt alleen toegevoegd wanneer thema- of warmtegegevens bestaan.
  3. De publieke tv gebruikt screen.css v56, screen.js v67 en clientbuild screen-v67; caches zijn verhoogd naar thewhiteoak-public-v182 en root v476/html409.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Nieuwe sessiegegevens automatisch ophalen
JSON
{
  "update": "automatisch na bewaren",
  "maximumDelaySeconds": 60,
  "manualRefresh": false
}

Wat doet dit?De tv leest de actuele planning bij zijn volgende vaste gegevenscontrole en hoeft daarvoor niet volledig opnieuw geopend te worden.

Resultaat in de appGasten zien de nieuwe sessie-informatie uiterlijk binnen één minuut.

Wijziging 2 Warmte en sfeer in de grote focus samenvatten
JSON
{
  "theme": "Golden Forest",
  "flames": [true, true, true, true, false],
  "level": "4/5",
  "label": "Intens",
  "optionalMessage": true
}

Wat doet dit?Vijf compacte vlammen combineren een snel visueel signaal met een duidelijke score en tekst; de boodschap geeft extra context wanneer die is ingevuld.

Resultaat in de appDe eerstvolgende beleving is vanop afstand snel én begrijpelijk te beoordelen.

Wijziging 3 Alleen de kern in het dagprogramma tonen
JSON
{
  "dayProgramme": ["thema", "compacte warmte-indicatie"],
  "longMessageLocation": "eerstvolgende beleving"
}

Wat doet dit?De langere toelichting blijft in de grote focus en programmaregels tonen alleen wat nodig is om snel te vergelijken.

Resultaat in de appHet dagprogramma blijft luchtig, professioneel en goed leesbaar op afstand.

Wijziging 4 De nieuwe weergave betrouwbaar activeren
JSON
{
  "withoutProfile": "ongewijzigd",
  "screenCss": "v56",
  "screenJsAndClient": "v67 / screen-v67",
  "publicCache": "thewhiteoak-public-v182",
  "rootCaches": "v476 / html409"
}

Wat doet dit?De tv voegt geen lege profielelementen toe en de verhoogde versies zorgen dat bestaande schermen de nieuwe bestanden ophalen.

Resultaat in de appSessies zonder profiel blijven rustig en de uitbreiding bereikt het publieke tv-scherm betrouwbaar.

4 wijzigingen

  • Nieuwe sessie-informatie komt vanzelf op tv: wat de opgieter invult, verschijnt zonder handmatige herlading uiterlijk binnen 60 seconden.
  • De eerstvolgende beleving toont het volledige warmteprofiel: thema, vijf vlammen, score, warmtelabel en optionele boodschap staan samen in de grote focus.
  • Het dagprogramma krijgt een compacte samenvatting: thema en warmte blijven leesbaar zonder de rustige planning met extra kaders te vullen.
  • Zonder sessieprofiel verandert niets: de vertrouwde weergave blijft staan en vernieuwde asset- en cacheversies brengen de uitbreiding betrouwbaar naar de tv.
v1.1.147 Het tv-programma haalt vernieuwingen betrouwbaar op
Probleem / foutmelding

Een tv waarop het dagprogramma al lange tijd openstond, kon na een nieuwe publicatie nog even een vorige opmaak of oudere bestanden blijven gebruiken. Daardoor was niet altijd meteen duidelijk of gasten de nieuwste tv-presentatie zagen.

Oplossing

Een manager kan nu per tv-scherm beveiligd een vernieuwing starten. Het scherm controleert de opdracht tijdens zijn gewone gegevensverversing, momenteel iedere 60 seconden, en opent de pagina daarna precies één keer volledig en zonder oude cache. De tv meldt vervolgens zijn actieve clientversie en nieuwe paginalaadtijd, zodat de actuele werking controleerbaar is. Reeds geopende schermen met de vorige client worden eenmalig via de service-workerupdate meegenomen.

Technisch

Een per-schermrevisie activeert een eenmalige cachevrije herlading; build- en laadtijdgegevens in de heartbeat bevestigen daarna dat de actuele tv-client draait.

Technische stappen
  1. Het scherm vergelijkt bij iedere ingestelde gegevenscontrole zijn schermrevisie en onthoudt welke opdracht al uitgevoerd is.
  2. De nieuwe pagina krijgt een unieke versieparameter om oude browser- en service-workercache te omzeilen.
  3. De bestaande heartbeat bevat voortaan de actieve tv-build en de starttijd van de geladen pagina.
  4. Een eenmalige service-workerupdate vormt de overgang voor schermen die tijdens deze release al geopend waren.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 De nieuwste tv-weergave naar het juiste scherm sturen
JSON
{
  "screen": "gekozen tv",
  "command": "vernieuw nu",
  "access": "beveiligd beheer"
}

Wat doet dit?De vernieuwingsopdracht geldt alleen voor het geselecteerde publieke scherm.

Resultaat in de appGasten krijgen op de bedoelde tv de nieuwste presentatie zonder bediening aan het scherm zelf.

Wijziging 2 De schermrevisie automatisch en eenmalig verwerken
JSON
{
  "checkEverySeconds": 60,
  "hardReloadWithoutOldCache": true,
  "oncePerRevision": true
}

Wat doet dit?De tv controleert de opdracht tijdens zijn normale ritme, omzeilt bij herladen oude cache en markeert de revisie als verwerkt.

Resultaat in de appDe actuele versie verschijnt doorgaans binnen één minuut zonder voortdurende herladingen.

Wijziging 3 De actieve tv-versie zichtbaar bevestigen
JSON
{
  "heartbeat": {
    "clientBuild": "actieve versie",
    "pageLoadedAt": "nieuw laadtijdstip"
  }
}

Wat doet dit?Het scherm meldt na herladen zowel zijn actieve clientbuild als het nieuwe startmoment van de pagina.

Resultaat in de appDe actuele tv-weergave kan betrouwbaar worden gecontroleerd.

Wijziging 4 Ook een reeds openstaand scherm meenemen
JSON
{
  "transition": "eenmalige service-workerupdate",
  "for": "vorige geopende tv-client"
}

Wat doet dit?De bestaande offline-update helpt het al geopende scherm eenmalig over naar de vernieuwde client.

Resultaat in de appDe afstandsvernieuwing werkt ook zonder een eerste handmatige herstart van de tv-browser.

4 wijzigingen

  • De nieuwste tv-weergave kan gericht worden doorgestuurd: een manager kan één gekozen scherm veilig op afstand laten vernieuwen.
  • De tv ververst automatisch en zonder oude cache: bij de volgende controle, momenteel binnen maximaal 60 seconden, wordt de nieuwe revisie precies één keer hard geladen.
  • De actieve versie is controleerbaar: clientbuild en paginalaadtijd worden samen met de gewone heartbeat gemeld.
  • Een reeds geopend scherm wordt ook bijgewerkt: de service-workerupdate brengt de vorige client eenmalig naar de nieuwe vernieuwingswerking.
v1.1.146 De grote belevingsfoto keert verbeterd terug
Probleem / foutmelding

De tijd×sauna-matrix gebruikte veel informatievlakken en voelde drukker dan de eerdere tv-versie met een grote sfeervolle foto. Daardoor was de eerstvolgende beleving minder uitnodigend en was het volledige dagprogramma vanop afstand niet overal even comfortabel leesbaar.

Oplossing

De eerste tv-layout is terug in een verfijnde 50/50-compositie. Links krijgt de eerstvolgende beleving opnieuw een grote echte locatiefoto met tijd, begeleiders, rustige status en aftelling. Rechts staat het dagprogramma groter in twee open kolommen voor middag en avond. Bij een uitzonderlijk volle dag zijn er hoogstens twee pagina's en gelijktijdige sessies blijven altijd samen.

Technisch

De tv combineert een vaste 50/50-fotocompositie met twee tijdvakken, gerichte countdown-updates en groepsgewijze paginering op startuur.

Technische stappen
  1. De brede tv-layout gebruikt een vaste verdeling van vijftig procent voor de fotofocus en vijftig procent voor het programma.
  2. Een net afgelopen sessie blijft vijf minuten als afgerond zichtbaar; daarna schuift de volgende sessie automatisch naar voren.
  3. De publieke tv-bestanden en offline cache hebben een nieuwe versie gekregen.
Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 De fotofocus en het dagprogramma gelijk verdelen
CSS
.screen-main {
  grid-template-columns: repeat(12, minmax(0, 1fr));
}
.screen-focus,
.screen-programme {
  grid-column: span 6;
}

Wat doet dit?De grote foto en het programma krijgen elk exact de helft van een breed tv-scherm.

Resultaat in de appDe warme sfeer van de eerste versie keert terug zonder ruimte van het dagprogramma af te nemen.

Wijziging 2 Middag en avond als open leeskolommen tonen
JSON
{
  "programmeColumns": ["Middag", "Avond"],
  "style": "open regels met dunne scheidingslijnen",
  "emphasis": ["uur", "sessietitel", "locatie", "begeleider"]
}

Wat doet dit?De planning vermijdt zware kaarten en gebruikt de beschikbare hoogte voor grotere, heldere tekst.

Resultaat in de appGasten kunnen vanop afstand sneller zien wat er in de middag en avond gepland staat.

Wijziging 3 Aftellen, live tonen en rustig afsluiten
JSON
{
  "beforeStart": "cirkelvormige aftelling",
  "duringSession": "Live",
  "afterSession": "Afgerond · 5 minuten",
  "then": "volgende sessie automatisch"
}

Wat doet dit?Alleen de compacte statuscirkel beweegt mee met de tijd; de rest van het scherm blijft stabiel.

Resultaat in de appDe timing is voortdurend duidelijk zonder onrust of flitsende overgangen.

Wijziging 4 Profielen en duo's volledig behouden
JSON
{
  "singleHost": "naam + echte profielfoto",
  "duoHosts": "twee namen + twee profielfoto's",
  "fallback": "initialen wanneer geen foto bestaat"
}

Wat doet dit?De vernieuwde compositie gebruikt dezelfde centrale persoonskoppelingen als de apps.

Resultaat in de appIedere begeleider blijft herkenbaar, ook wanneer twee mensen samen een sessie verzorgen.

Wijziging 5 Een volle dag in hoogstens twee pagina's verdelen
JavaScript
const pages = paginateByStartTime(sessions, {
  maximumPages: 2,
  keepEqualStartTimesTogether: true
});

Wat doet dit?De planning breekt alleen tussen verschillende starturen en beperkt de totale cyclus tot twee pagina's.

Resultaat in de appGasten wachten kort en zien gelijktijdige keuzemogelijkheden altijd samen.

5 wijzigingen

  • De grote belevingsfoto is terug: de linkerhelft toont opnieuw één sfeervolle foto met een compacte informatiekaart voor de eerstvolgende sessie.
  • Middag en avond lezen sneller: de rechterhelft gebruikt twee open programmakolommen met grotere tijden, titels, locaties en namen.
  • De aftelling blijft rustig actueel: een compacte cirkel toont de resterende tijd, live-status en vijf minuten lang dat een sessie net afgerond is.
  • Begeleiders blijven persoonlijk herkenbaar: echte profielbeelden staan bij de namen en duo-sessies behouden beide portretten.
  • Nooit lang wachten op het volledige programma: een volle dag krijgt maximaal twee pagina's en sessies met hetzelfde startuur worden nooit over twee pagina's verdeeld.
v1.1.145 Nu & straks past volledig op het brede tv-scherm
Probleem / foutmelding

Op een breed tv-scherm konden de titel en begeleidende tekst van Nu & straks verticaal worden afgesneden. Bij twee sessies die tegelijk starten werd de beschikbare hoogte daardoor te krap.

Oplossing

De bovenste focusbalk gebruikt nu een beter verdeelde hoogte en aangepaste tekstmaten voor brede tv's. Zowel één als twee gelijktijdige sessies blijven volledig zichtbaar, met hun namen, locatie en aftelling.

Technisch

De brede tv-weergave gebruikt extra verticale ademruimte en responsieve tekstmaten zonder de programma-matrix kleiner of minder leesbaar te maken.

Technische stappen
  1. De focusbalk past zijn verticale ruimte en typografie aan de brede tv-verhouding en het aantal focuskaarten aan.
  2. De publieke tv-styles en offline cache hebben een nieuwe versie gekregen.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 De focusbalk aan een breed tv-formaat aanpassen
CSS
.focus-rail-copy {
  display: grid;
  grid-template-columns: minmax(0, .72fr) minmax(0, 1.28fr);
  grid-template-rows: auto auto auto;
}
.focus-rail-title {
  grid-column: 1 / -1;
  grid-row: 2;
}

Wat doet dit?De bovenste tv-balk verdeelt status, type, titel, begeleiders en toelichting over drie inhoudsrijen, zodat de titel niet meer wordt samengedrukt.

Resultaat in de appEén of twee sessies blijven vanop afstand volledig leesbaar zonder verticale afsnijding.

1 wijziging

  • Volledige Nu & straks-weergave: de uitgelichte sessies, begeleiders, locatie en aftelling blijven op brede tv's volledig zichtbaar, ook wanneer twee sessies tegelijk beginnen.
v1.1.144 Tv toont alle sauna's snel met duidelijke Nu & straks-focus
Probleem / foutmelding

Een volle tv-planning vroeg nog te veel leestijd doordat alle sessies onder elkaar stonden. De centrale focus maakte duo's en ontbrekende profielfoto's niet altijd even duidelijk, terwijl een net afgelopen sessie of een reeds verstreken sessie soms langer dan nodig aandacht kreeg.

Oplossing

Het tv-scherm toont de dag nu als een brede matrix van tijden en sauna's, op maximaal twee snelle pagina's. Een grote Nu & straks-balk telt zichtbaar af en gebruikt rustige stoombeweging. Iedere begeleider staat met naam en profielavatar in beeld, duo's met twee avatars en zonder foto met initialen. Na afloop blijft een sessie vijf minuten als nazorg zichtbaar en daarna komt automatisch de volgende naar voren. In de gastenapp verdwijnen sessies zodra hun technische eindtijd bereikt is.

Technisch

De tv bouwt een matrix uit starttijden en ruimtes en beperkt de rotatie tot maximaal twee pagina's. De grote focusbalk werkt met gerichte tijdupdates, persoonlijke avatarcombinaties en een nazorgvenster van vijf minuten. De gastenapp gebruikt hetzelfde technische eindmoment om verstreken sessies uit de actuele lijst te halen.

Technische stappen
  1. De matrix koppelt ieder startuur aan de juiste sauna of ruimte en verdeelt het programma alleen indien nodig over een tweede pagina.
  2. Countdown, live-status en vijf minuten nazorg gebruiken de werkelijke technische sessietijden.
  3. De vernieuwde publieke cache bevat de nieuwe tv-bestanden en de aangepaste sessielogica voor offline gebruik.
Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 Tijden en sauna's in één brede matrix combineren
JSON
{
  "rows": "starttijden",
  "columns": "sauna's en ruimtes",
  "maximumPages": 2,
  "pageChange": "snel en rustig"
}

Wat doet dit?Elke sessie staat op het kruispunt van haar uur en locatie en een tweede pagina verschijnt alleen voor een volle dag.

Resultaat in de appJe ziet sneller het hele programma en vergelijkt sauna's zonder een lange lijst te lezen.

Wijziging 2 De grote Nu & straks-balk gericht bijwerken
JSON
{
  "focus": "Nu & straks",
  "updates": ["aftelling", "status"],
  "ambientMotion": "subtiele stoom",
  "fullLayoutRefresh": false
}

Wat doet dit?Alleen de tijdgevoelige tekst en rustige sfeerbeweging veranderen; de volledige tv-layout blijft staan.

Resultaat in de appDe aftelling blijft actueel zonder dat het scherm knippert of verspringt.

Wijziging 3 Iedere begeleider met de juiste avatar tonen
JSON
{
  "oneHost": "naam + profielavatar",
  "duo": "twee namen + twee avatars",
  "withoutRealPhoto": "initialen"
}

Wat doet dit?De tv bewaart alle begeleiders afzonderlijk en maakt alleen een initialenavatar wanneer geen echte foto beschikbaar is.

Resultaat in de appOok bij duo-sessies is meteen zichtbaar wie de beleving begeleidt.

Wijziging 4 Na vijf minuten nazorg automatisch doorschakelen
JSON
{
  "completedFocus": "5 minuten nazorg",
  "nextFocus": "automatisch eerstvolgende sessie"
}

Wat doet dit?Een afgeronde sessie blijft kort zichtbaar en wordt na het vaste nazorgvenster niet langer als hoofditem gekozen.

Resultaat in de appHet scherm sluit het vorige moment rustig af en wijst daarna vanzelf naar wat volgt.

Wijziging 5 Sessies op hun technische eindtijd uit de actuele lijst halen
JSON
{
  "visibility": "tot technisch sessie-einde",
  "afterEnd": "verbergen uit actuele gastenlijst",
  "eventDurations": "blijven leidend"
}

Wat doet dit?De gastenapp gebruikt het echte einde van de sessie en respecteert daarbij afwijkende duurregels van speciale events.

Resultaat in de appHet zichtbare programma toont alleen wat nog bezig is of nog moet beginnen.

5 wijzigingen

  • De dag staat als duidelijke tijd×sauna-matrix op tv: je ziet per uur wat er in iedere sauna gebeurt en hoeft nooit meer dan twee snel wisselende pagina's af te wachten.
  • Nu & straks is groot en levendig zonder onrust: de actieve of volgende sessie krijgt een duidelijke aftelling en subtiele stoom, terwijl de rest van het scherm stabiel blijft.
  • Iedere begeleider is herkenbaar: naam en profielavatar staan samen; duo's tonen twee avatars en bij ontbrekende echte foto's verschijnen heldere initialen.
  • Een afgeronde sessie krijgt precies vijf minuten nazorg: daarna kiest het tv-scherm automatisch de volgende sessie als centrale focus.
  • Voorbije sessies verdwijnen op het juiste eindmoment: de gastenapp houdt het actuele programma compact door een sessie op haar technische eindtijd te verbergen.
v1.1.143 Het volledige tv-programma komt sneller voorbij
Probleem / foutmelding

Bij veel sessies bestond het tv-programma uit te veel kleine pagina's. Gasten moesten daardoor lang voor het scherm wachten om de rest van de planning te zien.

Oplossing

Op brede tv-schermen staan nu zeven sessies per pagina. De 21 sessies van vandaag passen daardoor op drie pagina's, met een rustige wissel om de acht seconden en een automatische controle tegen overlap.

Technisch

De tv combineert een schermafhankelijke paginagrootte met een controle op de echte hoogte van iedere programmaregel.

Technische stappen
  1. Bij een kleiner scherm verlaagt de planning automatisch het aantal regels per pagina zodra tekst meer ruimte nodig heeft.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Zeven sessies per brede tv-pagina
JavaScript
richEventProgrammePageSize(21) // 7

Wat doet dit?De eventplanning verdeelt een volle dag evenwichtig over maximaal drie pagina's wanneer het tv-formaat dit toelaat.

Resultaat in de appGasten zien alle 21 sessies na drie korte pagina's.

Wijziging 2 Leesbaarheid automatisch bewaken
CSS
.is-programme-condensed .programme-page {
  gap: 3px;
}

Wat doet dit?De compacte eventweergave gebruikt de vrije hoogte efficiënter; JavaScript controleert daarna of elke rij werkelijk past.

Resultaat in de appHet programma blijft helder en schakelt alleen terug als een scherm te klein is.

2 wijzigingen

  • Meer programma per pagina: de volle Herbal Cup-planning verschijnt op brede tv's in drie duidelijke pagina's van zeven sessies.
  • Korter wachten zonder overlap: iedere pagina blijft acht seconden staan en de indeling controleert zichzelf op afsnijding.
v1.1.142 Avondthema's blijven zichtbaar op het tv-scherm
Probleem / foutmelding

In een volle liggende tv-planning werd het uitgebreide themablok compact gemaakt, waardoor de nieuwe avondthema's niet altijd leesbaar waren.

Oplossing

De tv toont het thema nu in de vaste titelregel van de sessie. Zo blijven Untamed en Dance of the Elements zichtbaar zonder het drukke weekendprogramma groter te maken.

Technisch

De tv koppelt sessionProfile.theme aan de altijd zichtbare sessietitel, terwijl eventTheme voor officiële events voorrang behoudt.

Technische stappen
  1. Alle tv-composities gebruiken dezelfde korte titel uit het centrale sessieprofiel; het Herbal Cup-programma en de speciale eventlabels blijven ongewijzigd.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Gewoon type en thema samen tonen
JavaScript
sessionProgrammeTitle(session) // Opgietsessie · Untamed

Wat doet dit?De compacte regel bevat zowel het vertrouwde sessietype als het bevestigde thema.

Resultaat in de appGasten herkennen op afstand meteen welke avondsessie volgt.

1 wijziging

  • Duidelijke tv-titels: de twee gewone avondsessies tonen hun eigen thema ook wanneer alle 21 sessies compact over meerdere pagina's worden verdeeld.
v1.1.141 Nieuwe thema's voor de avondsessies
Probleem / foutmelding

Bij de twee gewone avondsessies ontbraken nog de definitieve thema's en de volledige bezetting van het laatste moment.

Oplossing

Gasten zien nu Untamed om 20:00 met Alex Radaman en Dance of the Elements om 21:00 met Alex Radaman en Jasmien Verlinden. Beide vinden plaats in The Barn en blijven gewone opgietsessies zonder Herbal-Aufgusslabel.

Technisch

De thema's worden als centrale sessieprofielen aan twee reguliere aufguss-sessies gekoppeld. De volledige namen verschijnen op de kaarten, terwijl de afzonderlijke profielidentiteiten de bestaande foto's blijven gebruiken.

Technische stappen
  1. Beide sessies blijven gewone aufguss-sessies met een eigen thema.
  2. De duo-opbouw verwerkt Alex en Jasmien afzonderlijk voor de profielweergave.
  3. De wijziging geldt uitsluitend voor zondag 27 september om 20:00 en 21:00.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Het eerste avondthema tonen
JSON
{
  "time": "20:00",
  "sessionType": "Opgietsessie",
  "theme": "Untamed",
  "host": "Alex Radaman",
  "room": "The Barn"
}

Wat doet dit?De sessie behoudt haar gewone type en krijgt het definitieve thema als aanvullend profiel.

Resultaat in de appGasten zien Opgietsessie en Untamed ieder op de juiste plek in de presentatie.

Wijziging 2 Beide opgieters om 21:00 tonen
JSON
{
  "time": "21:00",
  "sessionType": "Opgietsessie",
  "theme": "Dance of the Elements",
  "hosts": ["Alex Radaman", "Jasmien Verlinden"]
}

Wat doet dit?De laatste sessie bewaart beide namen als afzonderlijke personen.

Resultaat in de appAlex en Jasmien staan samen en duidelijk bij Dance of the Elements.

Wijziging 3 Het gewone sessietype behouden
JSON
{
  "type": "aufguss",
  "regularSession": true,
  "specialEventSession": false
}

Wat doet dit?De themanamen veranderen de bevestigde aard van de twee sessies niet.

Resultaat in de appEr verschijnt geen Herbal-Aufguss- of wedstrijdsessielabel.

Wijziging 4 Dezelfde profielen op alle schermen gebruiken
JSON
{
  "themeSource": "sessionProfile",
  "surfaces": ["gastenapp", "kalender", "tv", "sociale deelafbeelding"]
}

Wat doet dit?Alle openbare programmaweergaven gebruiken hetzelfde centrale thema zonder het sessietype te overschrijven.

Resultaat in de appUntamed en Dance of the Elements staan overal herkenbaar naast Opgietsessie.

4 wijzigingen

  • 20:00 · Untamed: Alex Radaman begeleidt de sessie in The Barn.
  • 21:00 · Dance of the Elements: Alex Radaman en Jasmien Verlinden verzorgen samen de laatste sessie.
  • Gewone opgietsessies met een eigen thema: er verschijnt geen Herbal-Aufguss- of speciale wedstrijdsessieaanduiding.
  • Elke weergave is bijgewerkt: gastenapp, kalender, tv en sociale deelafbeelding tonen dezelfde thema's, namen en locatie.
v1.1.140 Crazy Banja om 15:10 toegevoegd
Probleem / foutmelding

De extra Crazy Banja-sessie van vandaag ontbrak nog in de publieke dagplanning en op het tv-scherm.

Oplossing

Gasten zien nu om 15:10 Crazy Banja in Panorama met Alex en Jasmien. De sessie heeft een eigen Banja-aanduiding en meertalige detailtekst, zonder onbevestigde prijs, capaciteit of reservatievoorwaarde.

Technisch

Crazy Banja is als ritueel toegevoegd aan de gedeelde zondagplanning. De duo-naam wordt per persoon verwerkt en de NL-, FR- en EN-details komen uit dezelfde sessieregel.

Technische stappen
  1. De toevoeging geldt uitsluitend voor zondag 27 september om 15:10.
  2. De gastenapp en het tv-scherm gebruiken dezelfde gedeelde sessiegegevens en vertalingen.
  3. Er worden geen prijs, capaciteit of reservatieverplichting toegevoegd.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Crazy Banja op het juiste uur tonen
JSON
{
  "date": "2026-09-27",
  "time": "15:10",
  "title": "Crazy Banja"
}

Wat doet dit?De extra sessie is beperkt tot het bevestigde moment van vandaag.

Resultaat in de appDe publieke planning toont precies één nieuwe Crazy Banja-sessie om 15:10.

Wijziging 2 Alex en Jasmien samen tonen
JSON
{
  "hosts": ["Alex", "Jasmien"],
  "profileMode": "per persoon"
}

Wat doet dit?De duo-naam wordt opgesplitst voordat namen en foto's worden opgebouwd.

Resultaat in de appBeide begeleiders zijn afzonderlijk herkenbaar op de sessiekaart en in het detail.

Wijziging 3 Panorama consequent gebruiken
JSON
{
  "room": "Panorama",
  "accentColor": "#5D9BB3",
  "typeLabel": "Banja"
}

Wat doet dit?De sessie gebruikt dezelfde locatie- en kleurbetekenis op mobiel, desktop en tv.

Resultaat in de appGasten herkennen onmiddellijk waar Crazy Banja doorgaat.

Wijziging 4 Geen onbevestigde voorwaarden toevoegen
JSON
{
  "price": null,
  "capacity": null,
  "reservationRequired": false
}

Wat doet dit?Niet-bevestigde praktische voorwaarden blijven bewust leeg.

Resultaat in de appDe sessiekaart bevat alleen informatie die door de manager werd doorgegeven.

4 wijzigingen

  • Nieuwe sessie om 15:10: Crazy Banja staat vandaag in Panorama tussen de sessies van 15:00 en 16:00.
  • Met Alex en Jasmien: beide begeleiders staan samen vermeld en krijgen waar beschikbaar ieder hun eigen profielbeeld.
  • Dezelfde duidelijke weergave in app en op tv: titel, ruimte, kleur en praktische detailtekst lopen gelijk.
  • Alleen bevestigde informatie: er verschijnt geen prijs, maximumaantal of reservatieverplichting en de planning is opnieuw geladen.
v1.1.139 Alex' avondsessies zijn gewone opgietsessies
Probleem / foutmelding

De sessies van Alex Rademan om 20:00 en 21:00 werden binnen het zondagse eventprogramma nog met Herbal Aufguss en speciale Herbal Cup-sessieaccenten getoond. Deze twee afsluitende momenten zijn gewone opgietsessies.

Oplossing

Op zondag 27 september verschijnen 20:00 en 21:00 nu als gewone opgietsessie met Alex Rademan in The Barn. Zijn profielfoto en de ruimte blijven behouden. Alleen de sessiespecifieke Herbal Cup-opmaak verdwijnt; de dagbanner en weekendcontext blijven zichtbaar. De gastenapp en tv gebruiken dezelfde gegevens en tonen Opgietsessie, Rituel sauna of Aufguss session volgens de gekozen taal.

Technisch

Voor de twee sessies is de sessiespecifieke eventmetadata uitgeschakeld via regularSession=true. Naam, profiel, The Barn en de dagbrede Herbal Cup-context blijven bestaan. De gewone meertalige opgietmetadata voedt zowel de gastenapp als de tv-weergave.

Technische stappen
  1. De eventbron markeert uitsluitend 20u00 en 21u00 met Alex Rademan als regularSession.
  2. Bij een reguliere eventregel blijft de persoon- en ruimte-informatie bestaan, maar specialEventSession wordt niet aan de publieke sessie gekoppeld.
  3. De dag zelf houdt zijn eventInfo en Herbal Cup-banner; alleen de twee sessiekaarten gebruiken gewone metadata.
  4. De bestaande vertalingen van het type aufguss worden zonder speciaal eventlabel gebruikt.
  5. De publieke service-worker gebruikt cacheversie thewhiteoak-public-v173.
Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 De twee exacte momenten als gewone sessie vastleggen
JSON
{
  "date": "2026-09-27",
  "times": ["20u00", "21u00"],
  "host": "Alex Rademan",
  "regularSession": true
}

Wat doet dit?De uitzondering is beperkt tot de bevestigde datum, tijden en begeleider.

Resultaat in de appAndere Herbal Cup-sessies behouden hun eventpresentatie; alleen deze twee worden gewone opgietsessies.

Wijziging 2 Profiel en ruimte ongewijzigd doorgeven
JSON
{
  "displayHost": "Alex Rademan",
  "room": "The Barn",
  "type": "aufguss"
}

Wat doet dit?De inhoudelijke correctie wijzigt niet wie de sessie geeft, waar ze doorgaat of welke basisvorm ze heeft.

Resultaat in de appAlex blijft met zijn juiste portret en locatie op de kaart staan.

Wijziging 3 Dagcontext behouden zonder speciale sessiekaart
PHP
$eventSessionMeta = !empty($eventSession['regularSession'])
  ? null
  : $eventSession;

'isSpecialEventSession' => (bool)$eventSession,
'eventInfo' => $specialEvent
  && (empty($specialEvent['sessionSpecific']) || $eventSession)
    ? $specialEvent
    : null,

Wat doet dit?De reguliere sessie krijgt geen eigen speciale metadata, terwijl de dag zelf gekoppeld blijft aan het Herbal Cup-event.

Resultaat in de appDe kaart is een gewone opgietsessie en de zondagbanner blijft zichtbaar.

Wijziging 4 De juiste gewone naam voor iedere taal kiezen
PHP
[
  'nl' => 'Opgietsessie',
  'fr' => 'Rituel sauna',
  'en' => 'Aufguss session',
]

Wat doet dit?Gastenapp en tv lezen de bestaande vertalingen van een gewone opgietsessie wanneer geen speciaal sessielabel actief is.

Resultaat in de appDezelfde twee sessies worden in elke taal correct en begrijpelijk benoemd.

Wijziging 5 De gecorrigeerde planning opnieuw cachen
JavaScript
const CACHE = 'thewhiteoak-public-v173';

Wat doet dit?Een nieuwe publieke cache-identiteit vervangt eerder opgeslagen programmagegevens.

Resultaat in de appDe gastenapp en tv tonen na verversing de gewone sessiebenaming.

5 wijzigingen

  • 20:00 en 21:00 zijn gewone opgietsessies: de twee momenten van Alex worden niet meer als Herbal Aufguss aangeduid.
  • Alex en The Barn blijven herkenbaar: zijn bestaande profielfoto en de correcte ruimte veranderen niet.
  • Het programma bewaart de juiste eventcontext: de sessiekaarten zijn gewoon, maar de Herbal Cup-dagbanner blijft boven het zondagprogramma zichtbaar.
  • App en tv spreken dezelfde taal: volgens NL, FR of EN staat er Opgietsessie, Rituel sauna of Aufguss session.
  • De appcache is vernieuwd: eerder opgeslagen speciale labels worden vervangen door de gecorrigeerde planning.
v1.1.138 Actieve dagprogramma's tonen profielfoto's meteen
Probleem / foutmelding

In een lange weekendplanning kon een juist gekoppelde profielfoto op desktop pas laat zichtbaar worden, vooral bij sessies verder naar beneden of na het kiezen van een kalenderdag. De beeldkoppelingen waren correct, maar de browser behandelde deze zichtbare avatars nog te terughoudend.

Oplossing

De profielfoto's in de actieve tijdlijn en in een bewust gekozen kalenderdag worden nu onmiddellijk aangevraagd en asynchroon verwerkt. Daardoor verschijnt het volledige actieve programma sneller met de juiste gezichten. Foto's in verborgen of niet-actieve onderdelen blijven zuinig laden en een vernieuwde appcache levert de aanpassing aan bestaande installaties.

Technisch

De actieve Twig-tijdlijn en dynamisch gekozen kalenderdag gebruiken voor sessieavatars loading=eager en decoding=async. Niet-actieve onderdelen behouden loading=lazy. De publieke cache v172 verwijst naar gastenscript v168.

Technische stappen
  1. Serverweergaven van de actieve tijdlijn gebruiken eager loading en async decoding voor sessieavatars.
  2. Dynamisch opgebouwde kalenderdagen passen dezelfde twee beeldinstellingen toe.
  3. Niet-actieve onderdelen zoals het teamoverzicht behouden lazy loading.
  4. De publieke service-worker en het versienummer van het gastenscript zijn vernieuwd.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Avatars in de actieve tijdlijn direct tonen
HTML
<span class="session-avatars session-avatars-small">
  <img src="profielfoto.jpg" loading="eager" decoding="async">
</span>

Wat doet dit?Zichtbare sessieavatars in het actuele programma worden meteen aangevraagd en buiten de hoofduitvoering gedecodeerd.

Resultaat in de appOok een lange dagtijdlijn toont de juiste gezichten zonder merkbare vertraging.

Wijziging 2 Dynamische kalenderavatars dezelfde prioriteit geven
JavaScript
var image = document.createElement('img');
image.loading = 'eager';
image.decoding = 'async';
avatars.appendChild(image);

Wat doet dit?De kalender bouwt sessieavatars na een datumkeuze dynamisch op en geeft ze dezelfde laad- en decodeerinstellingen als de actieve hoofdtijdlijn.

Resultaat in de appDe geselecteerde kalenderdag verschijnt direct met de beschikbare profielfoto's.

Wijziging 3 Niet-actieve profielen pas laden wanneer nodig
HTML
<article class="host-card">
  <img src="profielfoto.jpg" loading="lazy">
</article>

Wat doet dit?Profielen in het aparte teamoverzicht behouden de zuinige laadwijze omdat zij niet bij de actieve dagplanning horen.

Resultaat in de appDe snelle tijdlijn veroorzaakt geen onnodige download van verborgen inhoud.

Wijziging 4 De vernieuwde gastenapp uit de cache aanbieden
JavaScript
const CACHE = 'thewhiteoak-public-v172';
const STATIC = [
  '/opgietplanner/gasten/assets/guest.js?v=168'
];

Wat doet dit?De publieke service-worker bewaart de nieuwe gastenscriptversie onder een nieuwe cache-identiteit.

Resultaat in de appEen bestaande app-installatie gebruikt na de normale verversing dezelfde snelle avatarweergave.

4 wijzigingen

  • De actieve tijdlijn is direct herkenbaar: profielfoto's worden meteen geladen, ook wanneer een sessie lager in een lange weekendplanning staat.
  • Een gekozen kalenderdag krijgt dezelfde snelle foto's: zodra je een datum opent, worden de zichtbare avatars direct aangevraagd en asynchroon verwerkt.
  • Niet-actieve onderdelen blijven efficiënt: verborgen team- en informatiebeelden laden nog steeds pas wanneer ze werkelijk nodig zijn.
  • Bestaande installaties krijgen de verbetering automatisch: de vernieuwde appcache en gastenscriptversie voorkomen dat een oudere laadinstelling blijft hangen.
v1.1.137 Ruimere sessiedetails met duidelijke reservatieactie
Probleem / foutmelding

Het uitgebreide detail van een Herbal Cup-sessie was op desktop te smal. Daardoor konden kaarten van deelnemers en juryleden worden afgeknipt en was de reservatielink minder duidelijk als actie herkenbaar.

Oplossing

Het publieke sessiedetail opent op desktop nu tot maximaal 860 pixels breed met een heldere personenindeling. Alle deelnemers en juryleden blijven volledig zichtbaar en de reservatielink heeft een duidelijke knopstijl gekregen. Op telefoon blijft het detail bewust compact.

Technisch

De publieke modal gebruikt op desktop een maximale breedte van 860 pixels, drie flexibele personenkolommen zonder afsnijding en een duidelijk vormgegeven reservatieknop. De bestaande compacte mobiele modal blijft ongewijzigd beschikbaar.

Technische stappen
  1. De maximale breedte van het publieke detailvenster is voor desktopschermen vergroot.
  2. De personenlijst gebruikt responsieve kolommen die kaarten en namen binnen de beschikbare ruimte houden.
  3. De reservatielink krijgt op desktop een duidelijke knopstijl; de bestaande compacte mobiele modal blijft behouden.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Het publieke detailvenster op desktop verbreden
CSS
@media (min-width: 900px) {
  .session-dialog {
    width: min(calc(100% - 40px), 860px);
  }
}

Wat doet dit?Het venster gebruikt op desktop meer ruimte, met twintig pixels vrije ruimte aan iedere zijde en een maximum van 860 pixels.

Resultaat in de appUitgebreide Herbal Cup-informatie krijgt een rustige, professionele presentatie.

Wijziging 2 De personenkaarten volledig in beeld houden
CSS
.detail-special-event .special-event-people-rail {
  display: grid;
  grid-template-columns: repeat(3,minmax(0,1fr));
  gap: 9px;
  overflow: visible;
}

Wat doet dit?Flexibele kolommen delen de beschikbare ruimte eerlijk en voorkomen dat de laatste deelnemer of het laatste jurylid wordt afgesneden.

Resultaat in de appFoto, naam en rol van iedere persoon blijven in één oogopslag zichtbaar.

Wijziging 3 De reservatielink als duidelijke actie tonen
CSS
.detail-special-event .special-event-booking > a {
  min-height: 38px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 8px 11px;
  background: #d5bd72;
  border-radius: 5px;
}

Wat doet dit?De bestaande reservatielink krijgt op desktop het uiterlijk en de bruikbare afmetingen van een duidelijke knop.

Resultaat in de appGasten begrijpen op ieder apparaat wat vooraf moet worden gereserveerd en waar ze dat kunnen doen.

3 wijzigingen

  • Het sessiedetail benut een desktopscherm beter: het bredere venster geeft uitgebreide eventinformatie voldoende ademruimte zonder een onnodig smalle kolom.
  • Deelnemers en juryleden blijven volledig zichtbaar: hun foto's, namen en rollen staan in een professioneel raster zonder afgekapte kaarten.
  • De reservatieactie valt duidelijk op: de link heeft op desktop een herkenbare knopstijl gekregen, terwijl de mobiele modal compact blijft.
v1.1.136 Elke kalenderdag rustig bekijken en direct delen
Probleem / foutmelding

Een programma dat via de kalender werd gekozen, gebruikte nog niet overal dezelfde rustige sessierijen als het gewone dagoverzicht. De deelactie was bovendien niet voor iedere kalenderdag met sessies beschikbaar en speciale events konden visueel zwaarder lijken dan bedoeld.

Oplossing

Iedere kalenderdag gebruikt nu open, kaderloze rijen met subtiele scheidingslijnen, de juiste eventkleuren en herkenbare profielfotoaccenten. Deel dagplanning opent exact de gekozen datum wanneer die sessies bevat, ook als je bewust een voorbije dag selecteert. Een speciaal event behoudt zijn passende eventstijl zonder de zware opmaak van een echte live-special.

Technisch

De openbare kalenderweergave hergebruikt de rustige sessierij en geeft de geselecteerde ISO-datum rechtstreeks door aan de deelstudio. De pagina houdt gewone eventpresentatie en echte live-specialpresentatie uit elkaar, zodat kleur en nadruk bij de werkelijke status passen.

Technische stappen
  1. De kalenderlijst gebruikt dezelfde scheidings-, kleur- en fotoaccentregels als de overige publieke sessielijsten.
  2. De gekozen kalenderdatum wordt rechtstreeks aan de openbare deelstudio doorgegeven.
  3. Eventstijl en live-specialstatus worden afzonderlijk beoordeeld.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Kalendersessies als rustige open rijen tonen
JSON
{
  "rowStyle": "kaderloos",
  "divider": "subtiele scheidingslijn",
  "visualCues": ["correcte eventkleur", "profielfotoaccent"]
}

Wat doet dit?De kalenderweergave laat zware kaartkaders weg maar bewaart de kleur- en fotoaanwijzingen die de sessie herkenbaar maken.

Resultaat in de appEen volledige kalenderdag leest rustig en iedere sessie blijft duidelijk van de volgende gescheiden.

Wijziging 2 Exact de gekozen kalenderdag delen
JSON
{
  "shareAction": "Deel dagplanning",
  "date": "geselecteerde kalenderdatum",
  "requiresSessions": true,
  "pastSelectedDateAllowed": true
}

Wat doet dit?De deelstudio ontvangt de actieve kalenderdatum wanneer daar sessies voor bestaan, ongeacht of de dag vóór of na vandaag ligt.

Resultaat in de appJe deelt altijd het programma dat je daadwerkelijk in de kalender hebt geopend.

Wijziging 3 Een gepland event niet als live-special behandelen
JSON
{
  "eventColors": "behouden",
  "heavyLiveSpecialStyle": "alleen bij echte live-special",
  "ordinarySpecialEvent": "rustige eventweergave"
}

Wat doet dit?De kleuridentiteit van het event blijft staan, terwijl de zwaardere visuele toestand alleen voor een echte live-special wordt gebruikt.

Resultaat in de appSpeciale dagen zijn herkenbaar zonder dat het kalenderprogramma onnodig druk of live lijkt.

3 wijzigingen

  • Het kalenderprogramma oogt rustiger en herkenbaarder: iedere sessie staat in een open, kaderloze rij met een subtiele scheidingslijn, de juiste eventkleur en een passend accent rond de profielfoto.
  • Iedere kalenderdag met sessies kan worden gedeeld: Deel dagplanning opent exact de gekozen datum, zowel voor komende dagen als voor een voorbije dag die je bewust hebt geselecteerd.
  • Speciale events krijgen de juiste hoeveelheid nadruk: de eigen eventkleuren blijven zichtbaar, maar een gepland event wordt niet meer ten onrechte als zware live-special vormgegeven.
v1.1.135 Kalenderdagen tonen nu dezelfde rijke sessiekaarten als het hoofdprogramma
Probleem / foutmelding

Na het kiezen van een datum in Kalender kon de dagplanning afwijken van de mooie hoofdweergave. Bij Herbal Cup was de teksthiërarchie niet overal gelijk en bekende foto's, zoals die van Inge of Alex, konden in de kalender als initialen verschijnen terwijl het portret elders wel beschikbaar was.

Oplossing

De kalender gebruikt nu dezelfde heldere opbouw als het hoofdprogramma: tijd, sessietype, eigen sessietitel, naam, officiële ruimte en eventuele reservatie- en kaartkleurinformatie. De reeds gevonden event- en profielfoto's worden rechtstreeks hergebruikt. Alleen wanneer een foto werkelijk ontbreekt of niet kan laden, verschijnt een nette initialenweergave. De bestaande dag-, avond-, ruimte- en eventkleuren blijven daarbij herkenbaar.

Technisch

De kalenderdag gebruikt voortaan dezelfde presentatielaag als het hoofdprogramma. Server-resolved opgieterPhotos, hostPhotos en liveWithPhotos worden als primaire beeldbronnen gebruikt, met initialen als fallback bij ontbrekende of defecte bestanden. De bestaande thema- en eventkleuren blijven behouden.

Technische stappen
  1. De kalenderkaart gebruikt dezelfde veldvolgorde en labels als het hoofdprogramma.
  2. Voor foto's worden de server-resolved lijsten opgieterPhotos, hostPhotos en liveWithPhotos gebruikt voordat de initialenfallback wordt gekozen.
  3. Een fout bij het laden van een afbeeldingsbestand activeert dezelfde veilige fallback.
  4. De kaartstructuur hergebruikt de bestaande ruimtekleuren en Herbal Cup-accenten in dag en avond.
Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 Kalenderkaarten dezelfde informatievolgorde geven
JSON
{
  "calendarCardOrder": ["tijd", "sessietype", "sessietitel", "naam", "officiële ruimte", "extra informatie"],
  "matches": "hoofdprogramma"
}

Wat doet dit?De kalender hoeft geen eigen, afwijkende labels of volgorde meer te gebruiken.

Resultaat in de appGasten herkennen dezelfde sessiekaart, ongeacht via welke dagknop of kalenderdatum ze het programma openen.

Wijziging 2 Herbal Cup-informatie compleet houden
JSON
{
  "Herbal Cup": ["type", "sessietitel", "naam", "officiële ruimte", "reservatie", "kaartkleur"]
}

Wat doet dit?Ieder belangrijk eventveld krijgt een vaste, eigen plaats op de publieke kalenderkaart.

Resultaat in de appGasten zien onmiddellijk wat de sessie is, waar ze plaatsvindt en of reservatie of een kaartje nodig is.

Wijziging 3 Beschikbare opgietersfoto's ook in Kalender tonen
JSON
{
  "resolvedPhotoSources": ["opgieterPhotos", "hostPhotos", "liveWithPhotos"],
  "confirmedNames": ["Inge Schoubs", "Alex Rademan"]
}

Wat doet dit?De publieke kalender leest de foto's die de server al aan de juiste persoon en sessie heeft gekoppeld.

Resultaat in de appEen bekende deelnemer verschijnt ook via Kalender met hetzelfde portret als in het hoofdprogramma.

Wijziging 4 Bij een fotofout netjes op initialen terugvallen
JavaScript
if (!photo || imageLoadFailed) {
  avatar = initials;
}

Wat doet dit?Zowel een ontbrekende bron als een bestand dat niet kan laden wordt op dezelfde gecontroleerde manier opgevangen.

Resultaat in de appDe sessiekaart blijft verzorgd en leesbaar, ook wanneer een afbeelding tijdelijk niet beschikbaar is.

Wijziging 5 Dag-, avond- en eventaccenten behouden
JSON
{
  "modes": ["dag", "avond"],
  "keepColorsFor": ["ruimte", "kaartje", "Herbal Cup"]
}

Wat doet dit?De vernieuwde inhoudsopbouw verandert de betekenisvolle kleuraccenten niet.

Resultaat in de appDe kalender blijft in beide thema's mooi én praktisch herkenbaar.

5 wijzigingen

  • Kalender en hoofdprogramma tonen dezelfde sessieopbouw: tijd, type, titel, naam, ruimte en extra informatie staan voortaan in dezelfde duidelijke volgorde.
  • Herbal Cup-details blijven volledig zichtbaar: sessietype, eigen titel, deelnemer, officiële ruimte, reservatie en kaartkleur worden consequent weergegeven.
  • Inge, Alex en andere bekende opgieters behouden hun foto: de kalender gebruikt de reeds opgeloste event- en profielfoto's, ook wanneer je de dag rechtstreeks via Kalender opent.
  • Een foto kan de kaart niet meer breken: bij een ontbrekend of defect beeld verschijnt automatisch een nette cirkel met initialen.
  • Kleuren blijven ook in de kalender betekenisvol: de dag- en avondweergave bewaren de herkenbare accenten voor ruimte, kaartkleur en bijzonder event.
v1.1.134 Dag- en avondweergave volgt nu automatisch het juiste moment
Probleem / foutmelding

De gastenapp en tv-schermen volgden niet overal automatisch hetzelfde lichte of donkere moment. In de avond konden vaste locatiekleuren en onderdelen zoals kalender, statussen, badges en praktische informatie bovendien minder duidelijk uitkomen.

Oplossing

Auto gebruikt van 06:00 tot 18:00 de dagweergave en van 18:00 tot 06:00 de avondweergave. Je kunt ook zelf Dag of Avond kiezen. De gastenapp, interne app en alle tv-composities gebruiken dezelfde sfeer, terwijl de kleuren van de verschillende ruimtes herkenbaar blijven en belangrijke tekst meer contrast krijgt.

Technisch

Auto volgt de Brusselse lokale tijd en kiest dag vanaf 06:00 en avond vanaf 18:00. De publieke app en alle tv-layouts gebruiken hetzelfde palet, maar de vaste ruimtekleuren blijven afzonderlijk herkenbaar. De vernieuwde thema- en contrastbestanden maken deel uit van de offline cache.

Technische stappen
  1. Auto rekent met de lokale tijd in Europe/Brussels en gebruikt in alle publieke schermen dezelfde grenzen van 06:00 en 18:00.
  2. De algemene themakleuren veranderen zonder de praktische kleurbetekenis van ruimtes te wissen.
  3. De nieuwe kleur- en contrastbestanden worden via een korte cacheverversing beschikbaar voor bestaande installaties.
Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 Automatisch dag of avond kiezen met handmatige vrijheid
JSON
{
  "Auto": {
    "06:00-18:00": "Dag",
    "18:00-06:00": "Avond"
  },
  "manualChoices": ["Dag", "Avond"]
}

Wat doet dit?De automatische stand volgt het lokale tijdstip, terwijl de twee vaste keuzes beschikbaar blijven.

Resultaat in de appDe app past vanzelf bij ochtend, dag en avond en kan toch naar persoonlijke voorkeur worden ingesteld.

Wijziging 2 Dezelfde sfeer in app en alle tv-layouts tonen
JSON
{
  "surfaces": ["gastenapp", "interne app", "alle tv-composities"],
  "sharedModes": ["dag", "avond"]
}

Wat doet dit?Iedere publieks- en medewerkersweergave ontvangt dezelfde gekozen themastand.

Resultaat in de appDe kleuren voelen samenhangend wanneer je van telefoon naar een tv-scherm kijkt.

Wijziging 3 De eigen kleur van iedere ruimte bewaren
JSON
{
  "recognizableRooms": ["Panorama", "The Barn", "Stoombad / Hamam", "Shou Sugi Ban", "Forest Sauna"],
  "colorMeaningPreserved": true
}

Wat doet dit?De achtergrond kan lichter of donkerder worden, maar de kleur die een locatie aanduidt blijft haar betekenis houden.

Resultaat in de appGasten herkennen snel waar een sessie plaatsvindt, zowel overdag als 's avonds.

Wijziging 4 Praktische informatie in beide thema's duidelijk houden
JSON
{
  "improvedReadability": ["kalender", "sessiestatussen", "badges", "Praktisch", "versiehistoriek"],
  "checkedIn": ["dag", "avond"]
}

Wat doet dit?De belangrijkste teksten, achtergronden en statusaccenten krijgen per thema voldoende onderling verschil.

Resultaat in de appProgramma- en praktische informatie blijft op elk moment duidelijk leesbaar.

Wijziging 5 De nieuwe kleuren naar de offline versie brengen
JSON
{
  "cacheUpdate": "kort en eenmalig",
  "offlineThemeFiles": "vernieuwd",
  "supportsExistingInstallations": true
}

Wat doet dit?De gastenapp haalt de bijgewerkte themabestanden op en bewaart ze ook voor gebruik zonder actieve verbinding.

Resultaat in de appOok een geïnstalleerde of tijdelijk offline app gebruikt na de verversing de juiste dag- en avondweergave.

5 wijzigingen

  • Auto past zich vanzelf aan het uur aan: tussen 06:00 en 18:00 zie je de dagweergave en tussen 18:00 en 06:00 de avondweergave. Met Dag of Avond kun je ook zelf een vaste keuze maken.
  • App en tv-schermen schakelen samen: de gastenapp, interne app en alle tv-composities gebruiken dezelfde dag- en avondkleuren voor een herkenbare sfeer op ieder scherm.
  • Elke ruimte houdt haar herkenbare kleur: Panorama, The Barn, Stoombad of Hamam, Shou Sugi Ban en Forest Sauna blijven in beide weergaven snel van elkaar te onderscheiden.
  • Belangrijke informatie leest gemakkelijker: kalender, sessiestatussen, badges, Praktisch en versiehistoriek hebben sterker contrast in zowel dag- als avondweergave.
  • Ook offline verschijnt de nieuwe weergave: een korte cacheverversing neemt de bijgewerkte dag- en avondkleuren mee naar een bestaande installatie.
v1.1.133 Bekende Herbal Cup-profielen blijven voortaan herkenbaar
Probleem / foutmelding

De Herbal Cup-portretten waren vooral aan dit bijzondere eventprogramma gekoppeld. Wanneer Inge, Alex of een andere bekende deelnemer later in een gewone of toekomstige sessie verscheen, kon daardoor opnieuw een initialenbeeld in plaats van de reeds beschikbare profielfoto worden getoond.

Oplossing

Alle achttien bekende Herbal Cup-profielen zijn nu blijvend en veilig aan hun naam gekoppeld. Inge Schoubs en Alex Rademan worden ook herkend wanneer in de planning alleen Inge of Alex staat, en gebruikelijke BK-naamvarianten verwijzen naar hetzelfde portret. De gastenapp, het tv-scherm en de sociale deelweergave gebruiken deze herkenning automatisch, terwijl een later persoonlijk geüploade foto altijd voorrang houdt.

Technisch

De publieke planning gebruikt voortaan één blijvende naam-naar-fotokoppeling voor de achttien beschikbare Herbal Cup-portretten. Exacte namen en gecontroleerde varianten worden herkend, persoonlijke uploads blijven leidend en dezelfde uitkomst wordt door gastenapp, tv en sociale deelweergave gebruikt.

Technische stappen
  1. De bestaande portretten vormen een blijvende reservebron voor toekomstige planningen en worden niet opnieuw of dubbel opgeslagen.
  2. Naamvarianten worden via een vooraf bepaalde lijst herkend; er wordt niet op een toevallig gelijkend begin van een naam gezocht.
  3. Dezelfde fotoherkenning voedt de publieke sessiekaarten, het tv-programma en de sociale export.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Bekende Herbal Cup-portretten later opnieuw gebruiken
JSON
{
  "knownHerbalCupProfiles": 18,
  "futureOrdinarySessions": "portret opnieuw gebruiken",
  "surfaces": ["gastenapp", "tv-scherm", "sociaal deelprogramma"]
}

Wat doet dit?De achttien bestaande persoonsbeelden blijven als veilige reserve beschikbaar zodra dezelfde persoon later opnieuw in de planning staat.

Resultaat in de appInge Schoubs, Alex Rademan en de overige bekende personen blijven ook na het event herkenbaar.

Wijziging 2 Vertrouwde naamvarianten aan hetzelfde profiel koppelen
JSON
{
  "Inge": "Inge Schoubs",
  "Alex": "Alex Rademan",
  "BK-variant": "bijbehorende volledige naam"
}

Wat doet dit?Een beperkte lijst met gekende korte namen en BK-varianten verwijst naar de juiste volledige profielnaam.

Resultaat in de appEen kleine schrijfvariant in het programma zorgt niet langer voor een ontbrekend portret.

Wijziging 3 Een persoonlijke upload altijd eerst tonen
JSON
{
  "photoPriority": ["persoonlijk geüploade foto", "bestaand profielbeeld", "Herbal Cup-reserveportret"]
}

Wat doet dit?De blijvende Herbal Cup-koppeling wordt alleen gebruikt wanneer er geen persoonlijker beeld beschikbaar is.

Resultaat in de appEen opgieter houdt zelf controle over de actuele profielfoto.

Wijziging 4 Gelijkende namen veilig gescheiden houden
JSON
{
  "plannedName": "Alex",
  "matchedProfile": "Alex Rademan",
  "neverMatch": "Alexander",
  "fuzzyMatching": false
}

Wat doet dit?Alleen een exacte naam of een vooraf vastgelegde variant kan een profiel selecteren; losse gelijkenissen worden genegeerd.

Resultaat in de appIedere sessie toont het juiste portret zonder verwarring tussen Alex en Alexander.

4 wijzigingen

  • Inge, Alex en de andere bekende Herbal Cup-profielen blijven herkenbaar: alle achttien beschikbare portretten kunnen voortaan ook bij gewone en toekomstige sessies verschijnen.
  • Korte namen en BK-varianten worden netjes herkend: onder meer Inge, Alex en de bekende BK-naamsvormen verwijzen naar het juiste volledige profiel.
  • Een eigen geüploade profielfoto blijft altijd voorrang krijgen: een later gekozen persoonlijk beeld wordt nooit door het eventportret overschreven.
  • De naamkoppeling blijft bewust strikt: alleen vastgelegde naamvarianten tellen mee, waardoor Alex niet per ongeluk de foto van Alexander krijgt.
v1.1.132 Druk tv-programma blijft rustig en volledig leesbaar
Probleem / foutmelding

Op een druk eventprogramma konden te veel uitgebreide sessies tegelijk in de twee programmakolommen terechtkomen. Daardoor kregen tijden, thema's, namen en labels onvoldoende hoogte en overlapten onderdelen elkaar op het tv-scherm.

Oplossing

Het tv-scherm behoudt de volledige tweekolomweergave zolang alle sessies werkelijk passen. Zodra het beschikbare schermvlak meetbaar te klein is, schakelt het programma automatisch over naar rustige, roterende pagina's met maximaal vijf uitgebreide eventsessies. De actuele of eerstvolgende sessie bepaalt waar de reeks start, zodat de belangrijkste informatie meteen zichtbaar is.

Technisch

Het tv-scherm meet na het opbouwen of de volledige sessielijst binnen de beschikbare hoogte past. Alleen bij tekort activeert het een bredere paginamodus met maximaal vijf eventrijen per pagina, een contextuele startpagina en een wisselduur die alle pagina's binnen de schermcyclus laat passeren.

Technische stappen
  1. De keuze tussen het volledige overzicht en paginering gebeurt op basis van de werkelijk beschikbare hoogte en de gemeten hoogte van de sessierijen.
  2. De drukke modus verdeelt eventsessies over pagina's van maximaal vijf en berekent de startpagina vanuit de actuele of eerstvolgende sessie.
  3. De wisseltijd wordt afgestemd op de totale tv-cyclus; tijdens deze modus krijgt de programmakolom extra ruimte en blijft de gewone rustige overgang behouden.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Het volledige overzicht behouden zolang het past
JSON
{
  "availableHeight": "voldoende",
  "layout": "volledige tweekolomweergave",
  "rotation": false
}

Wat doet dit?Het scherm vergelijkt de benodigde programmahoogte met de werkelijk beschikbare ruimte voordat het een compactere presentatie kiest.

Resultaat in de appEen normaal dagprogramma blijft volledig zichtbaar in de bekende rustige tweekolomweergave.

Wijziging 2 Alleen bij gemeten plaatsgebrek rustig pagineren
JSON
{
  "availableHeight": "onvoldoende",
  "layout": "roterende programmapagina's",
  "maximumRichEventSessionsPerPage": 5
}

Wat doet dit?Wanneer de uitgebreide sessierijen aantoonbaar niet passen, verdeelt het tv-scherm ze automatisch over kleinere pagina's.

Resultaat in de appTijden, thema's, namen, ruimtes en badges blijven ook tijdens een vol eventprogramma vrij van overlap.

Wijziging 3 Met de actuele programmapagina beginnen
JSON
{
  "firstPageFocus": ["actuele sessie", "eerstvolgende sessie"],
  "fallback": "eerste pagina"
}

Wat doet dit?De sessie die nu bezig is, of anders de eerstvolgende sessie, bepaalt welke pagina bij het openen als eerste verschijnt.

Resultaat in de appGasten zien meteen de informatie die op dat moment het belangrijkst is.

Wijziging 4 Alle pagina's voldoende tijd en breedte geven
JSON
{
  "pageDuration": "afgestemd op volledige tv-cyclus",
  "programmeWidth": "tijdelijk vergroot",
  "allPagesShown": true
}

Wat doet dit?De paginaduren worden samen met het aantal pagina's berekend en de programmazone krijgt in deze modus tijdelijk meer schermruimte.

Resultaat in de appIedere pagina komt rustig aan bod en de uitgebreide eventinformatie blijft ruim en professioneel leesbaar.

4 wijzigingen

  • De volledige tweekolomweergave blijft staan wanneer alles past: rustige dagen behouden het complete dagoverzicht zonder onnodige wissels.
  • Bij echt plaatsgebrek schakelt het scherm automatisch naar overzichtelijke pagina's: iedere pagina toont maximaal vijf uitgebreide eventsessies, zodat niets meer over elkaar valt.
  • De relevante sessies verschijnen eerst: de actuele of eerstvolgende sessie bepaalt automatisch de eerste programmapagina.
  • Iedere pagina krijgt voldoende schermtijd en ruimte: de wisseltijd volgt de tv-cyclus en het programma wordt tijdelijk breder tot alle pagina's getoond zijn.
v1.1.131 Forest Sauna toegevoegd aan Praktisch
Probleem / foutmelding

In Praktisch stonden The Barn, Panorama Sauna, Stoombad en Shou Sugi Ban al voorgesteld, maar Forest Sauna ontbrak. Daardoor konden gasten deze locatie vooraf niet herkennen in het ruimte-overzicht.

Oplossing

Forest Sauna staat nu als vijfde wellnessruimte in Praktisch, met de officiële locatiefoto en een rustige omschrijving. De kaart is ook volledig vertaald in het Nederlands, Frans en Engels.

Technisch

De ruimtegids gebruikt één extra kaart met de bestaande Forest Sauna-foto. De meertalige tekst komt uit dezelfde vertaallaag als de vier bestaande ruimtekaarten en de publieke serviceworker heeft een nieuwe cacheversie.

Technische stappen
  1. De bestaande Forest Sauna-foto wordt opnieuw gebruikt; er is geen dubbele afbeelding toegevoegd.
  2. De publieke script- en offline cacheversies zijn vernieuwd zodat ook geïnstalleerde apps de nieuwe kaart en vertaling ophalen.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Forest Sauna in de meertalige ruimtegids opnemen
JSON
{
  "room": "Forest Sauna",
  "photo": "forest.jpg",
  "languages": ["NL", "FR", "EN"],
  "section": "Praktisch"
}

Wat doet dit?De kaart gebruikt dezelfde gegevensopbouw en vormgeving als de andere wellnessruimtes en krijgt per taal een eigen korte omschrijving.

Resultaat in de appGasten kunnen Forest Sauna herkennen voordat hun sessie begint, ongeacht de gekozen app-taal.

1 wijziging

  • Forest Sauna staat nu bij Onze wellnessruimtes: in Praktisch zie je de officiële foto, naam en een korte sfeerschets in Nederlands, Frans en Engels.
v1.1.130 Gekozen dag blijft duidelijk onder de kalender staan
Probleem / foutmelding

Op brede schermen moest de kalenderindeling gegarandeerd voorkomen dat een gekozen dagprogramma als een smal rechterpaneel naast de maand zou verschijnen. Ook ontbrak na een dagkeuze een directe, rustige verplaatsing naar het vernieuwde programma.

Oplossing

De gastenapp legt nu expliciet vast dat de maandkalender en de gekozen dagplanning één verticale, volle-breedte pagina vormen. Na een klik op een datum scrolt de pagina naar het vernieuwde dagprogramma. Wie minder beweging heeft ingesteld, krijgt dezelfde navigatie zonder vloeiende animatie.

Technisch

De kalenderweergave gebruikt expliciet een verticale flexrichting en geeft beide hoofdsecties honderd procent breedte. De datumknop roept na het opnieuw tekenen van het programma één scrollactie aan. De publieke serviceworker en assetversies zijn vernieuwd.

Technische stappen
  1. De kalenderpagina bewaakt vanaf tablet- en desktopbreedte één verticale flexkolom met volle breedte voor beide hoofdsecties.
  2. De automatische verplaatsing wordt alleen door een echte kalenderklik gestart en respecteert de systeemvoorkeur voor minder beweging.
  3. Nieuwe versienummers voor stijl, script en offline cache zorgen dat ook een geïnstalleerde gastenapp de aanpassing ophaalt.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Kalender en dagprogramma dezelfde breedte geven
CSS
.calendar-view { display: flex; flex-direction: column; }
.month-calendar, .calendar-day-detail { width: 100%; min-width: 0; }

Wat doet dit?De twee onderdelen blijven in één verticale stroom en kunnen op brede schermen geen concurrerende zijpanelen worden.

Resultaat in de appGasten krijgen een rustig programma dat de beschikbare paginabreedte volledig gebruikt.

Wijziging 2 Na de datumkeuze naar het programma gaan
JSON
{
  "after": "datum aangeklikt en programma vernieuwd",
  "scrollTarget": "gekozen dagplanning",
  "reducedMotion": true
}

Wat doet dit?Na het verversen van de gekozen dag wordt precies de programmasectie in beeld gebracht, met respect voor de bewegingsvoorkeur.

Resultaat in de appDe bezoeker hoeft na een klik niet te zoeken of zelf voorbij de maandkalender te scrollen.

Wijziging 3 Alle overige presentaties ongemoeid laten
JSON
{
  "mobileLayoutChanged": false,
  "eventDesignChanged": false,
  "scheduleDataChanged": false
}

Wat doet dit?De verbetering is beperkt tot de brede kalenderopbouw en de navigatie na een dagklik.

Resultaat in de appDe bekende mobiele app en speciale Herbal Cup-kaarten blijven hetzelfde werken en ogen.

3 wijzigingen

  • Maand en gekozen dag vormen één helder geheel: de dagplanning staat altijd onder de kalender en gebruikt dezelfde volledige breedte.
  • Na je dagkeuze zie je meteen het juiste programma: de pagina brengt de vernieuwde dagplanning rustig in beeld en vermijdt beweging wanneer je toestel dat vraagt.
  • De bestaande mobiele en Herbal Cup-weergave blijft behouden: alleen de brede kalenderopbouw en navigatie zijn verstevigd.
v1.1.129 Portretten blijven zichtbaar in ieder deelprogramma
Probleem / foutmelding

Bij een druk dagprogramma verdwenen profielfoto's soms uit de gedeelde afbeelding om alles passend te maken. Daardoor waren opgieters minder herkenbaar, liet een duo niet altijd beide personen zien en viel een ontbrekende foto sterker op.

Oplossing

De gedeelde dagplanning heeft een nieuwe, luchtige Botanical Portrait Programme-opmaak. Profielfoto's blijven voortaan duidelijk zichtbaar in Story, feedportret en vierkant, ook op volle dagen. Duo-sessies tonen twee portretten en wanneer een foto ontbreekt, verschijnen verzorgde initialen. Donker en Licht gebruiken ruimtekleuraccenten en een subtiel botanisch detail.

Technisch

De deelstudio bouwt Story, feedportret en vierkant met dezelfde portretgerichte regels op. Zij toont per sessie één beeld, twee beelden voor een duo of verzorgde initialen en laat de onderliggende dagplanning volledig ongemoeid.

Technische stappen
  1. Elk sociaal formaat reserveert nu ruimte voor portretten en past de overige programmaonderdelen daaromheen aan.
  2. De export kiest per sessie tussen één portret, twee duoportretten of een initialenvariant wanneer geen beeld beschikbaar is.
  3. De ruimte van de sessie levert het kleuraccent voor zowel Donker als Licht; het botanische detail blijft bewust ingetogen.
  4. Sessies, tijden, namen en ruimtes komen ongewijzigd uit dezelfde dagplanning.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Profielfoto's op volle dagen zichtbaar houden
JSON
{
  "formats": ["Story / Status", "Feedportret", "Vierkant"],
  "programmeSize": "druk",
  "portraitsVisible": true
}

Wat doet dit?De nieuwe indeling maakt in ieder formaat vaste ruimte voor portretten, ook als het dagprogramma veel regels bevat.

Resultaat in de appGasten zien direct wie een sessie verzorgt zonder programma-informatie te missen.

Wijziging 2 Twee duoportretten of verzorgde initialen tonen
JSON
{
  "duoPortraits": 2,
  "fallbackWhenPhotoMissing": "verzorgde initialen",
  "emptyPortraitSpace": false
}

Wat doet dit?Een duo krijgt twee gelijkwaardige beeldplekken en een ontbrekende foto wordt automatisch door een nette initialenvariant vervangen.

Resultaat in de appBeide opgieters zijn zichtbaar en iedere sessiekaart blijft volledig en verzorgd ogen.

Wijziging 3 De botanische portretstijl laten aansluiten bij de ruimte
JSON
{
  "layout": "Botanical Portrait Programme",
  "styles": ["Donker", "Licht"],
  "roomColourAccent": true,
  "botanicalDetail": "subtiel"
}

Wat doet dit?De lichte en donkere versie delen dezelfde luchtige compositie en nemen een herkenbaar kleuraccent van de sessieruimte over.

Resultaat in de appDe gedeelde planning voelt rustig en verzorgd aan en helpt tegelijk de ruimtes visueel van elkaar te onderscheiden.

Wijziging 4 De bevestigde dagplanning ongewijzigd gebruiken
JSON
{
  "scheduleChanged": false,
  "content": ["sessies", "tijden", "namen", "ruimtes"],
  "updateScope": "alleen deelontwerp"
}

Wat doet dit?De deelstudio past uitsluitend de vormgeving aan en blijft dezelfde actuele programma-inhoud gebruiken.

Resultaat in de appGasten delen de vertrouwde, bevestigde planning in een duidelijkere en mooiere afbeelding.

4 wijzigingen

  • Iedere opgieter blijft herkenbaar, ook op drukke dagen: Story, feedportret en vierkant tonen de profielfoto's duidelijk naast het volledige programma.
  • Duo-sessies laten beide personen zien: twee portretten staan samen bij de sessie en ontbrekende foto's worden netjes opgevangen met verzorgde initialen.
  • Een luchtig Botanical Portrait Programme in Donker en Licht: ruimtekleuraccenten en een subtiel botanisch detail geven de deelafbeelding een rustige, verfijnde uitstraling.
  • Alle programma-informatie blijft hetzelfde: er zijn geen sessies, tijden, namen of ruimtes gewijzigd; alleen de gedeelde presentatie is vernieuwd.
v1.1.128 Herken Inge en Alex aan hun profielfoto
Probleem / foutmelding

Bij de nieuwe zondagssessies van Inge en Alex was nog geen geschikt portret beschikbaar. Gasten zagen daardoor initialen of een minder herkenbaar beeld in plaats van de persoon die de sessie verzorgt.

Oplossing

De aangeleverde foto's van Inge Schoubs en Alex Rademan zijn als rustige, vierkante profielfoto's aan hun Herbal Cup-sessies van zondag gekoppeld. De gastenapp, het tv-scherm en de gedeelde dagplanning gebruiken voortaan dezelfde portretten.

Technisch

De programmaweergaven gebruiken voor Inge en Alex één gecontroleerd eventportret. Alleen de beeldkoppeling verandert; de bevestigde zondagplanning blijft inhoudelijk gelijk.

Technische stappen
  1. De nieuwe portretten gelden alleen voor de betrokken Herbal Cup-sessies van 27 september en veranderen geen tijden, locaties of andere dagen.
  2. De uitsneden zijn geschikt gemaakt voor zowel ronde profielbeelden als de verschillende sociale deelindelingen; de app-cache is vernieuwd zodat geïnstalleerde apps de nieuwe foto's meteen ophalen.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Inge en Alex een herkenbaar eventportret geven
JSON
{
  "date": "2026-09-27",
  "portraits": [
    "Inge Schoubs",
    "Alex Rademan"
  ],
  "crop": "vierkant en geschikt voor ronde weergave"
}

Wat doet dit?De twee aangeleverde beelden zijn als vaste eventportretten aan de juiste namen gekoppeld.

Resultaat in de appGasten zien bij de betrokken zondagssessies meteen wie de beleving verzorgt.

Wijziging 2 Het correcte portret op iedere publieke weergave hergebruiken
JSON
{
  "surfaces": [
    "gastenapp",
    "tv-scherm",
    "gedeelde dagplanning"
  ],
  "profileSource": "Herbal Cup-eventprofiel",
  "programmeContentUnchanged": true
}

Wat doet dit?Alle publieke programmaweergaven halen het portret voor Inge en Alex uit dezelfde gecontroleerde bron.

Resultaat in de appDe herkenning blijft overal gelijk en een deelafbeelding toont geen ander of ontbrekend profiel meer.

2 wijzigingen

  • Inge en Alex staan met hun eigen foto bij de juiste sessie: de nieuwe vierkante portretten maken het zondagprogramma sneller herkenbaar.
  • Dezelfde foto in app, tv en deelafbeelding: waar je het programma ook bekijkt of deelt, Inge Schoubs en Alex Rademan verschijnen consequent met het correcte portret.
v1.1.127 Zondag krijgt 13 extra Herbal Cup-belevingen
Probleem / foutmelding

Elf alternatieve Herbal Cup-sessies uit de bijlage en twee avondsessies met Alex Rademan werden pas laat bekendgemaakt en ontbraken daardoor nog in het publieksprogramma. Zonder de juiste namen en locaties konden gasten het volledige zondagaanbod niet plannen.

Oplossing

Het gastenprogramma voor zondag 27 september bevat nu dertien extra sessies naast de zeven officiële wedstrijdsessies: elf uit de bijlage en twee met Alex Rademan om 20:00 en 21:00. Zondag telt daardoor twintig momenten. Herbal op het hele uur vindt plaats in The Barn, om tien over in Panorama, Peeling in het Stoombad en Pirts in de Forest Sauna. Bij de aanvullingen verschijnen geen prijs of maximumcapaciteit.

Technisch

De gastenapp voegt de dertien aanvullingen alleen op 2026-09-27 aan de zeven bestaande wedstrijdsessies toe. Namen, starttijden, sessietypes en locaties komen uit de aangeleverde zondagplanning en de twee bevestigde Alex-momenten. Niet-aangeleverde prijs- en capaciteitsinformatie blijft weg.

Technische stappen
  1. De extra eventplanning wordt alleen op 27 september getoond en laat de overige dagen ongemoeid.
  2. De zeven officiële wedstrijdsessies blijven behouden; de dertien extra momenten worden chronologisch toegevoegd.
  3. De ruimte volgt de bevestigde combinatie van startminuut en sessietype en gebruikt alleen gecontroleerde beelden.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Het volledige zondagprogramma samenbrengen
JSON
{
  "day": "zondag 27 september",
  "officialCompetitionSessions": 7,
  "sessionsFromAttachment": 11,
  "alexEveningSessions": 2,
  "totalSessions": 20
}

Wat doet dit?De officiële wedstrijdsessies, elf bijlagesessies en twee Alex-momenten worden samen in tijdsvolgorde getoond.

Resultaat in de appGasten kunnen het volledige Herbal Cup-aanbod van zondag vanuit één programma plannen.

Wijziging 2 De juiste naam en route per sessie tonen
JSON
{
  "20:00": "Alex Rademan",
  "21:00": "Alex Rademan",
  "locations": {
    "Herbal XX:00": "The Barn",
    "XX:10": "Panorama",
    "Peeling": "Stoombad",
    "Pirts": "Forest Sauna"
  }
}

Wat doet dit?De bevestigde sessiehouder en vaste eventlocaties staan rechtstreeks bij het juiste tijdstip.

Resultaat in de appGasten hoeven niet te zoeken en kunnen op tijd naar de juiste ruimte gaan.

Wijziging 3 Officiële beelden gebruiken waar die beschikbaar zijn
JSON
{
  "guestMasterPortraits": "toon bekende koppelingen",
  "Pirts": {
    "location": "Forest Sauna",
    "image": "officiële locatiefoto"
  }
}

Wat doet dit?De app toont bestaande officiële portretten en gebruikt voor Pirts het herkenbare beeld van de Forest Sauna.

Resultaat in de appOok de laat toegevoegde belevingen passen visueel bij de rest van het eventprogramma.

Wijziging 4 De zondaguitbreiding zonder verzonnen details publiceren
JSON
{
  "dateScope": "2026-09-27",
  "extraSessionPrice": null,
  "extraSessionCapacity": null,
  "otherDaysUntouched": true
}

Wat doet dit?Alleen de bevestigde zondaginformatie wordt gepubliceerd; prijs en capaciteit worden niet aangevuld wanneer ze niet zijn opgegeven.

Resultaat in de appGasten zien een actuele planning zonder misleidende cijfers en de programma's van andere dagen blijven gelijk.

4 wijzigingen

  • Ontdek het volledige Herbal Cup-programma van zondag: naast de zeven officiële wedstrijdsessies staan elf bijlagesessies en twee avondsessies met Alex Rademan. Samen zijn dat twintig momenten.
  • Zie meteen wie waar klaarstaat: Alex Rademan verzorgt de sessies van 20:00 en 21:00. Herbal op het hele uur is in The Barn, om tien over in Panorama, Peeling in het Stoombad en Pirts in de Forest Sauna.
  • Herken gasten en locaties aan het juiste beeld: bekende gast-opgietmeesters tonen hun beschikbare portret en Pirts gebruikt de officiële foto van de Forest Sauna.
  • Alleen betrouwbare informatie voor deze zondag: andere dagen veranderen niet en bij de extra sessies worden geen prijs of maximumcapaciteit vermeld.
v1.1.126 Deel je dagplanning in donker of licht
Probleem / foutmelding

De publieke deelstudio koos de kleur van de afbeelding automatisch. Gasten konden daardoor niet zelf bepalen of hun Story, status of bericht beter tot zijn recht kwam in een donkere of lichte uitvoering.

Oplossing

Bij Kleurstijl staan nu de keuzes Donker en Licht met een zichtbaar voorbeeld. De planning verandert meteen mee en de keuze geldt voor Story, feedportret en vierkant. De gekozen uitstraling blijft op het toestel bewaard bij een andere dag of een volgend bezoek.

Technisch

Donker en Licht gebruiken dezelfde actuele programma-inhoud. Alleen de uitstraling verandert; sessies, namen, locaties en meldingen blijven gelijk.

Technische stappen
  1. De voorkeur wordt alleen lokaal op het gebruikte toestel opgeslagen.
  2. Zonder eerdere keuze start een eventdag donker en een gewone dag licht, waarna de bezoeker dit altijd zelf kan wijzigen.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Een donkere of lichte deelafbeelding kiezen
JSON
{
  "choices": {
    "dark": "diepgroen met lichte tekst",
    "light": "warm ivoor met donkergroene tekst"
  },
  "preview": "live"
}

Wat doet dit?De gekozen kleurstijl wordt meteen op de voorbeeldafbeelding toegepast.

Resultaat in de appGasten kunnen vooraf precies zien welke uitstraling het beste bij hun sociale bericht past.

Wijziging 2 Eén kleurkeuze voor alle deelvormen bewaren
JSON
{
  "formats": ["Story / Status", "Feedportret", "Vierkant"],
  "keepOnDayChange": true,
  "storedOnDevice": true
}

Wat doet dit?De geselecteerde kleur blijft op het toestel beschikbaar bij een dag- of formaatwissel.

Resultaat in de appMeerdere programma’s delen gaat sneller en blijft visueel consequent.

2 wijzigingen

  • Kies Donker of Licht: de publieke deelstudio toont nu twee duidelijke kleurvoorbeelden en werkt de deelafbeelding onmiddellijk bij.
  • De studio onthoudt je keuze: dezelfde uitstraling blijft actief voor andere dagen en voor Story, feedportret en vierkant.
v1.1.125 Story-planningen zijn luchtiger en blijven leesbaar op drukke dagen
Probleem / foutmelding

De Story/Status-export gebruikte veel afzonderlijke kaders. Op een dag met veel sessies bleef daardoor minder ruimte over voor de belangrijkste tekst en kon de planning te druk worden.

Oplossing

De Story/Status-kaart heeft nu een open, rustige tijdlijn met subtiele scheidingslijnen, minder kaders, een zachte achtergrond en een compacte QR-footer. Bij een druk programma schakelt de export automatisch naar twee heldere kolommen en laat zij de profielfoto's weg, zodat uren, sessies en namen goed leesbaar blijven.

Technisch

De Story-rendering kiest op basis van de programmahoeveelheid tussen de ruime standaardtijdlijn en een compacte tweekolomsindeling. In die compacte indeling krijgen tekst en tijden voorrang op portretten.

Technische stappen
  1. De 9:16-presentatie gebruikt een open tijdlijn met subtiele scheiding en een compacte QR-afsluiting.
  2. De hoeveelheid programma-inhoud bepaalt automatisch of de compacte tweekolomsweergave wordt gebruikt.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 De Story een open en rustige tijdlijn geven
JSON
{
  "format": "Story / Status 9:16",
  "timeline": "open",
  "dividers": "subtiel",
  "frames": "minimaal",
  "background": "rustig",
  "qrFooter": "compact"
}

Wat doet dit?De vernieuwde opbouw gebruikt witruimte en subtiele lijnen om de sessies te ordenen, zonder ieder onderdeel in een zwaar kader te plaatsen.

Resultaat in de appDe gedeelde dagplanning oogt professioneler en is rustiger te bekijken op een telefoonscherm.

Wijziging 2 Drukke programma's automatisch compact indelen
JSON
{
  "when": "veel sessies op één dag",
  "columns": 2,
  "profilePhotos": false,
  "priority": ["uur", "sessie", "naam"]
}

Wat doet dit?Wanneer één kolom te weinig leesruimte biedt, kiest de export zelf voor twee kolommen en maakt zij extra plaats door portretten weg te laten.

Resultaat in de appOok een volle dag past duidelijk in Story/Status-formaat en de belangrijke programmatekst blijft goed leesbaar.

2 wijzigingen

  • Meer rust in iedere Story en Status: de planning gebruikt nu een open tijdlijn, subtiele scheidingslijnen, minder kaders, een rustige achtergrond en een compacte QR-footer.
  • Drukke dagen blijven helder leesbaar: zodra veel sessies in één Story moeten passen, schakelt de kaart automatisch naar twee overzichtelijke kolommen zonder profielfoto's, met alle ruimte voor uren, sessies en namen.
v1.1.124 Gedeelde kalenderdag opent weer op de juiste datum
Probleem / foutmelding

Bij het delen van een kalenderdag buiten de eerste zeven dagen kon de link na openen terugvallen op de korte startweergave in plaats van op de gekozen datum. Oudere links met #calendar moesten bovendien betrouwbaar naar het kalenderprogramma blijven leiden.

Oplossing

Een gedeelde dag onthoudt nu de geselecteerde kalenderdatum en opent het programma rechtstreeks op die dag, ook wanneer die buiten de zevendaagse startweergave valt. Bestaande #calendar-links worden veilig herkend en naar het kalenderprogramma geleid.

Technisch

De kalenderopening bewaart de geselecteerde datum wanneer die buiten de eerste zeven dagen ligt en verwerkt de bestaande #calendar-verwijzing als een veilige ingang naar het kalenderprogramma.

Technische stappen
  1. De geselecteerde datum krijgt voorrang wanneer de kalenderweergave vanuit een gedeelde link wordt geopend; de oudere kalenderverwijzing wordt gecontroleerd naar dezelfde programmaweergave vertaald.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 De geselecteerde kalenderdag veilig herstellen
JSON
{
  "sharedDate": "geselecteerde kalenderdag",
  "outsideInitialSevenDays": "open dezelfde datum",
  "legacyLink": "#calendar",
  "destination": "kalenderprogramma"
}

Wat doet dit?De gedeelde datum bepaalt welke dag de kalender toont. Een bestaande #calendar-link wordt als geldige ingang herkend en naar dezelfde veilige programmaweergave geleid.

Resultaat in de appDe ontvanger ziet meteen de bedoelde kalenderdag, ook buiten de eerste zeven dagen en via een oudere kalenderlink.

1 wijziging

  • Een gedeelde kalenderdag blijft op de juiste datum staan: kies je een dag buiten de zevendaagse startweergave, dan opent de gedeelde link opnieuw op die geselecteerde dag. Ook bestaande #calendar-links komen veilig in het kalenderprogramma terecht.
v1.1.123 Deel je dagplanning professioneel in elk sociaal formaat
Probleem / foutmelding

Wie een gekozen dag uit het wellnessprogramma wilde delen, moest tot nu toe een schermafbeelding maken of de sessies zelf overschrijven. Zo'n beeld paste niet altijd goed in Stories, WhatsApp Status of een feed en kon verouderd raken of te veel praktische informatie bevatten.

Oplossing

Met de nieuwe knop Deel dagplanning open je vanuit de gekozen dag of kalender een aparte publieke deelstudio. Kies het gewenste sociale formaat en de app maakt automatisch een rustige White Oak-kaart of passende eventstijl met de actuele publieksplanning. Het PNG-bestand wordt lokaal op je toestel gemaakt en kan rechtstreeks worden gedeeld of gedownload, met een kopieerbaar bijschrift als terugval.

Technisch

De gekozen datum opent een afzonderlijke publieke deelroute met no-storebeleid. Die route gebruikt de actuele publieksgegevens en kiest automatisch de rustige White Oak-presentatie of de officiële eventstijl. Alle teksten volgen NL, FR of EN. De PNG-rendering gebeurt lokaal en de Story-opbouw houdt rekening met de veilige zones van sociale apps.

Technische stappen
  1. De publieke studio ontvangt de gekozen dag en leest daarvoor de actuele gastenplanning zonder een verouderde pagina uit cache te gebruiken.
  2. De 9:16-opbouw bewaart extra ruimte boven en onder, zodat sociale apps de belangrijke inhoud niet met hun eigen knoppen bedekken.
  3. De afbeelding blijft op het toestel: alleen de gewone deel- of downloadfunctie van de browser krijgt het gemaakte PNG-bestand.
Voorbeeldcode per wijziging6 voorbeelden
Wijziging 1 Van dagkiezer of kalender naar dezelfde publieke studio gaan
JSON
{
  "button": "Deel dagplanning",
  "availableAt": ["gekozen dag", "kalender"],
  "destination": "aparte publieke deelstudio"
}

Wat doet dit?Beide ingangen nemen de geselecteerde datum mee naar dezelfde eenvoudige openbare deelomgeving.

Resultaat in de appJe hoeft de gekozen dag niet opnieuw op te zoeken voordat je een sociale kaart maakt.

Wijziging 2 Het juiste formaat per sociaal kanaal aanbieden
JSON
{
  "9:16": { "label": "Story / Status", "recommendedFor": ["Instagram Stories", "Facebook Stories", "WhatsApp Status"] },
  "4:5": { "label": "Feedportret", "recommendedFor": ["Instagram-feed", "Facebook-feed"] },
  "1:1": { "label": "Vierkant", "recommendedFor": ["universeel gebruik"] }
}

Wat doet dit?Elk formaat vermeldt duidelijk waar het doorgaans het beste past; 9:16 wordt als aanbevolen keuze voor Stories en Status aangeboden.

Resultaat in de appDe planning vult het gekozen sociale vlak professioneel zonder handmatig bijsnijden.

Wijziging 3 Automatisch de juiste dagstijl en gastinformatie kiezen
JSON
{
  "normalDayStyle": "rustige White Oak-layout",
  "eventDayStyle": "bijpassende eventstijl",
  "includes": ["profielfoto's", "ruimtes", "kleurcodes", "badkleding", "voorlopige melding"],
  "excludes": ["prijs", "capaciteit"]
}

Wat doet dit?De gekozen dag bepaalt automatisch de visuele stijl. Alleen publieksinformatie die op een sociale planning thuishoort wordt op de kaart gezet.

Resultaat in de appEen gewone dag blijft rustig en een event herkenbaar, zonder overbodige prijs- of capaciteitsgegevens.

Wijziging 4 Studio, kaart en bijschrift in drie talen tonen
JSON
{
  "languages": ["Nederlands", "Frans", "Engels"],
  "translatedParts": ["bediening", "kaartteksten", "bijschrift"]
}

Wat doet dit?De actieve taal wordt niet alleen op de planningkaart gebruikt, maar ook in de bediening en het voorgestelde bijschrift.

Resultaat in de appJe kunt een volledige, samenhangende sociale publicatie in NL, FR of EN delen.

Wijziging 5 Het PNG-bestand lokaal maken en flexibel delen
JSON
{
  "pngGeneration": "lokaal op het toestel",
  "actions": ["native mobiel delen", "PNG downloaden", "bijschrift kopiëren"],
  "externalStorage": false
}

Wat doet dit?De browser bouwt het beeld op het toestel en kiest de beste beschikbare deelactie zonder de afbeelding extern te bewaren.

Resultaat in de appDelen blijft privé en werkt ook wanneer het mobiele deelvenster geen bestanden ondersteunt.

Wijziging 6 Actuele gegevens en veilige Story-marges bewaken
JSON
{
  "pageCache": "no-store",
  "schedule": "opnieuw ophalen bij openen",
  "storySafeMargins": ["boven", "onder"]
}

Wat doet dit?De publieke deelpagina gebruikt geen bewaarde oude versie en reserveert in 9:16 extra ruimte waar sociale apps vaak hun eigen bediening plaatsen.

Resultaat in de appDe gedeelde planning is actueel en belangrijke tekst blijft zichtbaar in Instagram, Facebook en WhatsApp.

6 wijzigingen

  • Deel rechtstreeks vanuit je gekozen dag: de nieuwe knop Deel dagplanning staat bij de actieve dag en in de kalender en opent een aparte openbare studio zonder interne beheerfuncties.
  • Kies het formaat dat bij je kanaal past: 9:16 Story/Status is aanbevolen voor Instagram Stories, Facebook Stories en WhatsApp Status; 4:5 is bedoeld voor de Instagram- en Facebook-feed en 1:1 is universeel inzetbaar.
  • De vormgeving past zich automatisch aan: een gewone dag krijgt een rustige White Oak-layout en een speciale eventdag haar eventstijl. Profielfoto's, ruimtes, kleurcodes, badkleding en een voorlopige melding blijven zichtbaar, terwijl prijs en capaciteit bewust ontbreken.
  • Alles volgt je taalkeuze: studio, kaartteksten en bijschrift zijn beschikbaar in Nederlands, Frans en Engels.
  • Je afbeelding blijft lokaal op je toestel: deel het PNG-bestand via het mobiele deelvenster of download het en kopieer het bijschrift wanneer rechtstreeks delen niet beschikbaar is.
  • De deelpagina blijft actueel en Story-veilig: zij wordt niet als oude pagina bewaard en haalt het gekozen programma opnieuw op. De 9:16-kaart houdt veilige marges vrij voor tekst en knoppen van sociale apps.
v1.1.122 Het volledige Herbal Cup-team herkenbaar in beeld
Probleem / foutmelding

De zeven wedstrijdsessies stonden correct in het programma, maar deelnemers, gast-opgietmeesters en juryleden waren nog niet in iedere weergave even duidelijk herkenbaar. Rollen konden visueel door elkaar lopen en zonder handmatige flyer of video ontbrak op tv een passende officiële eventafbeelding.

Oplossing

Alle zeven deelnemers hebben nu hun correcte portret in de gastenapp, interne app, tv-weergave en gedeelde sociale planning. De drie gast-opgietmeesters en zes juryleden krijgen elk een afzonderlijke compacte groep die de officiële affiche opent. Tv toont beide groepen in rustige, subtiel bewegende stroken en gebruikt het officiële eventbeeld als fallback. Programma-uren en kleuren blijven gelijk, prijs en capaciteit worden niet toegevoegd en de beelden blijven via de offline cache beschikbaar.

Technisch

De persoonsbeelden en groepsinformatie komen uit één gedeelde eventset. Gastenapp, tv en sociale deelplanning gebruiken daardoor dezelfde portretten en rollen. De tv heeft een officiële beeldfallback en de offline cache bewaart de betrokken afbeeldingen. De bestaande sessies, uren en kleuren blijven ongewijzigd.

Technische stappen
  1. De gastenapp, tv-weergave en sociale planning delen dezelfde officiële persoonsbeelden.
  2. De twee aanvullende groepen behouden hun eigen rolnaam, aantal personen en affichelink.
  3. De offline assetlijst bevat alle portretten en het officiële fallbackbeeld zonder wijzigingen aan het sessieprogramma.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Alle zeven deelnemers met dezelfde officiële foto tonen
JSON
{
  "participants": 7,
  "portraits": "officieel en correct gekoppeld",
  "surfaces": ["gastenapp", "interne app", "tv", "sociale deelplanning"]
}

Wat doet dit?Iedere weergave haalt de foto van een deelnemer uit dezelfde gecontroleerde eventset.

Resultaat in de appGasten herkennen de deelnemers consequent, ongeacht waar zij het Herbal Cup-programma bekijken.

Wijziging 2 Gast-opgietmeesters en jury apart houden
JSON
{
  "guestSaunaMasters": 3,
  "juryMembers": 6,
  "presentation": "twee afzonderlijke compacte groepen",
  "opensOnTap": "officiële affiche"
}

Wat doet dit?De gast-opgietmeesters en juryleden hebben elk hun eigen herkenbare groep en delen alleen de link naar de officiële eventinformatie.

Resultaat in de appDe verschillende rollen zijn meteen duidelijk en de officiële affiche blijft binnen één tik bereikbaar.

Wijziging 3 Tv-stroken met een herkenbare fallback tonen
JSON
{
  "separateTvStrips": true,
  "movement": "subtiel",
  "eventMediaFallback": "officiële Herbal Cup-eventafbeelding"
}

Wat doet dit?De tv verdeelt gasten en jury over twee rustige stroken en gebruikt zonder handmatige flyer of video het officiële eventbeeld.

Resultaat in de appHet scherm blijft levendig maar rustig en behoudt steeds een herkenbaar eventbeeld.

Wijziging 4 Alleen presentatie en offline beelden uitbreiden
JSON
{
  "keptExactly": ["uren", "eventkleuren", "reservatiekleuren"],
  "excluded": ["prijs", "capaciteit"],
  "imagesAvailableOffline": true
}

Wat doet dit?De nieuwe portretten en groepen veranderen niets aan het officiële sessieprogramma en voegen geen operationele cijfers toe.

Resultaat in de appGasten zien dezelfde vertrouwde planning met betere herkenning, ook wanneer de verbinding tijdelijk minder goed is.

4 wijzigingen

  • Alle zeven deelnemers hebben hun correcte portret: dezelfde juiste foto verschijnt in de gastenapp, interne app, tv-weergave en sociale deelplanning.
  • Gast-opgietmeesters en juryleden zijn helder gescheiden: je ziet drie gasten en zes juryleden in aparte compacte groepen. Een tik opent de officiële Herbal Cup-affiche.
  • Tv toont het eventteam rustig en herkenbaar: gasten en jury krijgen elk een subtiel bewegende strook; zonder handmatige flyer of video verschijnt de officiële eventafbeelding als fallback.
  • De planning blijft exact hetzelfde: uren en kleurinformatie wijzigen niet en prijs of capaciteit worden niet toegevoegd. De beelden zitten ook in de offline cache.
v1.1.121 Herbal Cup-programma volledig volgens de affiche
Probleem / foutmelding

Bij een officiële Herbal Cup-sessie kon Aufguss of Peeling twee keer in dezelfde rij verschijnen. Het bijzondere thema uit de affiche viel daardoor minder op, terwijl dat juist helpt om de verschillende wedstrijdsessies van elkaar te onderscheiden.

Oplossing

Het affichethema staat nu als grote sessietitel in beeld. Aufguss of Peeling blijft als compact typelabel zichtbaar, gevolgd door de deelnemer, locatie en het kleurkaartje voor de verplichte reservatie. Alleen de zeven sessies van de officiële affiche worden getoond.

Technisch

Voor de officiële eventrijen gebruikt de gastenapp het thema als hoofdtitel en het type als klein label. De deelnemer, locatie en reservatiekleur blijven ongewijzigd zichtbaar.

Technische stappen
  1. De publieke sessierij leest het officiële themaveld afzonderlijk van het sessietype, zodat beide gegevens hun eigen vaste plaats behouden.
  2. Een officieel vervangprogramma sluit andere automatisch ingelezen sessietypes voor dezelfde datum uit.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Het unieke wedstrijdthema vooropzetten
JSON
{
  "sessionType": "Peeling",
  "theme": "The Child Within",
  "display": "thema als titel, type als label"
}

Wat doet dit?Type en thema blijven afzonderlijke informatie, maar de visuele nadruk ligt voortaan op de unieke titel van de wedstrijdsessie.

Resultaat in de appDe Herbal Cup-planning is duidelijker, minder herhalend en trouw aan de officiële affiche.

Wijziging 2 Het officiële aantal sessies bewaken
JSON
{
  "event": "Belgian Sauna Herbal Cup 2026",
  "sessionsPerDay": 7,
  "showUnlistedSessions": false
}

Wat doet dit?Het eventprogramma vervangt op deze twee dagen de gewone planning, zodat alleen informatie uit de officiële affiche verschijnt.

Resultaat in de appGasten zien in alle weergaven hetzelfde betrouwbare Herbal Cup-programma.

2 wijzigingen

  • Het thema uit de affiche is meteen zichtbaar: je leest bijvoorbeeld ‘The Child Within’ als titel en ‘Peeling’ als afzonderlijk sessietype, zonder dubbele tekst.
  • Precies zeven officiële sessies: zaterdag en zondag volgen uitsluitend de Herbal Cup-affiche, zonder een extra automatisch afgeleide klankbeleving.
v1.1.120 Het officiële Herbal Cup-programma staat live
Probleem / foutmelding

De gastenapp en het tv-scherm gebruikten voor het Herbal Cup-weekend nog een algemeen terugvalprogramma. Daardoor waren de echte deelnemers, ritueeltitels, locaties en kleurkaartjes uit de affiches niet zichtbaar en konden gewone prijs- of capaciteitsregels bij een wedstrijdsessie terechtkomen.

Oplossing

Zaterdag en zondag tonen nu elk hun eigen officiële afficheplanning met zeven wedstrijdsessies. Uur, Aufguss of Peeling, thema, deelnemer, locatie en kleurkaartje zijn op telefoon, in de kalender en op tv gelijk. De planning vermeldt geen prijs of maximumaantal wanneer de affiche die informatie niet geeft. Rustige bewegende kleuraccenten zetten het uitzonderlijke weekend extra in de kijker.

Technisch

De gastenapp, kalender en tv-feed lezen dezelfde officiële eventvelden voor 26 en 27 september. De planning vervangt op die data de generieke terugvalrijen, slaat prijs- en capaciteitsstandaarden over en gebruikt vernieuwde caches.

Technische stappen
  1. De publieke planning ontvangt voor beide eventdagen een vaste officiële sessielijst.
  2. De kleurcodes uit de affiche worden als veilige kleurvariabelen naar dag, kalender, details en tv gestuurd.
  3. De standaardprijs en standaardcapaciteit van gewone scrubs worden voor wedstrijdpeelings niet toegepast.
  4. Nieuwe cacheversies zorgen dat geïnstalleerde apps en mediaschermen de wijziging snel ontvangen.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Iedere affiche aan de juiste datum koppelen
JSON
{
  "zaterdag 26 september": "7 sessies van de bovenste affiche",
  "zondag 27 september": "7 sessies van de onderste affiche"
}

Wat doet dit?De twee dagen hebben elk hun eigen vast programma in plaats van één algemene terugvalplanning.

Resultaat in de appGasten zien vandaag en morgen de juiste uren, namen en volgorde.

Wijziging 2 Een wedstrijdsessie volledig beschrijven
JSON
{
  "time": "17:00",
  "type": "Peeling",
  "theme": "Spiritual Alignement",
  "host": "Bjorn Eerdekens",
  "room": "Hamam GVL"
}

Wat doet dit?Alle tekstonderdelen uit de affiche blijven afzonderlijk beschikbaar voor de compacte telefoon- en tv-layout.

Resultaat in de appDezelfde sessie wordt in elke publieke weergave volledig en leesbaar getoond.

Wijziging 3 Het deelnamekaartje visueel koppelen
JSON
{
  "reservationRequired": true,
  "reservationColor": "#004AAD",
  "reservationColorLabel": "Donkerblauw"
}

Wat doet dit?Naast de exacte kleur staat ook de kleurnaam, zodat het accent een praktische betekenis heeft.

Resultaat in de appDe gast herkent onmiddellijk welk kaartje bij de gekozen sessie hoort.

Wijziging 4 Alleen bevestigde informatie tonen
JSON
{
  "price": null,
  "capacity": null,
  "eventMotion": "rustige kleurpuls"
}

Wat doet dit?Niet-vermelde prijs- en capaciteitsgegevens blijven weg; de beweging ondersteunt de herkenning zonder af te leiden.

Resultaat in de appDe eventplanning blijft trouw aan de affiche, duidelijk en professioneel.

4 wijzigingen

  • De juiste affiche per dag: zaterdag toont 14:00–20:00 en zondag 12:00–18:00, met telkens zeven officiële Herbal Cup-sessies.
  • Volledige wedstrijdinformatie: Aufguss of Peeling, ritueeltitel, deelnemer en The Barn of Hamam GVL staan overzichtelijk bij elkaar.
  • Reservatie en kleurkaartje zijn glashelder: de exacte deelnemerskleur verschijnt als accent én als benoemd kaartje.
  • Alleen bevestigde affichegegevens: geen prijs of maximumaantal, wel een rustig bewegend eventaccent op telefoon en tv.
v1.1.119 HERBAL CUP blijft zichtbaar op 26 en 27 september
Probleem / foutmelding

Bij de sessies van de HERBAL CUP op 26 en 27 september kon in de gastenapp, haar kalenderweergave en op het gedeelde tv-scherm het algemene label Wedstrijddeelnemers verschijnen. Dat week af van de door de manager bevestigde eventnaam en van de interne planner, waar HERBAL CUP al correct stond.

Oplossing

De gastenapp, haar kalenderweergave en de gedeelde tv-feed gebruiken nu allemaal HERBAL CUP als centrale programmahost voor beide eventdagen. Zo blijft de herkenbare eventnaam overal gelijk. Wanneer echte deelnemersnamen bekend zijn, verschijnen die vanzelf in plaats van het algemene label.

Technisch

Voor 26 en 27 september staat HERBAL CUP als centrale programmeHost in het eventprogramma. De gastenapp, haar kalenderweergave en de gedeelde tv-feed gebruiken deze waarde wanneer een sessie nog geen echte deelnemersnaam heeft; een ingevulde persoonlijke naam behoudt altijd voorrang.

Technische stappen
  1. Beide eventdagen delen HERBAL CUP als centrale programmeHost voor hun sessies.
  2. De gastenapp, kalenderdagen en gedeelde tv-feed gebruiken diezelfde eventwaarde als terugvallabel.
  3. Een aanwezige echte deelnemersnaam blijft boven de centrale programmahost staan.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 HERBAL CUP voor beide dagen vastleggen
JSON
{
  "2026-09-26": {"programmeHost": "HERBAL CUP"},
  "2026-09-27": {"programmeHost": "HERBAL CUP"}
}

Wat doet dit?De door de manager bevestigde hostnaam is voor beide eventdagen in dezelfde centrale programma-informatie opgenomen.

Resultaat in de appGasten herkennen op 26 én 27 september consequent de naam HERBAL CUP.

Wijziging 2 Apps, kalender en tv gelijk houden
JSON
{
  "programmeHost": "HERBAL CUP",
  "shownIn": ["gastenapp", "publieke kalender", "gedeeld tv-scherm"]
}

Wat doet dit?Elke publieke weergave haalt het terugvallabel uit dezelfde centrale eventwaarde in plaats van zelf een algemene naam te kiezen.

Resultaat in de appDe sessiehost is in de gastenapp, kalender en op het tv-scherm overal hetzelfde.

Wijziging 3 Een echte deelnemersnaam eerst tonen
JSON
{
  "displayNamePriority": ["echte deelnemersnaam", "programmeHost"],
  "fallback": "HERBAL CUP"
}

Wat doet dit?De eventnaam vult alleen het lege hostveld op; een concrete deelnemersnaam wordt altijd als eerste gekozen.

Resultaat in de appGasten zien HERBAL CUP zolang dat nodig is en meteen de echte naam zodra die bekend is.

3 wijzigingen

  • HERBAL CUP is de juiste hostnaam op beide eventdagen: op 26 en 27 september zie je niet langer Wedstrijddeelnemers wanneer nog geen persoonlijke naam bekend is.
  • Apps, kalender en tv tonen hetzelfde programma: de gastenapp, haar kalenderweergave en het gedeelde tv-scherm nemen voortaan dezelfde centrale hostnaam over als de interne planner.
  • Persoonlijke namen blijven het belangrijkst: zodra echte deelnemersnamen beschikbaar zijn, worden die getoond in plaats van HERBAL CUP.
v1.1.118 Uitzonderlijk geen klankbeleving op 25 september
Probleem / foutmelding

De gastenapp toonde op vrijdag 25 september nog een Sound healing om 18:00 in Shou Sugi Ban met de uitleg dat alleen de naam van de sound healer later zou volgen. De manager heeft bevestigd dat deze sessie die dag uitzonderlijk niet plaatsvindt. De oude weergave wekte daardoor ten onrechte de indruk dat de sessie zeker doorging.

Oplossing

De niet-doorgaande Sound healing is uit het programma van 25 september verwijderd. Boven het dagprogramma verschijnt een warme, duidelijke melding dat er die dag uitzonderlijk geen klankbeleving is en dat de andere opgiet- en scrubsessies gewoon doorgaan. De boodschap volgt de gekozen taal in Nederlands, Frans of Engels. Hetzelfde gecorrigeerde sessieschema wordt met het tv-scherm gedeeld.

Technisch

Bij het opbouwen van de geselecteerde dag wordt de bevestigde uitzondering voor 25 september toegepast voordat de sessies, open namen en publieke meldingen worden samengesteld. De gastenapp toont daarna de passende vertaalde uitleg; de tv-weergave leest dezelfde daggegevens zonder de losse klankbeleving.

Technische stappen
  1. De centrale dagspecifieke uitzondering verwijdert alleen de losse klankbeleving van 25 september; de overige sessies blijven behouden.
  2. De melding gebruikt afzonderlijke vertaalde teksten voor Nederlands, Frans en Engels en blijft aan de geselecteerde dag gekoppeld.
  3. De publieke app en het tv-scherm ontvangen dezelfde gefilterde sessielijst, zodat de geannuleerde sessie niet via een andere weergave terugkomt.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 De niet-doorgaande sessie uit het publieke programma houden
JSON
{
  "2026-09-25": {
    "cancelledSessionKinds": ["sound_healing"],
    "badge": "Geen klankbeleving"
  }
}

Wat doet dit?De datumuitzondering verwijdert precies de losse klankbeleving die door de manager is afgemeld en laat de andere sessies ongemoeid.

Resultaat in de appGasten zien geen foutieve sessie en geen misleidende melding dat alleen de naam nog moet worden ingevuld.

Wijziging 2 De programmawijziging vriendelijk toelichten
Twig
<aside class="schedule-exception-notice" role="status">
  <strong>Uitzonderlijk geen klankbeleving</strong>
  <span>Op deze dag klinkt de stilte wat langer. De andere opgiet- en scrubsessies gaan gewoon door.</span>
</aside>

Wat doet dit?De melding combineert een ondubbelzinnige titel met een warme uitnodiging om het resterende wellnessprogramma te beleven.

Resultaat in de appBezoekers begrijpen de uitzondering zonder dat de boodschap negatief of administratief aanvoelt.

Wijziging 3 Taalkeuze en tv-programma gelijk houden
JavaScript
if (day.exception) {
  exceptionTag.textContent = text('noSoundExceptionShort');
}
exceptionNotice.hidden = !day.exception;

Wat doet dit?De gastenapp kiest de melding in de actieve taal en gebruikt voor app en tv dezelfde al gecorrigeerde sessielijst.

Resultaat in de appNederlandstalige, Franstalige en Engelstalige gasten krijgen dezelfde duidelijke betekenis en het tv-scherm toont geen afwijkend programma.

3 wijzigingen

  • De foutieve Sound healing is uit het dagprogramma gehaald: op 25 september zie je niet langer een sessie om 18:00 in Shou Sugi Ban of een melding dat de naam nog volgt.
  • De uitzondering wordt warm en helder uitgelegd: de melding vertelt dat er die dag uitzonderlijk geen klankbeleving is en nodigt gasten uit om van de andere opgiet- en scrubsessies te genieten.
  • Elke publieke weergave blijft gelijk: de tekst volgt de taalkeuze in Nederlands, Frans of Engels en het tv-scherm gebruikt hetzelfde gecorrigeerde programma.
v1.1.117 Badkledingdagen meteen herkenbaar in alle dagknoppen
Probleem / foutmelding

Hoewel de badkledingmelding al direct onder de dagkiezer stond, viel in de zeven dagknoppen zelf nog onvoldoende op voor welke dagen badkleding verplicht is. Het korte label Badkleding kon bovendien worden opgevat als algemene informatie in plaats van een duidelijke verplichting.

Oplossing

Alle zeven dagknoppen markeren een badkledingdag nu met een rustig saliegroen vlak, een golficoon en de expliciete tekst Badkleding verplicht. De bestaande grens van maximaal twee detailregels blijft behouden, zodat ook events en planninginformatie overzichtelijk blijven. De melding direct onder de dagkiezer toont een duidelijke dagspecifieke titel en praktische uitleg in Nederlands, Frans en Engels. Zij gebruikt één beleefde statusregio, zonder extra toast, en blijft verzorgd in donkere weergave en bij minder beweging.

Technisch

De dagmacro zet op een badkledingdag eerst de golfregel met swimwearRequiredShort en verhoogt daarna de teller voor de maximaal twee zichtbare details. Beide dagrijen en de dynamische taal- en dagupdate gebruiken is-badkleding. De bestaande banner blijft het enige meldingsvlak en gebruikt role=status, aria-live=polite en aria-atomic=true; hierdoor is geen tweede toast nodig.

Technische stappen
  1. Badkledingdagen krijgen de klasse is-badkleding in beide rijen van de dagkiezer en bij iedere dynamische dagupdate.
  2. Het label swimwearRequiredShort wordt in Nederlands, Frans en Engels gebruikt naast hetzelfde golficoon als de melding.
  3. De bestaande teller voor zichtbare dagdetails telt de badkledingregel mee en begrenst de knop op maximaal twee regels.
  4. De enige badkledingmelding gebruikt role=status, aria-live=polite en aria-atomic=true. Er wordt geen afzonderlijke toast aangemaakt.
  5. De kleuren gebruiken de bestaande themavariabelen en beweging valt onder de bestaande reduced-motionregels.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Badkleding in iedere dagknop duidelijk markeren
Twig
<button class="day-button{{ day.isBadkleding ? ' is-badkleding' : '' }}">
    <small class="day-clothing">
        <svg aria-hidden="true">…</svg>
        <b data-i18n="swimwearRequiredShort">Badkleding verplicht</b>
    </small>
</button>

Wat doet dit?Alle zeven dagen gebruiken dezelfde voorwaardelijke klasse, hetzelfde golficoon en het expliciete korte label. De CSS geeft is-badkleding een rustige saliegroene markering.

Resultaat in de appEen gast herkent zonder de dag eerst te openen welke dagen badkleding verplicht is.

Wijziging 2 Maximaal twee detailregels behouden
Twig
{% set visibleDetails = 0 %}
{% if day.isBadkleding %}
    <small class="day-clothing">…</small>
    {% set visibleDetails = visibleDetails + 1 %}
{% endif %}
{% if day.eventTitle and visibleDetails < 2 %}
    <small class="day-special-event">★ {{ day.eventTitle }}</small>
{% endif %}

Wat doet dit?De opvallende badkledingregel neemt één van de bestaande twee plaatsen in. Alleen als er nog ruimte is, sluit een event of planningdetail aan.

Resultaat in de appDe verplichting is duidelijk zonder de kleine dagknoppen opnieuw druk of te hoog te maken.

Wijziging 3 De gekozen dag helder en vertaald toelichten
JavaScript
swimwearRequiredShort: 'Badkleding verplicht',
swimwearNotice: '{day}: badkleding verplicht',
swimwearNoticeDetail: 'Badkleding is de volledige dag verplicht voor alle gasten in de wellness. Vergeet ze niet mee te brengen.'

notice.querySelector('[data-clothing-notice]').textContent = replace(text('swimwearNotice'), { day: dayLabel(offset, iso) });
notice.querySelector('[data-clothing-notice-detail]').textContent = text('swimwearNoticeDetail');

Wat doet dit?De titel noemt de geselecteerde dag en de detailtekst legt de praktische verplichting uit. Dezelfde sleutels hebben een Franse en Engelse vertaling; de bestaande banner wordt bijgewerkt in plaats van een toast toe te voegen.

Resultaat in de appNa een dag- of taalwissel ziet de gast één duidelijke, actuele melding zonder dubbele boodschap.

Wijziging 4 Eén toegankelijke statusmelding gebruiken
HTML
<aside class="day-notice" id="badkledingNotice" role="status" aria-live="polite" aria-atomic="true">
    <span class="notice-icon" aria-hidden="true">…</span>
    <span class="day-notice-copy">…</span>
</aside>

Wat doet dit?role=status en aria-live=polite kondigen een dagwijziging rustig aan; aria-atomic zorgt dat titel en detail samen worden gelezen. De bestaande dark-mode- en reduced-motionregels blijven op hetzelfde element van toepassing.

Resultaat in de appDe melding is duidelijk voor ziende gasten en schermlezers, zonder dubbele toast of onnodige beweging.

4 wijzigingen

  • Badkledingdagen vallen in alle zeven dagknoppen meteen op: iedere betrokken dag krijgt een rustige saliegroene markering, een golficoon en het ondubbelzinnige label Badkleding verplicht.
  • De compacte dagkiezer blijft overzichtelijk: de badkledingregel telt mee binnen het bestaande maximum van twee detailregels, zodat een event of planningstatus nog steeds rustig kan aansluiten.
  • De melding onder de dagkiezer is concreter: zij benoemt de gekozen dag, bevestigt dat badkleding de volledige dag voor alle gasten verplicht is en herinnert eraan die mee te brengen. De tekst volgt automatisch de gekozen taal in NL, FR of EN en er verschijnt geen dubbele toast.
  • De verduidelijking blijft toegankelijk en comfortabel: de melding werkt als één beleefde, volledige statusaankondiging en de nieuwe knopmarkering blijft passend in donkere weergave en bij de voorkeur voor minder beweging.
v1.1.116 Gelijktijdige sessies compact met vroege live-afteller
Probleem / foutmelding

Wanneer twee sessies op hetzelfde uur begonnen, verschenen op desktop twee volledige grote presentatiekaarten onder elkaar. Daardoor nam Nu & straks te veel hoogte in en bleef de eerstvolgende sessie buiten beeld. De bestaande relatieve tijdsaanduiding verscheen bovendien pas vrij laat en gaf geen nauwkeurige afteller.

Oplossing

Twee gelijktijdige sessies staan op brede schermen nu compact naast elkaar in één professioneel liveoverzicht. Foto, naam, sessietype, locatie, eventuele prijs en capaciteit en de actuele status blijven duidelijk zichtbaar. Hierna staat vóór de kaarten en kondigt de volgende sessie al vanaf 120 minuten vooraf aan met een exacte afteller. Alleen de tijdtekst wordt iedere seconde bijgewerkt, zodat de pagina rustig blijft. Subtiele beweging versterkt de livebeleving, met volledige ondersteuning voor minder beweging, Nederlands, Frans, Engels en schermlezers.

Technisch

De bestaande Nu & straks-weergave herkent een groep met hetzelfde starttijdstip en gebruikt op desktop een compacte tweekolomsvariant. De volgende groep mag vanaf 120 minuten vooraf verschijnen en krijgt één gedeelde timer. Een afzonderlijke seconde-tick wijzigt alleen elementen met een aftellerkenmerk. Vertalingen, vaste cijferbreedte, uitgeschakelde seconde-aankondigingen en reduced-motionregels houden de weergave stabiel en toegankelijk.

Technische stappen
  1. De desktopindeling schakelt alleen bij meerdere sessies op hetzelfde startuur over naar een compacte tweekolomsweergave; een enkele sessie behoudt haar ruime presentatie.
  2. De volgende sessiegroep wordt vanaf 120 minuten vooraf gekozen en als één gedeelde aankondiging vóór de huidige kaarten geplaatst.
  3. Een lichte timerfunctie past per seconde uitsluitend de zichtbare aftellertekst aan. De programma-inhoud blijft via de bestaande rustige verversing werken.
  4. De secondenafteller is geen luid aangekondigde live-regio. Daardoor leest hulpsoftware niet iedere seconde opnieuw voor; de omringende status blijft wel begrijpelijk.
  5. Animatie wordt via de bestaande instelling voor minder beweging uitgeschakeld en de tijd gebruikt cijfers met vaste breedte voor een stabiele weergave.
Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 Gelijktijdige sessies als compacte groep markeren
JavaScript
var group = primary ? concurrentSessions(day, primary) : [];
list.classList.toggle('is-concurrent', group.length > 1);

Wat doet dit?De app herkent wanneer meer dan één sessie exact hetzelfde startuur heeft en markeert alleen die situatie voor de compacte desktopindeling.

Resultaat in de appTwee gelijktijdige sessies staan naast elkaar, terwijl een gewone enkele sessie haar vertrouwde ruime presentatie behoudt.

Wijziging 2 Essentiële gegevens in iedere compacte kaart bewaren
JSON
{
  "compactCard": ["photo", "name", "sessionType", "room", "price", "capacity", "status"]
}

Wat doet dit?De compactere afmetingen verwijderen geen praktische informatie die gasten nodig hebben om de twee sessies te onderscheiden.

Resultaat in de appOok in het kleinere formaat blijven persoon, beleving, locatie, voorwaarden en actuele toestand in één oogopslag duidelijk.

Wijziging 3 Hierna maximaal twee uur vooraf tonen
JavaScript
var NEXT_SESSION_COUNTDOWN_MINUTES = 120;
var next = day.sessions.find(function (session) {
    var minutes = minutesUntil(session.startsAt);
    return minutes > 0 && minutes <= NEXT_SESSION_COUNTDOWN_MINUTES;
});

Wat doet dit?De eerstvolgende sessie wordt geselecteerd zodra zij binnen het venster van 120 minuten valt. De Hierna-aankondiging staat vóór de huidige kaarten.

Resultaat in de appGasten zien ruim op tijd welke sessie volgt en hoeven niet eerst voorbij de livekaarten te scrollen.

Wijziging 4 Alleen de aftellertekst per seconde bijwerken
JavaScript
function updateSessionCountdowns() {
    document.querySelectorAll('[data-countdown-session]').forEach(function (node) {
        var session = sessions[node.dataset.countdownSession];
        node.textContent = countdownLabel(session);
    });
}
setInterval(updateSessionCountdowns, 1000);

Wat doet dit?De seconde-tick zoekt uitsluitend de kleine timervelden en verandert hun tekst. De kaarten en de rest van de pagina worden niet opnieuw opgebouwd.

Resultaat in de appDe afteller loopt nauwkeurig en vloeiend zonder flitsen, verspringende inhoud of een storende paginaverversing.

Wijziging 5 Beweging, vertaling en hulpsoftware rustig houden
CSS
.session-countdown { font-variant-numeric: tabular-nums; }
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; }
}

<span role="timer" aria-live="off">Begint over 01:24:18</span>

Wat doet dit?Vaste cijferbreedte voorkomt verspringen, minder-beweging schakelt het subtiele effect uit en aria-live=off voorkomt dat een schermlezer iedere seconde onderbreekt. De zichtbare tekst komt uit de actieve NL-, FR- of EN-vertaling.

Resultaat in de appDe livebeleving blijft professioneel en begrijpelijk, ook voor gasten die minder beweging verkiezen of hulpsoftware gebruiken.

5 wijzigingen

  • Gelijktijdige sessies krijgen een compact desktopoverzicht: twee sessies met hetzelfde startuur staan op brede schermen professioneel naast elkaar, zodat beide meteen zichtbaar zijn zonder een lange stapel kaarten.
  • Alle belangrijke sessiegegevens blijven leesbaar: iedere compacte kaart behoudt foto, naam, sessietype, locatie, eventuele prijs en capaciteit en de actuele status.
  • Hierna staat vóór de huidige sessies: de eerstvolgende sessiegroep verschijnt al tot 120 minuten vooraf boven de kaarten, zodat gasten tijdig weten wat eraan komt.
  • De starttijd telt exact en rustig af: uur, minuten en seconden veranderen live, terwijl alleen die korte tijdtekst wordt bijgewerkt en de pagina niet iedere seconde opnieuw opbouwt.
  • Beweging en taal blijven comfortabel voor iedereen: subtiele accenten versterken de livebeleving, maar verdwijnen bij minder beweging. Nederlands, Frans, Engels en schermlezers krijgen dezelfde duidelijke boodschap zonder iedere seconde te worden onderbroken.
v1.1.115 Badkledingmelding meteen zichtbaar bij je dagkeuze
Probleem / foutmelding

De opvallende badkledingbanner stond pas ver onder Nu & straks en de uitleg over smartphonegebruik. Wie bovenaan een andere dag koos, kon daardoor de bijbehorende badkledinginformatie missen of pas veel later tegenkomen. De volgorde week ook af van de interne app, waar belangrijke daginformatie meteen onder de dagkeuze staat.

Oplossing

De bestaande banner is verplaatst naar onmiddellijk onder de dagkiezer en vóór Nu & straks. Icoon, heldere titel en uitleg blijven behouden en volgen nog steeds automatisch de gekozen dag en taal in Nederlands, Frans of Engels. De banner werkt ongewijzigd in donkere weergave en bij de voorkeur voor minder beweging, heeft meer ademruimte en wordt met een notitierol en beleefde live-aankondiging beter ondersteund door schermlezers.

Technisch

De bestaande banner is in de pagina-opbouw van onder het programma- en smartphonegedeelte naar direct na de dagkiezer verplaatst. Dezelfde dag- en vertaalgegevens blijven de inhoud sturen. Aan de banner zijn role=note en aria-live=polite toegevoegd; de stylesheet past alleen de omliggende ruimte aan en behoudt de bestaande dark- en reduced-motionweergave.

Technische stappen
  1. Alleen de plaats van de bestaande banner in de pagina is gewijzigd; de daglogica en vertalingen blijven dezelfde bron gebruiken.
  2. De banner gebruikt role=note en aria-live=polite, zodat hulpsoftware de informatie duidelijk maar niet storend behandelt.
  3. De bestaande donkere kleuren en reduced-motionregels blijven gelden; alleen de marge rond de nieuwe positie is aangepast.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 De banner vóór Nu & straks tonen
Twig
<section class="day-picker" aria-label="Kies een dag">…</section>
<aside class="day-notice" id="badkledingNotice" role="note" aria-live="polite">…</aside>
<section class="moment-overview" aria-labelledby="momentOverviewTitle">…</section>

Wat doet dit?De bestaande badkledingbanner staat nu direct na de dagkeuze en vóór het overzicht Nu & straks.

Resultaat in de appGasten hoeven niet meer langs het programma en smartphonebeleid te scrollen om deze belangrijke daginformatie te vinden.

Wijziging 2 De bestaande inhoud in drie talen behouden
JSON
{
  "languages": ["nl", "fr", "en"],
  "content": ["icon", "title", "explanation"],
  "updatesWithSelectedDay": true
}

Wat doet dit?De verplaatsing verandert de bestaande taal- en dagkoppeling niet: titel en uitleg blijven de actieve taal en gekozen dag volgen.

Resultaat in de appDe banner blijft na iedere dag- of taalwissel de juiste, begrijpelijke informatie tonen.

Wijziging 3 De melding beleefd laten aankondigen
HTML
<aside class="day-notice" id="badkledingNotice" role="note" aria-live="polite">
    <span class="notice-icon" aria-hidden="true">…</span>
    <span class="day-notice-copy">…</span>
</aside>

Wat doet dit?De banner wordt als notitie aangeduid. De beleefde live-regio meldt bijgewerkte tekst zodra de gekozen dag verandert, terwijl het decoratieve icoon verborgen blijft voor hulpsoftware.

Resultaat in de appOok gasten die een schermlezer gebruiken krijgen de aangepaste badkledinginformatie tijdig en zonder storende onderbreking.

Wijziging 4 De nieuwe positie rustig laten aansluiten
JSON
{
  "placement": "direct na de dagkiezer",
  "spacing": "aangepast voor ademruimte",
  "darkMode": "behouden",
  "reducedMotion": "behouden"
}

Wat doet dit?De ruimte rond de banner wordt afgestemd op haar plek onder de dagkiezer. De bestaande voorkeur voor minder beweging blijft gerespecteerd; de donkere kleurregels blijven ongewijzigd van toepassing.

Resultaat in de appDe banner oogt luchtig op haar nieuwe plaats en blijft comfortabel in donkere weergave en voor gasten die minder beweging verkiezen.

4 wijzigingen

  • De banner staat waar je hem nodig hebt: onmiddellijk na de dagkiezer en vóór Nu & straks zie je of de gekozen dag een badkledingdag is, precies in dezelfde logische volgorde als in de interne app.
  • De vertrouwde duidelijke inhoud blijft behouden: het icoon, de titel en de uitleg veranderen automatisch mee bij een dagwissel en verschijnen in Nederlands, Frans of Engels.
  • De melding is beter toegankelijk: de banner is nu een herkenbare notitie en wijzigingen worden beleefd aangekondigd, zonder een schermlezer onnodig te onderbreken.
  • De verplaatste banner houdt voldoende ademruimte: de marge is afgestemd op de nieuwe plek, terwijl donkere weergave en de voorkeur voor minder beweging volledig behouden blijven.
v1.1.114 Elke dag toont dezelfde heldere details
Probleem / foutmelding

De eerste drie dagen en de latere dagen van de dagkiezer toonden niet altijd dezelfde details. Daardoor konden badkleding en speciale events zoals Sauna Herbal Cup op dagen vier tot en met zeven ontbreken. Tegelijk konden te veel losse vermeldingen de kleine dagknoppen onrustig maken en waren korte planninglabels nog niet overal beschikbaar in de gekozen taal.

Oplossing

Alle zeven dagen gebruiken nu dezelfde compacte detailweergave. Per dag staan maximaal twee rustige regels met voorrang voor badkleding en speciale events, daarna een concrete planningstatus en, wanneer er nog plaats is, Klankbeleving met de naam. De volledige dagcontext blijft toegankelijk. De nieuwe korte labels worden automatisch vertaald in Nederlands, Frans en Engels.

Technisch

Beide rijen roepen dezelfde dagdetailweergave aan. Die telt de zichtbare regels en stopt na twee, terwijl de volledige dagbeschrijving afzonderlijk wordt samengesteld uit datum, badkleding, event, planningstatus en klankbeleving. Vertalingen worden bij elke taal- of dagwissel opnieuw toegepast.

Technische stappen
  1. De bovenste rij en de rij met latere dagen gebruiken dezelfde detailweergave, waardoor een event niet langer afhankelijk is van de positie van de dag.
  2. Een vaste prioriteit beperkt de zichtbare details tot twee regels zonder beschikbare informatie uit de toegankelijke dagbeschrijving te verwijderen.
  3. De korte planning- en klanklabels gebruiken dezelfde vertaallaag als de rest van de gastenapp.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Eén detailweergave voor alle zeven dagen
Twig
{% for day in schedule.days|slice(0, 3) %}
    {{ dayUi.dayDetails(day) }}
{% endfor %}
{% for day in schedule.days|slice(3, 4) %}
    {{ dayUi.dayDetails(day) }}
{% endfor %}

Wat doet dit?Zowel de bovenste drie dagen als de vier latere dagen gebruiken dezelfde opbouw voor badkleding, events, planning en klankbeleving.

Resultaat in de appSauna Herbal Cup en andere speciale informatie verschijnen voortaan ook correct op dagen vier tot en met zeven.

Wijziging 2 Een concrete planningstatus binnen twee regels kiezen
Twig
{% if day.planningStatus|default('confirmed') == 'provisional' and visibleDetails < 2 %}
    {% if day.planningReason|default('') == 'open_sessions' %}
        <small data-day-open-count="{{ day.openSessionCount|default(1) }}">{{ day.openSessionCount|default(1) == 1 ? '1 naam volgt' : day.openSessionCount ~ ' namen volgen' }}</small>
    {% elseif day.planningReason == 'extra_planning_missing' %}
        <small data-i18n="extraPlanningFollowsShort">Extra planning volgt</small>
    {% endif %}
{% elseif day.hasExtraSessions and visibleDetails < 2 %}
    <small data-i18n="extraSessionsLegend">Extra sessies</small>
{% endif %}

Wat doet dit?De dagkiezer kiest een korte tekst die past bij de echte planningsituatie en toont die alleen wanneer één van de twee detailregels nog vrij is.

Resultaat in de appGasten begrijpen sneller of alleen een naam, de extra planning of extra sessies worden verwacht.

Wijziging 3 Klankbeleving visueel doseren en volledig toegankelijk houden
JavaScript
var soundBadge = button.querySelector('[data-day-sound-host]');
if (soundBadge) {
    soundBadge.textContent = replace(text('daySoundWith'), { host: soundBadge.dataset.daySoundHost || '' });
}
if (day.isBadkleding) ariaParts.push(text('swimwearDay'));
if (eventTitle) ariaParts.push(text('eventLabel') + ': ' + eventTitle);
if (day.soundHealer) ariaParts.push(replace(text('daySoundWith'), { host: day.soundHealer }));
button.setAttribute('aria-label', ariaParts.join('. '));

Wat doet dit?De zichtbare klankregel wordt alleen bijgewerkt als zij in de compacte dagknop aanwezig is. De toegankelijke beschrijving verzamelt onafhankelijk daarvan alle beschikbare context.

Resultaat in de appDe knop blijft visueel rustig, terwijl schermlezers badkleding, event, planning en klankbeleving volledig kunnen aankondigen.

Wijziging 4 Korte daglabels in drie talen aanbieden
JavaScript
Object.assign(copy.nl, { openAssignmentsShortOne: '1 naam volgt', extraPlanningFollowsShort: 'Extra planning volgt', daySoundWith: 'Klankbeleving · {host}' });
Object.assign(copy.fr, { openAssignmentsShortOne: '1 nom à venir', extraPlanningFollowsShort: 'Planning extra à venir', daySoundWith: 'Bain sonore · {host}' });
Object.assign(copy.en, { openAssignmentsShortOne: '1 name to follow', extraPlanningFollowsShort: 'Extra planning to follow', daySoundWith: 'Sound healing · {host}' });

Wat doet dit?De nieuwe compacte teksten hebben voor elke ondersteunde taal een eigen duidelijke formulering.

Resultaat in de appDe dagkiezer blijft begrijpelijk wanneer een gast wisselt tussen Nederlands, Frans en Engels.

4 wijzigingen

  • Alle zeven dagen tonen dezelfde details: badkleding en speciale events zoals Sauna Herbal Cup verschijnen nu in beide rijen van de dagkiezer. Daarmee is de fout opgelost waardoor events op dagen vier tot en met zeven ontbraken.
  • De planningstatus is kort en concreet: je ziet bijvoorbeeld 1 naam volgt, meerdere namen volgen, Extra planning volgt of Extra sessies, zonder dat de dagknop meer dan twee zichtbare detailregels krijgt.
  • Klankbeleving verschijnt wanneer er plaats is: als één van de twee regels nog vrij is, toont de dag de klankbeleving en naam. De volledige context blijft ook beschikbaar voor schermlezers.
  • Nieuwe korte labels volgen je taalkeuze: planningstatus en Klankbeleving worden correct weergegeven in Nederlands, Frans en Engels.
v1.1.113 Sound healing helder bevestigd wanneer de naam nog volgt
Probleem / foutmelding

Wanneer bij precies één sessie alleen de naam ontbrak, bleef de publieke melding te algemeen. Gasten zagen daardoor niet meteen om welke beleving het ging en konden onnodig twijfelen of uur, locatie of prijs nog zouden veranderen. Interne roosterinformatie hoort daarbij niet in de gastenapp thuis.

Oplossing

De gastenapp noemt bij één open plaats nu concreet Sound healing om 18:00 in Shou Sugi Ban. De tekst stelt gerust dat de sessie doorgaat, alleen de naam van de sound healer later volgt en uur, locatie en prijs van €10 vaststaan. Dezelfde gerichte melding verschijnt wanneer een andere dag via de kalender wordt gekozen en volgt de ingestelde taal in Nederlands, Frans of Engels, zonder tabblad-, rij- of celgegevens te tonen.

Technisch

De gastenapp maakt voor precies één open sessie een specifieke tekst van sessietype, tijd, locatie, rol en eventuele prijs. De publieke daggegevens bevatten geen interne bronmetadata. Bij iedere kalenderwissel wordt de melding opnieuw gesynchroniseerd via dezelfde NL-, FR- en EN-vertalingen.

Technische stappen
  1. De publieke melding gebruikt alleen de praktische open-sessiegegevens die gasten nodig hebben.
  2. Bij precies één open sessie bouwt de app een specifieke melding; bij meerdere open namen blijft de bestaande meervoudstekst beschikbaar.
  3. De kalender ververst dezelfde melding vanuit de gekozen dag en gebruikt daarvoor de bestaande vertaallaag.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 De sound healing met alle vaste gegevens bevestigen
JavaScript
return {
    heading: text('openSoundAssignmentLabel'),
    body: replace(text('openSoundAssignmentExact'), {
        time: '18:00',
        room: 'Shou Sugi Ban',
        price: replace(text('openAssignmentPrice'), { price: '€10' })
    })
};

Wat doet dit?Voor één open sound-healingplaats gebruikt de app het echte uur, de echte locatie en de prijs in plaats van een algemene melding.

Resultaat in de appGasten weten dat Sound healing om 18:00 in Shou Sugi Ban doorgaat, €10 kost en alleen nog op de naam van de sound healer wacht.

Wijziging 2 Alleen publieksgegevens met de gastenapp delen
JSON
{
  "sessionType": "Sound healing",
  "time": "18u00",
  "room": "Shou Sugi Ban",
  "role": "Sound healer",
  "price": "€10"
}

Wat doet dit?De publieke sessie bevat alleen informatie die een gast nodig heeft. Interne tabblad-, rij-, cel- en bewerkingsgegevens maken geen deel uit van deze weergave.

Resultaat in de appDe melding is concreet zonder interne Google Spreadsheet-informatie prijs te geven.

Wijziging 3 Kalenderkeuze en taal dezelfde precieze melding laten gebruiken
JavaScript
function syncPlanningNotice(element, day) {
    var exactNotice = exactOpenSessionNotice(day);
    if (exactNotice) {
        element.querySelector('strong').textContent = exactNotice.heading;
        element.querySelector('span').textContent = exactNotice.body;
    }
}

Object.assign(copy.nl, { openSoundAssignmentLabel: 'Sound healing gaat door' });
Object.assign(copy.fr, { openSoundAssignmentLabel: 'Bain sonore maintenu' });
Object.assign(copy.en, { openSoundAssignmentLabel: 'Sound healing confirmed' });

Wat doet dit?Na iedere dagkeuze ververst de kalender de melding met de gegevens van die dag; de actieve taal levert de passende titel en uitleg.

Resultaat in de appDe concrete bevestiging blijft correct bij kalendernavigatie en in Nederlands, Frans en Engels.

3 wijzigingen

  • De concrete sound healing wordt bij naam genoemd: bij één ontbrekende naam staat nu Sound healing om 18:00 in Shou Sugi Ban, met de geruststelling dat de sessie doorgaat en ook de prijs van €10 vaststaat.
  • Interne roosterdetails blijven privé: gasten zien alleen wat zij nodig hebben over de beleving; Google Spreadsheet-tabbladen, rijen, cellen en bewerkingslinks worden niet publiek getoond.
  • De gerichte melding volgt kalender en taal: kies je een andere dag, dan wordt de tekst opnieuw opgebouwd en verschijnt zij correct in Nederlands, Frans of Engels.
v1.1.112 Rustige en duidelijke melding voor programma in voorbereiding
Probleem / foutmelding

De gastenapp gebruikte bij een nog wijzigbaar programma woorden zoals manager en extra planning, terwijl die interne werkwijze voor gasten niet relevant is. Een dag waarop alleen een naam ontbrak kon bovendien dezelfde voorlopige indruk krijgen als een dag waarop ook uren of locaties nog konden wijzigen. Bij twee sessies op hetzelfde uur kon de 14:00-opgieting in The Barn verdwijnen naast de 14:00-scrub in het Stoombad.

Oplossing

De publieke app noemt dit een voorlopige indruk: het definitieve programma wordt nog bevestigd, namen, uren en locaties kunnen wijzigen en gasten bekijken de dag best later opnieuw. Wanneer uitsluitend namen ontbreken, staat er Naam volgt en blijven uur en locatie bevestigd. De kalender markeert alleen werkelijk wijzigbare planning. Gelijktijdige sessies worden per uur én ruimte onderscheiden. ROTS-slots gelden niet als ontbrekende individuele toewijzing en alle teksten zijn beschikbaar in NL, FR en EN.

Technisch

De gastenapp presenteert open_sessions als een programma waarvan alleen de naam ontbreekt, terwijl andere voorlopige redenen een werkelijk wijzigbare planning aanduiden. ROTS wordt niet als ontbrekende persoonsrol geteld. De kalender en sessieregels volgen hetzelfde onderscheid en de sessielijst ontdubbelt uitsluitend op dezelfde combinatie van uur en ruimte.

Technische stappen
  1. De publieke tekst wordt gekozen op basis van de reden achter de dagstatus, niet alleen op basis van het algemene woord voorlopig.
  2. Open sessies krijgen een aparte Naam volgt-presentatie en daardoor geen opmaak of kalendermarker voor een werkelijk wijzigbare planning.
  3. Dezelfde voorwaarden gelden in de dagknoppen, tijdlijn, kalender en toegankelijke beschrijving.
  4. ROTS-slots tellen niet als ontbrekende individuele toewijzing.
  5. Bij het samenvoegen van sessies vormt uur plus ruimte de dubbele-controle.
Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 Publieke uitleg zonder interne planningstermen tonen
JavaScript
provisionalPlanningLabel: 'Programma in voorbereiding',
provisionalPlanningShort: 'In voorbereiding',
provisionalPlanningText: 'Je ziet alvast een voorlopige indruk van deze dag. Het definitieve programma wordt nog bevestigd; namen, uren en locaties kunnen nog wijzigen. Bekijk deze dag later opnieuw.'

Wat doet dit?De Nederlandse publiekstekst beschrijft alleen wat de gast moet weten: dit is een eerste indruk, de definitieve inhoud volgt nog en later controleren is verstandig.

Resultaat in de appGasten begrijpen rustig dat het zichtbare programma nog kan afwijken zonder interne planningstermen te moeten kennen.

Wijziging 2 Een ontbrekende naam als bevestigde open plaats tonen
Twig
{% set sessionIsProvisional = session.planningStatus|default('confirmed') == 'provisional' and session.planningReason|default('') != 'open_sessions' %}
<small data-i18n="{{ day.planningReason|default('') == 'open_sessions' ? 'openAssignmentsShort' : 'provisionalPlanningShort' }}">
  {{ day.planningReason|default('') == 'open_sessions' ? 'Naam volgt' : 'In voorbereiding' }}
</small>

Wat doet dit?De tijdlijn krijgt alleen voorlopige opmaak wanneer meer dan een naam kan wijzigen. Een gewone open rol gebruikt haar eigen korte status.

Resultaat in de appNaam volgt wekt geen indruk meer dat uur of locatie onzeker is.

Wijziging 3 De voorlopige kalendermarker beperken tot wijzigbare planning
JavaScript
if (day && day.planningStatus === 'provisional' && day.planningReason !== 'open_sessions') {
    var provisionalMarker = document.createElement('i');
    provisionalMarker.className = 'marker-provisional';
    provisionalMarker.title = text('provisionalPlanningLabel');
    markers.appendChild(provisionalMarker);
}

Wat doet dit?De kalender controleert naast de status ook waarom een dag nog aandacht vraagt. Alleen een echt wijzigbare dag krijgt de voorlopige stip.

Resultaat in de appDe kalender maakt zichtbaar onderscheid tussen een programma in voorbereiding en een bevestigd programma waarvan alleen de naam volgt.

Wijziging 4 Voorbereiding en ontbrekende namen in drie talen benoemen
JavaScript
Object.assign(copy.nl, { provisionalPlanningLabel: 'Programma in voorbereiding', openAssignmentsShort: 'Naam volgt' });
Object.assign(copy.fr, { provisionalPlanningLabel: 'Programme en préparation', openAssignmentsShort: 'Nom à venir' });
Object.assign(copy.en, { provisionalPlanningLabel: 'Programme in preparation', openAssignmentsShort: 'Name to follow' });

Wat doet dit?Titel en korte naamstatus hebben voor elke beschikbare taal een eigen publieksgerichte vertaling.

Resultaat in de appNederlandstalige, Franstalige en Engelstalige gasten krijgen dezelfde duidelijke betekenis.

Wijziging 5 Sessies op hetzelfde uur per ruimte bewaren
PHP
$existingByTimeRoom = [];
foreach ($rawSessions[$iso] as $entry) {
    $time = trim((string)($entry['time'] ?? ''));
    $room = guestRoomLabel((string)($entry['room'] ?? ''));
    if ($time !== '' && $room !== '') $existingByTimeRoom[$time . '|' . $room] = true;
}
if (isset($existingByTimeRoom[$time . '|' . $room])) continue;

Wat doet dit?De gastenplanning beschouwt een sessie pas als dubbel wanneer zowel het startuur als de ruimte overeenkomen.

Resultaat in de appDe 14:00-opgieting in The Barn en de 14:00-scrub in het Stoombad blijven allebei in de app staan.

5 wijzigingen

  • De melding gebruikt rustige taal voor gasten: Programma in voorbereiding zegt dat je een voorlopige indruk ziet, het definitieve programma nog wordt bevestigd, namen, uren en locaties kunnen wijzigen en je deze dag later best opnieuw bekijkt.
  • Naam volgt is niet langer hetzelfde als voorlopig: als alleen een begeleidersnaam ontbreekt, zie je Naam volgt en lees je dat uur en locatie vaststaan.
  • De kalender markeert alleen echt wijzigbare dagen: een voorlopige stip verschijnt niet meer wanneer het programma vaststaat en uitsluitend de naam nog volgt.
  • Alle meldingen volgen de gekozen taal: Nederlands, Frans en Engels hebben elk hun eigen heldere titel, uitleg en korte status.
  • Gelijktijdige sessies blijven afzonderlijk zichtbaar: de opgieting van 14:00 in The Barn verdwijnt niet meer naast de scrub van 14:00 in het Stoombad, omdat uur en locatie samen worden vergeleken.
v1.1.111 Sound healing blijft bevestigd terwijl de naam volgt
Probleem / foutmelding

Wanneer de SOUND-cel leeg was of alleen streepjes bevatte, kon de gewone klankbeleving uit het programma verdwijnen. Zo ontbrak ook 25 oktober, hoewel het uur, de ruimte en de prijs vaststonden en alleen de sound healer nog niet was toegewezen. De algemene voorlopige tekst liet bovendien ruimte voor twijfel over uur en locatie.

Oplossing

De vaste sound healing blijft om 18:00 in Shou Sugi Ban voor €10 zichtbaar. Zolang de naam ontbreekt, zie je een uurglas in plaats van een verzonnen naam of foto, met de tekst Sound healing gaat door en Sound healer wordt later bekendgemaakt. Alleen bij werkelijk veranderlijke planning blijven uur en locatie voorlopig; bij een open rol staat nu dat zij vaststaan. De TV toont dezelfde boodschap in NL, FR en EN.

Technisch

De planning herkent een lege of alleen uit tekens bestaande SOUND-cel als een echte sessie met een nog open rol. De standaard wordt uitsluitend toegevoegd als geen benoemde sound healer en geen autoritair event-, thema- of extra programma bestaat.

Technische stappen
  1. Ook een cel met uitsluitend leestekens wordt als een lege naam behandeld.
  2. De standaardsessie bewaart 18:00, Shou Sugi Ban en €10, maar geen hostnaam of profielfoto.
  3. De dagstatus maakt onderscheid tussen alleen een open rol en een planning waarin meer gegevens nog kunnen wijzigen.
  4. Dezelfde sessiestatus voedt de mobiele gastenapp en de TV-weergave.
Voorbeeldcode per wijziging6 voorbeelden
Wijziging 1 De vaste klankbeleving bewaren zonder een persoon te verzinnen
PHP
$isUnassigned = $name === ''
    || preg_match('/^[\p{P}\p{S}\s]+$/u', $name) === 1;

$rawSessions[$iso][] = [
    'time' => '18u00',
    'room' => 'Shou Sugi Ban',
    'description' => 'Sound healing',
    'price' => '€10',
    'host' => '',
];

Wat doet dit?Een lege cel en een cel met alleen streepjes worden als een open naam gelezen. De sessie houdt haar echte praktische gegevens, terwijl de host leeg blijft.

Resultaat in de appOok op 25 oktober zie je de correcte klankbeleving zonder foutieve naam of profielfoto.

Wijziging 2 Vertellen dat de sound healing doorgaat en de naam later volgt
Twig
{% set sessionIsUnassignedSound = session.isUnassigned and session.type == 'sound' and not session.liveWith %}
<b>{{ sessionIsUnassignedSound ? 'Sound healing gaat door' : 'Sessie gaat door' }}</b>
<span>{{ sessionIsUnassignedSound ? 'Sound healer wordt later bekendgemaakt' : session.host }}</span>

Wat doet dit?De gastenregel herkent een open sound healing afzonderlijk en gebruikt daarvoor een precieze bevestiging en roltekst.

Resultaat in de appJe weet dat de sessie vaststaat en hoeft alleen nog op de naam van de sound healer te wachten.

Wijziging 3 Bij een open rol bevestigen dat de praktische gegevens vaststaan
JavaScript
if (day.planningReason === 'open_sessions') {
    var count = Math.max(1, Number(day.openSessionCount) || 1);
    heading.textContent = text('openAssignmentsLabel');
    body.textContent = count === 1
        ? text('openAssignmentsOne')
        : replace(text('openAssignmentsMany'), { count: count });
    return;
}

Wat doet dit?De melding kiest aparte tekst wanneer de planning alleen nog namen mist. De vertaling legt dan uit dat tijd en locatie bevestigd zijn.

Resultaat in de appJe krijgt geen onnodige twijfel over een uur of ruimte die al vastligt.

Wijziging 4 Voor ieder soort open sessie de juiste bevestiging kiezen
JavaScript
function unassignedSessionTitle(data) {
    if (isSoundData(data)) return 'Sound healing gaat door';
    if (isScrubData(data)) return 'Scrubsessie gaat door';
    return 'Opgietsessie gaat door';
}
function unassignedPersonLabel(data) {
    return isSoundData(data)
        ? 'Sound healer wordt later bekendgemaakt'
        : 'Opgieter/opgietster wordt later bekendgemaakt';
}

Wat doet dit?De titel en open vakrol worden afgeleid van het werkelijke sessietype.

Resultaat in de appSound healing, scrub en opgieting krijgen geen vage algemene begeleiderstekst meer.

Wijziging 5 De open TV-status in drie talen en met een uurglas tonen
JavaScript
Object.assign(words.nl,{unassignedSound:'Gaat door · naam volgt'});
Object.assign(words.fr,{unassignedSound:'Confirmé · nom à venir'});
Object.assign(words.en,{unassignedSound:'Confirmed · name to follow'});

var fallbackLabel = session.isUnassigned ? '⌛' : (fallbackName || hostName(session));

Wat doet dit?De schermtaal bepaalt de korte bevestiging. Voor een nog onbezet profiel verschijnt een uurglas in plaats van een foto of letter.

Resultaat in de appOok op TV is zonder misverstand zichtbaar dat de sessie doorgaat en de naam later wordt ingevuld.

Wijziging 6 Events, thema's en extra planning voorrang geven
PHP
if (
    empty($rawSessions[$iso])
    || !isset($soundSlotDates[$iso])
    || isset($soundByDate[$iso])
    || isset($themeByDate[$iso])
    || isset($planningEventsByDate[$iso])
    || isset($extraAssignedDates[$iso])
) continue;

Wat doet dit?De gewone standaardsessie wordt niet toegevoegd wanneer de dag al een benoemde sound healer, thema, event of toegewezen extra planning heeft.

Resultaat in de appHet echte bijzondere programma blijft leidend en wordt nooit stilzwijgend overschreven.

6 wijzigingen

  • De gewone sound healing blijft altijd herkenbaar staan: een lege SOUND-cel of alleen streepjes levert nog steeds de echte sessie van 18:00 in Shou Sugi Ban voor €10 op. Daardoor is ook 25 oktober hersteld, zonder fictieve naam of foto.
  • Je ziet eerlijk dat alleen de naam nog volgt: het uurglas staat naast Sound healing gaat door en Sound healer wordt later bekendgemaakt.
  • De programmawaarschuwing zegt nu wat al zeker is: als alleen de begeleider ontbreekt, lees je dat het uur en de locatie vaststaan in plaats van dat alles nog kan wijzigen.
  • Andere open sessies benoemen de juiste rol: bij een opgieting of scrub zie je dat die sessie doorgaat en dat de opgieter/opgietster later wordt bekendgemaakt.
  • Ook de TV houdt de boodschap kort en duidelijk: Gaat door · naam volgt verschijnt met een uurglas en wordt passend vertaald naar Frans en Engels.
  • Bijzondere dagen behouden hun echte programma: een event, themadag of toegewezen extra planning wordt nooit vervangen door de gewone sound-healingstandaard.
v1.1.110 Zie tot een uur vooraf wat er straks begint
Probleem / foutmelding

Terwijl een beleving bezig was, was de volgende keuze soms te laat of te weinig opvallend. Bij twee sessies op hetzelfde uur moesten gasten bovendien beide locaties kunnen zien. Een vroege melding mocht niet ten onrechte suggereren dat de voorbereiding al bezig was.

Oplossing

De gastenapp toont naast een live beleving tot een uur vooraf de volgende sessie of alle sessies die tegelijk starten. De TV doet dat in de onderste informatiebalk en het dagschema en geeft de volgende start binnen het uur voorrang op een net afgeronde sessie. Eerst zie je een aftelling; voorbereiding volgt pas vanaf 30 minuten voor de start. De lopende sessie blijft live zichtbaar en het hersteladvies blijft beschikbaar.

Technisch

App en TV zoeken de eerste toekomstige start en tonen alle sessies van dat tijdstip. De aankondiging en de werkelijke voorbereiding hebben verschillende tijdsgrenzen, zodat de status van een lopende of afgeronde sessie correct blijft.

Technische stappen
  1. De eerstvolgende starttijd bepaalt de vooruitblik en bundelt alle sessies met datzelfde uur.
  2. De aankondiging begint maximaal 60 minuten vooraf en het label voorbereiding pas vanaf 30 minuten vooraf.
  3. Een live sessie blijft het hoofdonderwerp zolang zij bezig is; de volgende keuzes staan apart.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 De volgende beleving tijdens live tonen
JavaScript
if (!primary || day.iso !== data.todayIso || !isSessionLive(primary)) {
    preview.hidden = true;
    return;
}
var next = day.sessions.find(function (session) {
    var minutes = minutesUntil(session.startsAt);
    return minutes > 0 && minutes <= 60;
});

Wat doet dit?De live beleving blijft centraal staan en een apart blok verschijnt zodra de volgende sessie binnen het uur begint.

Resultaat in de appJe weet tijdig wat er straks volgt, zonder dat de lopende sessie uit beeld verdwijnt.

Wijziging 2 Gelijktijdige starts als één groep met eigen locaties tonen
JavaScript
var group = concurrentSessions(day, next);
group.forEach(function (session) {
    var copy = document.createElement('span');
    copy.appendChild(Object.assign(document.createElement('strong'), { textContent: localizedSession(session).title }));
    copy.appendChild(Object.assign(document.createElement('small'), {
        textContent: session.room + ' · ' + sessionHost(session)
    }));
});

Wat doet dit?Alle sessies met het eerstvolgende startuur worden samen aangekondigd, elk met hun eigen titel en locatie.

Resultaat in de appJe ziet meteen welke keuzes op hetzelfde moment beginnen en waar je voor elke sessie moet zijn.

Wijziging 3 Naderende keuzes op TV voorrang geven
JavaScript
var nextSessions = nextAnnouncementSessions(state);
if (nextSessions.length) {
    nextTitle = nextSessions.map(function (session) {
        return translated(session).title + ' · ' + sessionRoomLabel(session);
    }).join('  |  ');
} else if (state.afterglow) {
    nextTitle = afterglowMessage(state.featured);
}

Wat doet dit?De TV gebruikt de onderste informatiebalk en het dagschema voor de volgende start binnen het uur. Is er nog niets nabij, dan kan de nazorgboodschap op de voorgrond blijven.

Resultaat in de appDe volgende sessies vallen ook op een groot scherm tijdig op, zonder de nazorg te verliezen.

Wijziging 4 Vroege aftelling pas later voorbereiding noemen
JavaScript
if (minutes <= -(duration + 15)) return 'finished';
if (minutes <= -duration) return 'afterglow';
if (minutes <= 0) return 'live';
if (minutes <= 5) return 'imminent';
if (minutes <= 15) return 'soon';
if (minutes <= 30) return 'preparing';
if (minutes <= 60) return 'announced';

Wat doet dit?Van 60 tot 31 minuten voor de start krijg je een aankondiging met aftelling. Voorbereiding begint als label pas in het laatste halfuur, zonder live of herstel te veranderen.

Resultaat in de appDe tekst wekt geen te vroege indruk dat de sessie al wordt voorbereid.

4 wijzigingen

  • Zie tijdens een live sessie al wat er straks begint: de gastenapp kondigt de eerstvolgende beleving tot 60 minuten vooraf in een apart blok aan.
  • Kies bewust tussen gelijktijdige sessies: beginnen er meerdere op hetzelfde uur, dan zie je ze samen met de juiste ruimte of locatie bij elke keuze.
  • De TV kondigt de volgende start op twee plaatsen aan: de onderste informatiebalk en het dagschema tonen de naderende sessies en laten ze binnen het uur voorgaan op een net afgeronde sessie.
  • De status vertelt precies wat er gebeurt: tussen 60 en 31 minuten voor de start staat een aftelling; vanaf 30 minuten kan voorbereiding verschijnen. Een lopende sessie blijft live en na afloop blijft ruimte voor herstel.
v1.1.109 Klankbeleving geprijsd en volgende sessies vooraan
Probleem / foutmelding

De gewone klankbeleving van 18:00 verscheen zonder prijs. Als een opgietsessie net was afgelopen, bleef die bovendien bovenaan staan terwijl twee nieuwe sessies tegelijk naderden.

Oplossing

De vaste sound healing in Shou Sugi Ban toont €10 wanneer geen andere prijs of gratisvermelding in de planning staat. Bij bijzondere events geldt uitsluitend hun eigen informatie. Het hoofdblok toont nu eerst een lopende sessie of anders de volgende sessies samen; het hersteladvies na een net afgelopen sessie blijft afzonderlijk zichtbaar.

Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Standaardprijs met ruimte voor afwijkingen
PHP
if (trim((string)$price) === '' && guestDefaultSoundPriceApplies($entry, $meta, $eventSession)) {
    $price = '€10';
}

Wat doet dit?Een bedrag wordt alleen aangevuld voor de gewone klankbeleving van 18:00, niet voor een speciaal event of als er al een andere prijs staat.

Resultaat in de appDe prijs staat bij de sessie én in de kalender zonder bijzondere programma's te veranderen.

Wijziging 2 Aankomende sessies krijgen voorrang
JavaScript
return active || upcoming || afterglow || null;

Wat doet dit?Een lopende sessie blijft eerst; daarna krijgen de volgende sessies voorrang op een net afgeronde sessie.

Resultaat in de appBij twee gelijktijdige volgende sessies ziet de gast meteen beide mogelijkheden, met nazorg apart in beeld.

2 wijzigingen

  • Prijs bij de dagelijkse sound healing: om 18:00 in Shou Sugi Ban staat €10 vermeld. Een expliciet ander tarief, gratisvermelding of speciaal event blijft gerespecteerd.
  • Volgende sessies samen vooraan: na een afgeronde opgiet zie je de twee komende sessies naast elkaar in het hoofdblok. Het advies om rustig af te koelen blijft zichtbaar.
v1.1.108 Kalenderdagen krijgen dezelfde tijdlijn als Vandaag
Probleem / foutmelding

Een via de kalender gekozen dag gebruikte kleinere, anders opgebouwde sessieregels dan dezelfde dag via Vandaag. De voorlopige status bleef in de kalender te kort aangeduid.

Oplossing

Kalenderdagen gebruiken de vertrouwde tijdlijn met uur, sessietype, naam, ruimte en beschikbare prijs- of capaciteitsgegevens. De sound-healerkaart blijft compact en bij voorlopige dagen staat de volledige uitleg over mogelijke wijzigingen.

Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Kalender en Vandaag dezelfde tijdlijn geven
JavaScript
row.className = 'timeline-row calendar-timeline-row';
row.appendChild(time); row.appendChild(marker); row.appendChild(details); row.appendChild(room);

Wat doet dit?De kalender gebruikt dezelfde visuele regelopbouw als het gewone dagprogramma en vult prijs of gastenmaximum in wanneer die gegevens bekend zijn.

Resultaat in de appEen kalenderdatum voelt niet langer als een andere, minder uitgebreide pagina.

Wijziging 2 Waarschuwen zolang de extra planning voorlopig is
JavaScript
provisionalNotice.hidden = day.planningStatus !== 'provisional';
renderFlyerCards(flyers, day.flyers);

Wat doet dit?De volledige toelichting verschijnt op een geselecteerde kalenderdag wanneer de manager de extra planning nog aanvult.

Resultaat in de appGasten kunnen het programma bekijken zonder de voorlopige namen of tijden voor definitief aan te zien.

2 wijzigingen

  • Hetzelfde sessieoverzicht via Kalender: de gekozen dag toont nu dezelfde rustige tijdlijn als Vandaag, met herkenbare profielfoto's of initialen, ruimte en praktische sessiegegevens.
  • Voorlopige planning volledig uitgelegd: bij dagen waarvan de extra planning nog wordt aangevuld, staat in de kalender dezelfde duidelijke waarschuwing als in het dagprogramma. Klankbeleving gebruikt ook daar de compacte profielkaart.
v1.1.107 Alleen echte sound healers krijgen een profielkaart
Probleem / foutmelding

De tijdelijke naam Wedstrijddeelnemers werd op wedstrijddagen als een aparte sound healer gepresenteerd.

Oplossing

De gastenapp maakt voor die tijdelijke naam geen profielkaart meer; de geplande wedstrijdsessies blijven zichtbaar.

Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Profielkaart pas bij een echte naam
PHP
if ($key === 'wedstrijddeelnemers') continue;

Wat doet dit?De app slaat de algemene placeholder over bij het opbouwen van sound-healerprofielen; de sessies in het programma blijven intact.

Resultaat in de appDe gastenapp toont geen misleidende klankbelevingskaart op wedstrijddagen.

1 wijziging

  • Geen fictief profiel bij de Herbal Cup: Wedstrijddeelnemers blijft een roosterplaceholder en verschijnt niet meer als sound healer met foto of initiaal.
v1.1.106 Klankbeleving met profiel en rustige eventreservatie
Probleem / foutmelding

Een grote klankfoto duwde het dagprogramma op smartphones ver naar beneden. De wedstrijdreservatie voor de Herbal Cup verscheen daarnaast ook op dagen zonder wedstrijd.

Oplossing

De klankbeleving toont nu alleen het profiel van de sound healer, de naam en een korte warme tekst. De grote extra foto is ook uit kalender- en sessiedetails verdwenen. De opvallende algemene wedstrijdbanner is verwijderd; alleen binnen het event van 26 en 27 september blijft een bescheiden reservatielink staan.

Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Compact profiel voor klankbeleving
Twig
{% if flyer.isSoundHealerVisual %}<img src="{{ flyer.profileUrl }}" alt=""><strong>{{ flyer.host }}</strong><p>Laat de klanken langzaam binnenkomen.</p>{% endif %}

Wat doet dit?De app gebruikt de bestaande profielfoto in plaats van een extra grote belevingsfoto en toont een passende korte tekst.

Resultaat in de appGasten herkennen de sound healer direct en kunnen het programma sneller lezen.

Wijziging 2 Eventreservatie op de juiste datum tonen
JSON
{"date":"2026-09-26","event":"Belgian Sauna Herbal Cup","reservation":"Bekijk reservaties"}

Wat doet dit?De reservatieverwijzing hoort bij de eventinformatie van de geselecteerde wedstrijddag en verschijnt niet meer op alle dagen.

Resultaat in de appHet gewone dagprogramma blijft rustig, terwijl gasten op de wedstrijddag de reservatie nog vinden.

2 wijzigingen

  • Maak kennis met de sound healer zonder een druk fotoblok: de profielfoto, naam en een korte uitnodiging staan compact bij de klankbeleving in dagprogramma, kalender en sessiedetail.
  • Herbal Cup-reservatie alleen op 26 en 27 september: geen grote banner meer op gewone dagen; bij het event staat een kleine link en blijft de uitleg over wedstrijdscrubs aan de receptie zichtbaar.
v1.1.105 Juiste namen en foto's terwijl de planning wordt aangevuld
Probleem / foutmelding

De extra planning voor maandag 21 september bevatte al open uren, maar nog geen enkele sessie met een toegewezen opgieter. Daardoor konden de namen en profielfoto's uit de gewone planning verdwijnen, ook al waren die nog de beste beschikbare informatie. Losse labels zoals Voorlopige sessie en de rol Begeleider maakten bovendien onvoldoende duidelijk wat nog moest worden ingevuld.

Oplossing

De gastenapp blijft nu de voorlopige namen en profielfoto's uit de gewone planning tonen totdat minstens één sessie in de extra planning werkelijk is toegewezen. Alleen het open uur uit die gewone planning blijft zonder naam. Boven de volledige dag staat Voorlopig dagprogramma met de uitleg dat de manager de extra planning nog aanvult en dat namen, uren en locaties kunnen wijzigen. Losse sessies heten niet langer Voorlopige sessie, opgietingen en scrubs gebruiken Opgieter/opgietster en de TV volgt dezelfde gegevens.

Technisch

Een extra dag met nul toegewezen sessies wordt behandeld als een planning die nog wordt aangevuld. Bestaande personen en foto's blijven uit de gewone planning komen; een open extra uur wordt alleen toegevoegd als dat uur nog niet in de gewone planning voorkomt. Zo blijft 17u30 open zonder een foutieve tweede sessie om 14u00. Een nieuwe programmabuffer voorkomt dat oude servercode vlak na publicatie de dag opnieuw overschrijft. De gastenapp en TV delen dezelfde dagstatus en sessiegegevens.

Technische stappen
  1. De extra planning vervangt de gewone dag pas zodra minstens één sessie een toegewezen persoon bevat.
  2. Een open extra uur dat nog niet in het gewone programma voorkomt blijft herkenbaar zonder verzonnen naam of profielfoto; op maandag 21 september is dat alleen 17u30.
  3. Een nieuwe generatie programmabuffer voorkomt dat kort na een update nog een oude dagindeling wordt teruggezet.
  4. De melding over wijzigingen wordt eenmaal op dagniveau getoond en niet meer als een herhaald sessielabel.
  5. Opgiet- en scrubregels delen dezelfde duidelijke rolbenaming; sound healing behoudt haar eigen rol.
  6. Gastenapp en TV krijgen dezelfde samengestelde daggegevens, zodat beide weergaven gelijk blijven.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 De gewone planning als veilige tijdelijke basis gebruiken
PHP
$extraHeeftToewijzing = count($toegewezenExtraSessies) > 0;

$zichtbareSessies = $extraHeeftToewijzing
    ? $extraPlanning
    : voegAlleenNieuweOpenUrenToe($gewonePlanning, $openExtraUren);

Wat doet dit?Zonder toegewezen sessie in de extra planning blijven de bestaande namen en profielfoto's uit de gewone planning zichtbaar. Een open extra uur wordt alleen toegevoegd als dat uur nog niet in het gewone programma voorkomt.

Resultaat in de appJe ziet op maandag 21 september opnieuw wie volgens de gewone planning aanwezig is, terwijl een open uur eerlijk open blijft.

Wijziging 2 Eén duidelijke melding boven het volledige dagprogramma plaatsen
Twig
{% if day.planningStatus == 'provisional' %}
  <aside class="extra-planning-notice" role="note">
    <strong>Voorlopig dagprogramma</strong>
    <span>Namen en foto's uit het gewone programma blijven voorlopig zichtbaar. Namen, uren en locaties kunnen nog wijzigen.</span>
  </aside>
{% endif %}

Wat doet dit?De aanvulmelding hoort bij de volledige dag en hoeft daarom niet meer als Voorlopige sessie bij iedere afzonderlijke rij terug te komen.

Resultaat in de appHet programma blijft rustig leesbaar en je begrijpt toch meteen dat enkele gegevens nog kunnen veranderen.

Wijziging 3 De verwachte vakrol per sessietype tonen
JSON
{
  "opgiet": "Opgieter/opgietster",
  "scrub": "Opgieter/opgietster",
  "sound": "Sound healer"
}

Wat doet dit?Opgiet- en scrubsessies krijgen dezelfde herkenbare vakbenaming. Alleen een ander sessietype, zoals sound healing, gebruikt zijn eigen passende rolnaam.

Resultaat in de appJe ziet niet langer het vage Begeleider, maar meteen welk soort sessiebegeleiding je mag verwachten.

Wijziging 4 Gastenapp en TV uit dezelfde gecorrigeerde planning voeden
JSON
{
  "planningStatus": "provisional",
  "statusLabel": "Voorlopig dagprogramma",
  "sessions": [
    { "host": "Naam uit gewone planning", "hostPhotos": ["profiel.jpg"] },
    { "host": null, "isOpenHour": true }
  ]
}

Wat doet dit?De TV krijgt dezelfde status, namen, profielfoto's en open uren als de gastenapp. Er wordt dus geen afzonderlijke schermversie van een nog onvolledige extra planning gemaakt.

Resultaat in de appDe naam en foto die je in de app ziet, staan ook correct op het TV-scherm.

4 wijzigingen

  • De planning voor maandag 21 september toont opnieuw de juiste namen en profielfoto's: zolang nog niemand in de extra planning is toegewezen, blijven de gegevens uit de gewone planning zichtbaar. Alleen een werkelijk open uur blijft zonder naam.
  • Voorlopig dagprogramma staat eenmaal boven de hele dag: de melding zegt dat de getoonde namen en foto's uit het gewone programma komen en nog kunnen wijzigen, zonder iedere sessie apart voorlopig te noemen.
  • Opgietingen en scrubs spreken over Opgieter/opgietster: de algemene benaming Begeleider is vervangen, zodat je direct weet welke rol bij de sessie hoort.
  • De TV toont precies dezelfde gecorrigeerde informatie: namen, foto's, open uren, rolbenamingen en de melding over de aangevulde planning lopen gelijk met de gastenapp.
v1.1.104 Opgieter en sound healer duidelijk naast elkaar op TV
Probleem / foutmelding

Bij een opgieting met live sound healing stonden twee begeleiders samen in beeld zonder voldoende duidelijk verschil in functie. Daardoor konden gasten denken dat beide personen opgieter waren, en de kleinere portretten maakten de herkenning op afstand moeilijker.

Oplossing

De TV presenteert de samenwerking nu als twee duidelijke rollen: opgieter en sound healer. Op de grote focuskaart krijgt iedere rol een veel groter eigen portret, naam en kleuraccent. Het dagschema toont beide rollen en namen compact bij dezelfde sessie. Alle rolbenamingen volgen automatisch Nederlands, Frans of Engels.

Technisch

Dezelfde rolverdeling stuurt nu zowel de grote focuskaart als de compacte programmaregel aan. Daardoor blijven foto, naam, kleuraccent en vertaalde functie bij de juiste begeleider, ongeacht schermformaat of taal.

Technische stappen
  1. Een live samenwerking wordt opgesplitst in twee rolblokken die ieder hun eigen naam en fotolijst behouden.
  2. Op grote liggende schermen worden de portretten in de focuskaart tussen 84 en 128 pixels groot, afhankelijk van de beschikbare ruimte.
  3. De opgietrol krijgt een warm goud label; de soundrol gebruikt mint voor het label en portretkader.
  4. In het dagprogramma worden beide rollen naast elkaar of onder elkaar geplaatst volgens de beschikbare breedte. De volledige rol-naamtekst blijft bewaard.
  5. Nederlandse, Franse en Engelse schermen gebruiken ieder hun eigen benaming voor de opgietrol.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 De twee begeleiders hun echte rol geven
JavaScript
if (sessie.liveWith) {
  return [
    { rol: 'opgieter', label: tekst('roleAufguss'), naam: sessie.host, foto's: sessie.opgieterPhotos },
    { rol: 'sound', label: tekst('roleSound'), naam: sessie.liveWith, foto's: sessie.liveWithPhotos }
  ];
}

Wat doet dit?De TV maakt voor een gecombineerde sessie twee aparte blokken. Elk blok krijgt de juiste functienaam, persoon en eigen foto in plaats van één gemengde groep.

Resultaat in de appJe ziet zonder twijfel wie de opgieting geeft en wie de sound healing begeleidt.

Wijziging 2 Portretten groter maken en rollen met kleur onderscheiden
CSS
.focus-role-label { color: #f0d57f; }
.focus-role.is-sound .focus-role-label { color: #a9dbc8; }
.focus-role .is-sound-role .screen-avatar-person {
  border-color: #a9dbc8;
}
.focus-card.has-live-collaboration .screen-avatars.is-large .screen-avatar-person {
  width: clamp(84px, 6.6vw, 128px);
  height: clamp(84px, 6.6vw, 128px);
}

Wat doet dit?De focuskaart schaalt ieder portret veel groter op een breed TV-scherm. Goud markeert de opgietrol en mint markeert de soundrol via label en kader.

Resultaat in de appDe begeleiders en hun verschillende functie zijn ook vanop grotere afstand snel herkenbaar.

Wijziging 3 Beide rollen en namen compact in het dagschema bewaren
JavaScript
rollen.forEach(function (rol) {
  const regel = document.createElement('span');
  regel.className = 'upcoming-role is-' + rol.kind;
  regel.appendChild(Object.assign(document.createElement('b'), { textContent: rol.label }));
  regel.appendChild(Object.assign(document.createElement('span'), { textContent: rol.name }));
  rollenblok.appendChild(regel);
});
rollenblok.title = rollen.map(rol => rol.label + ' ' + rol.name).join(' · ');

Wat doet dit?De programmaregel bouwt voor beide begeleiders een eigen compacte regel met functie en naam. De volledige combinatie blijft als aanvullende tekst aan het blok gekoppeld.

Resultaat in de appIn het dagprogramma blijft voor de gezamenlijke sessie alle belangrijke rol- en naaminformatie aanwezig.

Wijziging 4 Opgiet- en soundrollen meertalig benoemen
JSON
{
  "nl": { "opgiet": "Opgieter", "sound": "Sound healer" },
  "fr": { "opgiet": "Maître de sauna", "sound": "Sound healer" },
  "en": { "opgiet": "Sauna host", "sound": "Sound healer" }
}

Wat doet dit?De TV kiest het opgietlabel uit haar ingestelde taal. Het internationaal herkenbare Sound healer blijft naast die vertaalde rol staan.

Resultaat in de appGasten begrijpen in NL, FR en EN welke taak iedere begeleider heeft.

4 wijzigingen

  • Je ziet duidelijk wie opgieter en wie sound healer is: een gecombineerde live sessie toont voortaan twee aparte rollen met de juiste naam en foto, in plaats van twee personen alsof zij allebei opgieter zijn.
  • De portretten op de grote focuskaart zijn veel groter: het gouden accent hoort bij de opgieter en het mintkleurige accent bij de sound healer, zodat je beide rollen snel herkent.
  • Het dagprogramma toont beide rollen en namen compact en volledig: ook in het overzicht blijft zichtbaar wie de opgieting en wie de live sound healing begeleidt.
  • De rolbenamingen volgen Nederlands, Frans en Engels: Opgieter, Maître de sauna en Sauna host worden automatisch gekozen volgens de schermtaal; Sound healer blijft overal duidelijk herkenbaar.
v1.1.103 Je ziet meteen wanneer de planning nog voorlopig is
Probleem / foutmelding

Wanneer een sessie nog openstond of de manager nog een begeleider moest kiezen, konden uur, locatie of naam nog wijzigen. Gasten moesten die voorlopige toestand zowel in de app als op de TV onmiddellijk kunnen herkennen, zonder dat een oude waarschuwing bleef staan nadat de planning compleet was.

Oplossing

De gastenapp en TV gebruiken nu dezelfde automatisch berekende status als de interne planning. Een duidelijke Voorlopig-chip en banner leggen uit wat nog kan wijzigen. Op de TV staat dezelfde waarschuwing in Nederlands, Frans of Engels. Zodra alle open sessies en toewijzingen zijn afgewerkt, verdwijnen de voorlopige aanduidingen vanzelf.

Technisch

Dezelfde centrale dagstatus stuurt de gastenapp en TV aan. Voorlopige dagen krijgen conditioneel hun chip, banner en vertaalde TV-kop. Na een gegevensverversing verdwijnen die onderdelen automatisch wanneer de status bevestigd wordt.

Technische stappen
  1. Eén dagstatus wordt centraal berekend uit ontbrekende planning, open sessies en begeleiders die nog moeten worden toegewezen.
  2. De gastenapp en TV ontvangen dezelfde status en kunnen daardoor niet elk een andere toestand tonen.
  3. De chip, banner en TV-kop verschijnen alleen wanneer de dagstatus voorlopig is.
  4. De TV-tekst heeft eigen Nederlandse, Franse en Engelse vertalingen.
  5. Bij iedere verversing wordt de status opnieuw gelezen; zodra alles compleet is, verdwijnen de voorlopige onderdelen zonder extra actie.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Automatisch bepalen of een dag nog voorlopig is
PHP
$isProvisional = $extraMissing
    || $openSessionCount > 0
    || count($pendingPeople) > 0;

$planningStatus = $isProvisional
    ? 'provisional'
    : 'confirmed';

Wat doet dit?Een dag blijft voorlopig zolang de extra planning ontbreekt, een sessie nog openstaat of een begeleider nog moet worden toegewezen. App en TV krijgen allebei deze ene uitkomst.

Resultaat in de appJe ontvangt overal dezelfde waarschuwing zolang gegevens nog kunnen veranderen.

Wijziging 2 Voorlopig-chip en uitleg bij de juiste dag plaatsen
Twig
{% if day.planningStatus|default('confirmed') == 'provisional' %}
  <small class="day-extra-sessions is-provisional">Voorlopig</small>
  <aside class="extra-planning-notice" role="note">
    <strong>Voorlopige planning</strong>
    <span>Uren, locaties en begeleiders kunnen nog wijzigen. Controleer later opnieuw.</span>
  </aside>
{% endif %}

Wat doet dit?De dagknop geeft een korte status en boven het geopende programma staat de begrijpelijke uitleg. Beide verdwijnen bij een bevestigde dag doordat dezelfde voorwaarde dan niet meer geldt.

Resultaat in de appJe ziet snel welke dag nog wordt afgewerkt en welke informatie mogelijk nog verandert.

Wijziging 3 De TV-waarschuwing laten meeschakelen met NL, FR en EN
JSON
{
  "nl": "Voorlopige planning",
  "fr": "Programme provisoire",
  "en": "Provisional programme",
  "boodschap": "Uren, locaties en begeleiders kunnen nog wijzigen."
}

Wat doet dit?De TV gebruikt haar ingestelde taal voor de titel en de volledige uitleg. De Franse en Engelse versies brengen dezelfde boodschap over als de Nederlandse tekst.

Resultaat in de appGasten begrijpen in elke beschikbare schermtaal dat het programma nog wordt afgewerkt.

Wijziging 4 De melding vanzelf laten verdwijnen wanneer alles compleet is
JavaScript
const voorlopig = dag.planningStatus === 'provisional';

voorlopigeMelding.hidden = !voorlopig;
dagknop.classList.toggle('has-provisional-planning', voorlopig);

if (!voorlopig) {
  verwijderVoorlopigeChip();
}

Wat doet dit?Bij iedere vernieuwing volgt de app opnieuw de actuele dagstatus. Is de planning bevestigd, dan wordt de melding verborgen en krijgt de dagknop geen voorlopige chip meer.

Resultaat in de appJe ziet automatisch de gewone definitieve weergave zodra de manager alle sessies en begeleiders heeft ingevuld.

4 wijzigingen

  • App en TV gebruiken dezelfde automatische voorlopige status: zolang een sessie openstaat of de manager nog een begeleider moet toewijzen, blijft de dag herkenbaar als Voorlopig.
  • Een chip en banner leggen duidelijk uit wat dit betekent: je ziet meteen dat uren, locaties en begeleiders nog kunnen wijzigen en dat je het programma later best opnieuw controleert.
  • De TV toont de waarschuwing in jouw schermtaal: de programmakop gebruikt Nederlands, Frans of Engels voor de titel en uitleg over de voorlopige planning.
  • Alles wordt automatisch bevestigd zodra de planning af is: wanneer geen open sessies of wachtende toewijzingen meer overblijven, verdwijnen de voorlopige aanduidingen vanzelf.
v1.1.102 Wacht aan de ingang tot je wordt uitgenodigd
Probleem / foutmelding

Vlak voor een sessie kon de gastenapp nog zeggen dat je rustig naar de ruimte moest gaan of al plaats mocht nemen. De TV-schermen maakten wel duidelijk dat je aan de ingang moest wachten, waardoor app en scherm niet overal dezelfde instructie gaven.

Oplossing

Tijdens de laatste vijf minuten toont de gastenapp nu Wacht aan de ingang, de juiste ruimte en Ga pas binnen op uitnodiging. Dit geldt voor Panorama Sauna, The Barn en het Stoombad en verschijnt automatisch in het Nederlands, Frans of Engels.

Technisch

De gastenapp gebruikt voor alle actuele sessiekaarten hetzelfde imminent-venster als de TV. De zichtbare tekst en toegankelijke beschrijving worden samen bijgewerkt, zodat beide dezelfde boodschap geven.

Technische stappen
  1. De hoofdkaart, actuele programmaregel en sessietijdlijn gebruiken nu allemaal dezelfde grens van vijf minuten.
  2. De ingangsinstructie bevat steeds de echte sessielocatie en is beschikbaar in drie talen.
  3. Ondersteunende leessoftware leest de aftelling, wachtinstructie en locatie samen voor.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Wachtboodschap koppelen aan de laatste vijf minuten
JavaScript
if (minuten > 0 && minuten <= 5) {
  label = 'Wacht aan de ingang';
  detail = ruimte + ' · ga pas binnen op uitnodiging';
}

Wat doet dit?Pas vlak voor de start vervangt de duidelijke ingangsinstructie de gewone voorbereidingstekst, samen met de naam van de juiste ruimte.

Resultaat in de appJe weet precies waar je moet wachten zonder te denken dat je de sauna al mag binnengaan.

Wijziging 2 Dezelfde praktische regel in drie talen
JSON
{
  "nl": "Wacht aan de ingang en ga pas binnen wanneer de begeleider je uitnodigt.",
  "fr": "Attendez à l’entrée et n’entrez que lorsque l’accompagnateur vous invite.",
  "en": "Wait at the entrance and only enter when the host invites you."
}

Wat doet dit?De praktische pagina en sessiedetails herhalen dezelfde regel in de gekozen app-taal.

Resultaat in de appNederlandstalige, Franstalige en Engelstalige gasten krijgen één ondubbelzinnige instructie.

2 wijzigingen

  • In de laatste vijf minuten wacht je aan de ingang: bij de aftelling staat Panorama Sauna, The Barn of Stoombad vermeld en je gaat pas naar binnen wanneer de begeleider je uitnodigt.
  • De praktische uitleg kan niet meer verkeerd worden begrepen: ook daar staat nu dat je enkele minuten vooraf naar de ingang gaat, daar wacht en pas na uitnodiging binnengaat. Dezelfde uitleg verschijnt in NL, FR en EN.
v1.1.101 Afgelopen sessies duidelijk gedempt op smartphone
Probleem / foutmelding

Wanneer je het TV-dagprogramma op een smartphone bekeek, kon een afgelopen sessie door de instapanimatie nog bijna even opvallend blijven als wat live of later op het programma stond.

Oplossing

Op smartphone worden tijd en status, foto, naam, sessietype en locatie van een afgelopen sessie nu volledig grijs en gedempt weergegeven. Live en komende sessies houden hun volle kleur en contrast. Op een grote TV blijft de bestaande weergave ongewijzigd.

Technisch

De mobiele instapanimatie beïnvloedde dezelfde rij-opaciteit als de afgelopen-status. De rij blijft daarom zichtbaar op normale sterkte, waarna haar onderdelen gericht worden gedempt. De regel geldt alleen in de smartphoneweergave.

Technische stappen
  1. De instapanimatie kon op mobiel de doorzichtigheid van een volledige afgelopen rij overschrijven.
  2. Daarom worden nu de tijd en status, foto en tekstonderdelen afzonderlijk gedempt en in grijs weergegeven.
  3. TV-stijl v44 bevat de responsive correctie en publieke offlinecache v136 brengt ze gecontroleerd naar smartphones.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Een afgelopen mobiele programmaregel volledig grijs maken
CSS
@media (orientation: portrait), (max-width: 700px) {
  .upcoming-row.is-past {
    opacity: 1 !important;
    filter: grayscale(1) saturate(0);
  }
  .upcoming-row.is-past .upcoming-time { opacity: .48; }
  .upcoming-row.is-past .screen-avatars { opacity: .32; }
  .upcoming-row.is-past .upcoming-copy { opacity: .46; }
}

Wat doet dit?De rij zelf blijft stabiel na de instapanimatie. De tijd en status, foto en tekst worden daarna afzonderlijk rustiger gemaakt en de kleur wordt uit de afgelopen sessie gehaald.

Resultaat in de appOp je smartphone springen live en komende sessies duidelijk naar voren, terwijl afgelopen sessies zichtbaar maar rustig op de achtergrond blijven.

1 wijziging

  • Afgelopen sessies zijn op smartphone volledig grijs en rustig: tijd en status, foto, naam, sessietype en locatie krijgen minder nadruk, terwijl live en komende sessies hun volle kleur en contrast behouden. De grote TV-weergave verandert niet.
v1.1.100 Duidelijk wachten aan de ingang voor je sessie
Probleem / foutmelding

Kort voor een sessie zag je wel hoeveel minuten er nog restten, maar nog niet overal even duidelijk waar je bij Panorama Sauna, The Barn of het Stoombad moest wachten en dat je pas na een uitnodiging mocht binnengaan.

Oplossing

Tijdens de laatste vijf minuten toont ieder TV-scherm voortaan Wacht aan de ingang en ga pas binnen op uitnodiging, naast de duidelijke aftelling. De boodschap verschijnt automatisch in Nederlands, Frans of Engels. Ook de toegankelijke beschrijving van de programmaregel bevat dezelfde aanwijzing.

Technisch

De TV activeert de meertalige ingangsinstructie in de laatste vijf minuten en hergebruikt haar in de toegankelijke beschrijving van de juiste programmaregel. Een nieuwe script- en cacheversie zorgt voor een gecontroleerde vernieuwing op de schermen.

Technische stappen
  1. De extra boodschap wordt alleen geactiveerd wanneer de sessie binnen vijf minuten begint.
  2. Nederlands toont Wacht aan de ingang en ga pas binnen op uitnodiging; Frans en Engels tonen dezelfde betekenis in hun eigen taal.
  3. De toegankelijke naam van de programmaregel bewaart uur, sessie, ruimte, begeleider en aftelling en voegt daar de ingangsinstructie aan toe.
  4. TV-script v51 en publieke offlinecache v135 laden de nieuwe instructie op de gastenschermen.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Wachten en aftellen in de schermtaal
JSON
{
  "nl": ["Wacht aan de ingang", "ga pas binnen op uitnodiging", "Begint over {minuten} min"],
  "fr": ["Attendez à l’entrée", "entrez uniquement sur invitation", "Commence dans {minuten} min"],
  "en": ["Wait at the entrance", "enter only when invited", "Begins in {minuten} min"]
}

Wat doet dit?De TV kiest in de laatste vijf minuten de juiste vertaling en laat de wachtaanwijzing samen met de bestaande minutenaftelling zien.

Resultaat in de appJe weet bij Panorama Sauna, The Barn en Stoombad wanneer de sessie begint, waar je wacht en wanneer je mag binnengaan.

Wijziging 2 De ingangsinstructie laten voorlezen met de programmaregel
JavaScript
const aanwijzing = minuten > 0 && minuten <= 5
  ? ingangsinstructie(sessie)
  : null;

programmaregel.setAttribute('aria-label', [
  sessie.uur,
  sessie.titel,
  sessie.ruimte,
  status,
  aanwijzing && aanwijzing.titel,
  aanwijzing && aanwijzing.detail
].filter(Boolean).join(' · '));

Wat doet dit?De toegankelijke beschrijving koppelt de ingangsinstructie aan dezelfde sessie en aftelling die zichtbaar in het programma staan.

Resultaat in de appOok wie ondersteunende leessoftware gebruikt, ontvangt de volledige aanwijzing op het juiste moment.

2 wijzigingen

  • Je krijgt in de laatste vijf minuten een duidelijke ingangsinstructie: bij Panorama Sauna, The Barn en Stoombad blijven Begint over x min, Wacht aan de ingang en ga pas binnen op uitnodiging samen zichtbaar. De TV gebruikt automatisch NL, FR of EN.
  • Dezelfde aanwijzing is toegankelijk via de programmaregel: ondersteunende leessoftware leest naast de sessie, ruimte en aftelling ook waar je wacht en dat je pas op uitnodiging naar binnen gaat.
v1.1.99 Altijd de juiste status en tip op het TV-scherm
Probleem / foutmelding

Op het TV-programma was niet duidelijk genoeg of een sessie pas afgerond of al langer afgelopen was. Ook de aanloop naar de volgende sessie mocht concreter, en algemene complimenten en motto's konden meer praktische begeleiding geven die echt bij de sessie en ruimte past. Gewone scrubinformatie mocht daarbij nooit de bijzondere afspraken van een ROTS-event overschrijven.

Oplossing

De TV gebruikt nu afzonderlijke, goed herkenbare statussen voor Afgelopen, Net afgerond, voorbereiding, bijna starten en live. Tijdens de voorbereiding tot dertig minuten vooraf verschijnt een echte aftelling; vanaf vijftien minuten krijgt de rij extra nadruk. Tussen complimenten en levensmotto's verschijnen roterende tips voor opgiet, scrub, sound en rituelen, afgestemd op fase, taal en locatie. Ook iedere gelijktijdige sessie krijgt haar eigen begeleiding. Eventduur en eventtips blijven altijd voorrang krijgen op gewone standaardregels.

Technisch

De meertalige TV-weergave berekent voor iedere sessie afzonderlijk of ze gepland, in voorbereiding, bijna gestart, live, net afgerond of afgelopen is. De tiprotatie gebruikt sessie, ruimte en fase en werkt ook bij gelijktijdige focus. Expliciete eventgegevens hebben altijd voorrang. Nieuwe cache- en bestandsversies brengen de wijziging naar de schermen.

Technische stappen
  1. Het volledige dagschema blijft zichtbaar en geeft afgelopen, nazorg, naderend en live elk een eigen label, contrast en accent.
  2. Alle sessies binnen dertig minuten krijgen hun aftelling; vanaf vijftien minuten wordt de rij extra gemarkeerd, ook wanneer meerdere sessies kort na elkaar of tegelijk plaatsvinden.
  3. Tips worden per taal geselecteerd met sessietype, ruimte en actuele fase als basis. De rustige rotatie blijft beschikbaar wanneer beweging is toegestaan en blijft stabiel bij verminderde beweging.
  4. Bij twee gelijktijdige focuskaarten wisselt elke kaart tussen haar eigen verhaal en haar eigen praktische tip.
  5. Een expliciete duur uit een event gaat vóór de standaardwaarden. Zonder aparte duur gebruikt sound 45 minuten, een gewone scrub 30 minuten en een gewone opgiet 20 minuten als technische statusgrens.
  6. TV-stijl v43, TV-script v50 en publieke offlinecache v134 zorgen dat de bijgewerkte schermweergave gecontroleerd wordt geladen.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Een eigen TV-stijl voor nazorg en afgelopen sessies
CSS
.upcoming-row.is-past {
  background: rgba(255,255,255,.012);
}
.upcoming-row.is-past .upcoming-copy { opacity: .34; }

.upcoming-row.is-afterglow {
  background: linear-gradient(90deg, rgba(183,220,197,.09), transparent 82%);
  box-shadow: inset 2px 0 0 rgba(183,220,197,.62);
}

Wat doet dit?Een oudere regel wordt bewust stiller, terwijl de nazorg na een sessie een zacht groen accent en het label Net afgerond krijgt. Beide blijven in het volledige dagprogramma staan.

Resultaat in de appJe ziet in één oogopslag wat pas klaar is en wat al eerder op de dag plaatsvond.

Wijziging 2 Van voorbereiding naar aftelling en live schakelen
JavaScript
if (minutes <= 0) return 'live';
if (minutes <= 5) return 'imminent';
if (minutes <= 15) return 'soon';
if (minutes <= 30) return 'preparing';
return 'scheduled';

const melding = minutes > 0 && minutes <= 30
  ? `Begint over ${Math.max(1, minutes)} min`
  : '';

Wat doet dit?De TV gebruikt vaste tijdsvakken voor voorbereiding, de laatste vijftien minuten, de laatste vijf minuten en live. De melding toont tijdens de volledige voorbereiding het echte resterende aantal minuten.

Resultaat in de appJe weet beter wanneer je rustig naar de juiste sauna of ruimte mag gaan.

Wijziging 3 Tips per sessie, ruimte en fase laten roteren
JSON
{
  "context": ["taal", "sessie", "ruimte", "fase"],
  "belevingen": {
    "opgiet": "warmte en afkoelen",
    "scrub": "begeleiding en afspoelen",
    "sound": "comfort en klank",
    "ritueel": "eventspecifieke begeleiding"
  },
  "rotatie": ["tip", "compliment", "tip", "levensmotto"],
  "gelijktijdig": "eigen tip per focuskaart"
}

Wat doet dit?De TV kiest niet zomaar een algemene zin. Ze neemt de taal, het echte sessietype, de ruimte en de fase mee. Wanneer twee sessies tegelijk centraal staan, behoudt iedere kaart haar eigen selectie.

Resultaat in de appDe afwisselende boodschap blijft warm én praktisch bruikbaar voor de sessie die je ziet.

Wijziging 4 Eventduur altijd vóór de gewone scrubregel toepassen
JavaScript
const duur = Number(sessie.durationMinutes) || (
  sessie.type === 'sound' ? 45 :
  sessie.type === 'scrub' ? 30 : 20
);

const gebruiktEventregels = sessie.isSpecialEventSession || (
  sessie.type === 'scrub' && duur > 30
);
const nazorgtip = !gebruiktEventregels
  ? sessie.tips[2] || standaardScrubNazorg
  : sessie.isSpecialEventSession && sessie.tips.length
    ? sessie.tips[sessie.tips.length - 1]
    : standaardScrubNazorg;

Wat doet dit?Een event kan zelf een duur en eigen begeleiding doorgeven en die informatie wordt eerst gebruikt. De standaard van 30 minuten en de smoothietip gelden alleen voor een gewone scrub; een ROTS-sessie van 45 minuten blijft daardoor correct en krijgt geen gewone nazorgtekst.

Resultaat in de appDe status, aftelling en begeleiding blijven juist voor gewone scrub én voor bijzondere ROTS-momenten.

4 wijzigingen

  • Net afgerond ziet er anders uit dan Afgelopen: de eerste vijftien minuten na een sessie blijven als zacht herstelmoment herkenbaar, terwijl oudere sessies rustig op de achtergrond blijven staan.
  • Begint over x min, voorbereiding en live vallen duidelijker op: tijdens de voorbereiding toont de TV op de focuskaart én in het dagprogramma hoeveel minuten nog resten, vanaf vijftien minuten krijgt de rij extra nadruk en de laatste vijf minuten worden krachtiger benadrukt. Een lopende sessie herken je onmiddellijk als Nu bezig.
  • Je krijgt tips die bij de sessie en plek passen: begeleiding voor opgiet, scrub, sound en rituelen wisselt rustig af met complimenten en levensmotto's. Ook bij twee gelijktijdige focuskaarten hoort iedere tip bij de juiste sessie en ruimte.
  • Speciale events behouden hun eigen veilige afspraken: de gewone scrubregels worden alleen voor een gewone scrub gebruikt; een ROTS-duur van 45 minuten en de bijbehorende eventspecifieke informatie blijven altijd behouden.
v1.1.98 Alle sessiedetails volledig zichtbaar op grote TV's
Probleem / foutmelding

Bij twee gelijktijdige sessies kon een grote liggende TV van 1728 pixels hoog het onderste deel van de focusdetails afsnijden. Locatie of sauna en duur waren daardoor niet altijd volledig zichtbaar, terwijl de compacte 720p-weergave al goed werkte.

Oplossing

Het detailvak krijgt bij twee gelijktijdige sessies op grote liggende TV's voortaan genoeg hoogte voor alle informatie. De goede 720p-opmaak blijft behouden en ook grotere schermen tonen nu locatie of sauna en duur volledig.

Technisch

De grote TV-weergave gebruikt bij twee gelijktijdige focuskaarten nu een eigen ruimere hoogtebegrenzing. Zo blijft de bestaande layout behouden, maar past dezelfde volledige informatie die op 720p al zichtbaar was ook op grotere schermen.

Technische stappen
  1. De correctie richt zich op de grote liggende weergave rond 1728 pixels hoogte; de compacte 720p-weergave had al een passende regel voor meerdere sessies.
  2. Bij twee focuskaarten vervangt een ruimere specifieke hoogte de algemene begrenzing die voor één sessie bedoeld is.
  3. De kaarten blijven netjes binnen het TV-scherm en behouden tegelijk alle belangrijke locatie- en duurinformatie.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Volledige details voor twee gelijktijdige sessies bewaren
CSS
.screen-app[data-layout-style="evening"]
[data-layout-composition="cinematic-media"]
.focus-cards.has-multiple .focus-details {
  max-height: calc(100% - 56px);
}

Wat doet dit?Alleen wanneer twee sessies tegelijk worden uitgelicht, krijgt hun detailvak de extra benodigde hoogte. De kleinere algemene grens voor één sessie en de bestaande 720p-opmaak blijven intact.

Resultaat in de appGasten kunnen op grote liggende TV's van beide sessies de locatie of sauna en de duur volledig lezen.

1 wijziging

  • Locatie en duur blijven volledig zichtbaar bij twee gelijktijdige sessies: de grote liggende TV-weergave snijdt het onderste deel van de focusdetails niet meer af. Op 720p was dit al in orde en nu zijn ook grote schermen volledig.
v1.1.97 De hele TV-dag naast de actuele beleving
Probleem / foutmelding

Op het gastenscherm stonden de actuele beleving en het dagschema niet voortdurend samen in beeld wanneer dertien sessies over meerdere pagina's werden verdeeld. Voorbereiding, live en herstel mochten duidelijker verschillen en belangrijke informatie moest ook op een 720p-scherm of bij gelijktijdige sessies volledig herkenbaar blijven. Kleine tijdupdates mochten daarbij geen zichtbare volledige schermopbouw veroorzaken.

Oplossing

De TV gebruikt nu een vaste professionele 50/50-indeling met links de actuele beleving en rechts alle dertien sessies van vandaag tegelijk. Sterke maar rustige faseverschillen, hostbeeld, aftelling en sauna-informatie leiden gasten naar het juiste moment. Meertalige complimenten en levensmotto's wisselen af. De opmaak is beter leesbaar op 720p en ververst bij een lopende aftelling alleen wat echt wijzigt.

Technisch

Een vaste zes-op-zes verdeling houdt focus en volledige dag samen zichtbaar. De rechterhelft bouwt één compact overzicht zonder paginering; de linkerhelft past status, aftelling, hostbeeld, sfeer en afsluiting aan de sessiefase aan. Meertalige gastboodschappen wisselen stabiel. Specifieke 720p-regels en gerichte tijdupdates houden de weergave leesbaar en rustig, terwijl onbekende eventtypes een veilige eigen tekst krijgen.

Technische stappen
  1. De liggende TV-opmaak is vast in twee gelijke delen verdeeld: actuele beleving links en volledig dagprogramma rechts.
  2. Het programma groepeert de dertien sessies in twee tijdvakken en toont ze allemaal tegelijk. Iedere rij bevat tijd, hostfoto of initialen, sessietype, ruimte en begeleider.
  3. De focuskaart toont een aparte voorbereiding, bijna-startstatus, livefase en vijftien minuten nazorg met passende aftelling, kleur en subtiele beweging.
  4. Voorbije sessies worden niet verwijderd maar bewust gedimd. Zodra de laatste nazorg voorbij is, verschijnt links een afsluitscherm voor de dag.
  5. De complimenten en levensmotto's hebben eigen Nederlandse, Franse en Engelse teksten en wisselen via een stabiele, willekeurig ogende volgorde.
  6. Op 720p worden belangrijke maten begrensd voor leesbaarheid. Lange titels gebruiken maximaal twee regels en flexibele kolommen voorkomen dat gelijktijdige sessies hun kerninformatie verliezen.
  7. Bij een ongewijzigde planning en status worden alleen de bestaande aftelling en labels aangepast; de volledige TV-layout blijft staan.
  8. Alleen echte opgiet-, scrub-, sound- en livebelevingen krijgen hun specifieke verhaal. Andere eventtypes gebruiken hun eigen titel, uur, locatie en een neutrale passende zin.
Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 Alle dertien sessies naast de actuele beleving houden
CSS
.screen-main {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
}
.screen-focus,
.screen-programme {
  grid-column: span 6;
}
.programme-complete {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  overflow: hidden;
}
/* De volledige dag staat in beeld zonder programmapager. */

Wat doet dit?Zes van de twaalf delen gaan naar de beleving en zes naar het programma. De daglijst verdeelt haar dertien sessies compact over twee tijdvakken, maar wisselt niet meer tussen pagina's.

Resultaat in de appGasten zien op ieder moment wat er nu gebeurt én welke sessies later op de dag volgen.

Wijziging 2 Voorbereiding, live, nazorg en afsluiting visueel scheiden
CSS
[data-experience-stage="preparing"] .focus-status { background: #f0d488; }
[data-experience-stage="live"] .focus-status { background: #a9dfbd; }
[data-experience-stage="afterglow"] .focus-status { background: #b7dcc5; }
.programme-complete .upcoming-row.is-past { opacity: .36; }
.focus-person {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
}

Wat doet dit?De statuskleur verandert per fase en de focus houdt een vaste plek voor aftelling, sauna en foto of initialen van de begeleider. Rustige motion ondersteunt het verschil. Voorbije sessies blijven als gedimde regels zichtbaar; na de laatste sessie gebruikt de focusruimte een afsluitbeeld.

Resultaat in de appGasten herkennen sneller of ze nog moeten wachten, nu naar de sauna moeten gaan of rustig mogen herstellen.

Wijziging 3 Complimenten en levensmotto's in drie talen laten roteren
JSON
{
  "nl": ["Fijn dat je er bent.", "Rust is geen stilstand."],
  "fr": ["Nous sommes heureux de vous accueillir.", "Le calme n’est pas l’immobilité."],
  "en": ["We are glad you are here.", "Stillness is not standing still."],
  "wisselwijze": "rustig en stabiel gemengd"
}

Wat doet dit?Elke taal heeft meerdere echte complimenten en motto's. De gemengde volgorde blijft stabiel genoeg om niet bij een gewone schermupdate te springen, maar voelt doorheen de dag toch afwisselend aan.

Resultaat in de appIedere gast krijgt regelmatig een nieuwe warme boodschap in de taal van het informatiescherm.

Wijziging 4 Belangrijke informatie op 720p volledig leesbaar maken
CSS
@media (orientation: landscape) and (max-width: 1500px),
       (orientation: landscape) and (max-height: 820px) {
  .upcoming-time time { font-size: 1.16rem; }
  .upcoming-type {
    display: -webkit-box;
    white-space: normal;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
  }
  .upcoming-row.is-concurrent {
    grid-template-columns: 50px auto minmax(0, 1fr);
  }
}

Wat doet dit?De 720p-opmaak geeft uren een duidelijke minimale maat, laat een langere titel netjes over twee regels lopen en reserveert bij gelijktijdige sessies afzonderlijke ruimte voor tijd, hostbeeld en tekst.

Resultaat in de appOok vanop afstand blijven gelijktijdige en lang benoemde sessies herkenbaar zonder verlies van kerninformatie.

Wijziging 5 Rustig de tijd bijwerken en speciale events correct beschrijven
JavaScript
if (inhoudEnFaseZijnOngewijzigd) {
  werkAftellingEnStatusBij();
  return;
}

if (sessie.isSpeciaalEvent) {
  toon(`${sessie.titel} start om ${sessie.tijd} in ${sessie.ruimte}.`);
} else {
  toon(sessie.passendeBelevingstekst);
}

Wat doet dit?Een gewone tijdsprong verandert alleen de labels die tijdgevoelig zijn en laat de bestaande layout staan. Speciale ceremonies en andere eventtypes gebruiken hun eigen gegevens; alleen herkenbare sessiesoorten krijgen een specifiek opgiet-, scrub-, sound- of liveverhaal.

Resultaat in de appHet scherm blijft stabiel bij aftellingen en vertelt gasten bij ieder event inhoudelijk de juiste boodschap.

5 wijzigingen

  • De actuele beleving en alle dertien sessies staan tegelijk in beeld: de vaste 50/50-TV-indeling gebruikt links voor het moment van nu en rechts voor het volledige dagprogramma, zonder paging.
  • Iedere fase is onmiddellijk herkenbaar: voorbereiding, live en nazorg hebben duidelijke status, aftelling, sauna, hostfoto of initialen en subtiele beweging; voltooide regels blijven gedimd en na de laatste sessie volgt een warm afsluitscherm.
  • Warme gastboodschappen blijven natuurlijk afwisselen: complimenten en levensmotto's verschijnen in een willekeurig ogend ritme en zijn beschikbaar in NL, FR en EN.
  • De TV blijft groter en vollediger leesbaar op 720p: lange titels krijgen maximaal twee regels en gelijktijdige sessies behouden tijd, beeld, type, ruimte en begeleider zonder storend afkappen.
  • Alleen wat in de tijd verandert wordt bijgewerkt: een nieuwe minuut bouwt niet opnieuw de hele TV-layout, en ceremonies of andere speciale events krijgen hun eigen neutrale tekst in plaats van een fout standaardverhaal over een opgieting.
v1.1.96 TV-dagprogramma sluit weer aan op de gastenapp
Probleem / foutmelding

De gastenapp en het TV-scherm ontvingen voor dezelfde dag allebei dezelfde dertien sessies, net als de interne planner. Toch kon de TV minder sessies tonen doordat haar presentatie een nieuw filter toepaste. Na de laatste sessie kon vandaag bovendien te vroeg plaatsmaken voor morgen en bij meerdere schermpagina's was niet duidelijk welke uren op dat moment werden getoond.

Oplossing

Een bestaand informatiescherm zonder expliciete keuze toont opnieuw het volledige dagschema van vandaag, precies zoals de gastenapp. Alleen wanneer een manager dit per TV bewust instelt, blijft de lijst beperkt tot live en komende sessies. Vandaag wordt na de laatste sessie niet automatisch vervangen door morgen, herstel duurt op beide gastweergaven vijftien minuten en iedere programmapagina toont nummer én urenbereik in NL, FR of EN.

Technisch

De correctie zit uitsluitend in de TV-presentatie; de drie weergaven hadden al dezelfde dertien sessies. Ontbrekende oudere scherminstellingen vallen terug op het volledige dagschema. Een manager kan het actuele filter per scherm expliciet activeren. De TV houdt vandaag na de laatste sessie vast, deelt het herstelvenster van vijftien minuten met de gastenapp en bouwt een meertalige paginastatus uit de eerste en laatste sessie per pagina.

Technische stappen
  1. Voor de gecontroleerde dag bevatten intern, gastenapp en TV elk exact dertien sessies. De brondata en inhoud van de sessies waren gelijk.
  2. Een bestaand schermprofiel zonder showCompleted-instelling wordt behandeld als volledig dagprogramma. Alleen een expliciet uitgeschakelde keuze activeert de live/komend-weergave.
  3. De instelling heet in Schermbeheer Volledig dagprogramma tonen en wordt afzonderlijk per TV door een manager bewaard.
  4. Na de laatste sessie blijft vandaag de actieve programmadag; morgen wordt niet ongemerkt als vervanging getoond.
  5. Herstel loopt tot vijftien minuten na de berekende eindtijd van de sessie, gelijk aan de status in de gastenapp.
  6. De Nederlandstalige, Franstalige en Engelstalige paginateller gebruikt het eerste en laatste sessie-uur van iedere zichtbare pagina.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 De identieke bron voor app en TV zichtbaar maken
JSON
{
  "dezelfdeDag": true,
  "gastenapp": { "sessies": 13 },
  "tv": { "sessies": 13 },
  "internePlanner": { "sessies": 13 },
  "correctie": "alleen TV-presentatie"
}

Wat doet dit?De drie uitkomsten worden op dezelfde dag geteld vóór een zichtbaar TV-filter. Alle tellers komen op dertien uit, waardoor duidelijk is dat er geen gastensessie uit het rooster verdwenen was.

Resultaat in de appDe TV kan opnieuw op dezelfde volledige daginhoud steunen als de gastenapp.

Wijziging 2 Volledige dag als veilige standaard kiezen
JSON
{
  "bestaandProfielZonderKeuze": "volledige dag",
  "volledigDagprogrammaTonen": true,
  "explicietUitgeschakeldDoorManager": "alleen live en komend"
}

Wat doet dit?Een ouder TV-profiel hoeft niet opnieuw ingesteld te worden: zonder opgeslagen keuze volgt het de volledige gastenplanning. De kortere actuele lijst verschijnt alleen na een bewuste managerkeuze.

Resultaat in de appGasten zien op bestaande schermen standaard alle sessies van vandaag en locaties behouden desgewenst hun gerichte live/komend-weergave.

Wijziging 3 Herstel vijftien minuten bij vandaag houden
JSON
{
  "sessieEinde": "20:30",
  "herstelTot": "20:45",
  "actieveDagNaLaatsteSessie": "vandaag",
  "morgenVervangtVandaagAutomatisch": false
}

Wat doet dit?De TV gebruikt dezelfde vijftien minuten herstel na de sessieduur als de gastenapp. Wanneer het laatste herstel voorbij is, blijft de getoonde programmadag nog steeds vandaag.

Resultaat in de appApp en TV geven gasten rond het einde van de dag dezelfde status zonder onverwachte sprong naar morgen.

Wijziging 4 Pagina en urenbereik meertalig benoemen
JSON
{
  "nl": "Pagina 1 van 2 · 10:30–15:00",
  "fr": "Page 1 sur 2 · 10:30–15:00",
  "en": "Page 1 of 2 · 10:30–15:00"
}

Wat doet dit?De teller gebruikt het eerste en laatste uur van de sessies op de actieve pagina en combineert die met het paginanummer in de ingestelde TV-taal.

Resultaat in de appGasten weten meteen welke uren zij bekijken en hoeveel delen van het dagprogramma volgen.

4 wijzigingen

  • Alle sessies zaten al correct in dezelfde bron: gastenapp, TV en interne planner ontvingen ieder dertien sessies; alleen de TV-presentatie veroorzaakte het verschil op het scherm.
  • Een bestaande TV toont standaard het volledige programma van vandaag: zonder eerdere filterkeuze ziet een gast dezelfde dag als in de app; een manager kan voor een bepaald scherm expliciet alleen live en komende sessies kiezen.
  • Na de laatste sessie blijft vandaag zichtbaar: de TV schakelt niet stilletjes over naar morgen en gebruikt net als de gastenapp een herstelstatus van vijftien minuten.
  • Elke programmapagina vertelt welk tijdsdeel wordt getoond: naast Pagina X van Y staat nu het urenbereik, met een passende Nederlandse, Franse of Engelse formulering.
v1.1.95 TV toont alleen wat nu en straks telt
Probleem / foutmelding

Afgeronde sessies bleven op de TV tussen de actuele en komende sessies staan met het label Voltooid. Op een volle dag namen oude regels daardoor meerdere programmapagina's in beslag, terwijl gasten vooral willen weten welke sessie nu bezig is en waar ze straks moeten zijn.

Oplossing

Het TV-dagprogramma verbergt afgeronde sessieregels nu standaard en toont alleen sessies die live zijn of nog moeten starten. Titels en tellers spreken voortaan over Nu & straks. Na de laatste sessie verschijnt automatisch het programma van morgen of, wanneer dat nog niet beschikbaar is, een duidelijke melding dat vandaag is afgerond. Een manager kan per scherm in Schermbeheer bewust opnieuw het volledige dagverloop tonen.

Technisch

De TV maakt één actuele programmaweergave uit de volledige dagdata. Alleen live sessies en sessies met een toekomstige starttijd gaan standaard door naar de verschillende composities. De focus kan nog kort herstel tonen; daarna schakelt het programma naar morgen of naar een correcte eindmelding. De per-schermschakelaar bewaart bewust of het volledige dagverloop zichtbaar moet blijven.

Technische stappen
  1. De zichtbare lijst wordt vóór de opbouw van de TV-compositie gefilterd. Daardoor tellen afgeronde regels niet meer mee voor programmapagina's, tickers of ruimtegroepen.
  2. Een sessie blijft zichtbaar zolang zij live is of haar starttijd nog in de toekomst ligt. De bestaande sessieduur bepaalt wanneer de live status eindigt.
  3. De focuskaart behoudt het korte herstelmoment na een sessie, ook wanneer die sessie niet meer in het chronologische programma staat.
  4. Wanneer vandaag niets meer volgt, kiest de programmakolom automatisch morgen. Zonder morgenprogramma verschijnt de vertaalde melding dat alle sessies van vandaag afgerond zijn.
  5. De per-schermwaarde Voltooide sessies tonen wordt veilig bewaard. Nieuwe en bestaande schermen gebruiken standaard de rustige actuele weergave zolang een manager de schakelaar niet activeert.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Alleen live en komende sessies in het programma opnemen
JavaScript
const zichtbareSessies = volledigDagprogramma.filter((sessie) =>
  isSessionLive(sessie) || minutesUntil(sessie) > 0
);

bouwTvProgramma(zichtbareSessies);

Wat doet dit?De volledige planning blijft als bron beschikbaar, maar de standaard TV-lijst bevat uitsluitend een actieve sessie of een sessie die nog moet beginnen. Dezelfde selectie voedt iedere schermcompositie.

Resultaat in de appGasten zien geen oude Voltooid-regels meer en vinden sneller de juiste volgende sessie.

Wijziging 2 Actuele programmatekst in drie talen tonen
JSON
{
  "nl": { "titel": "Nog vandaag", "legenda": "Live en komende sessies" },
  "fr": { "titel": "À venir aujourd’hui", "legenda": "Séances en cours et à venir" },
  "en": { "titel": "Coming up today", "legenda": "Live and upcoming sessions" }
}

Wat doet dit?De koppen en tellers beschrijven de werkelijk zichtbare selectie in plaats van te suggereren dat het historische dagprogramma nog wordt getoond.

Resultaat in de appNederlandstalige, Franstalige en Engelstalige gasten begrijpen meteen dat de lijst over nu en straks gaat.

Wijziging 3 Na de laatste sessie morgen of een eindmelding kiezen
JavaScript
if (!zichtbareSessies.length && morgen.length) {
  return toonProgramma(morgen);
}
if (!zichtbareSessies.length) {
  return toonMelding('Alle sessies van vandaag zijn afgerond.');
}

Wat doet dit?Een lege actuele selectie betekent niet dat er nooit sessies gepland waren. Het scherm gebruikt daarom eerst het programma van morgen en anders een specifieke afgerondmelding.

Resultaat in de appHet TV-scherm blijft bruikbaar en eerlijk tot na het laatste wellnessmoment.

Wijziging 4 Volledige dag per scherm als bewuste keuze bewaren
JSON
{
  "schermbeheer": "Voltooide sessies tonen",
  "showCompleted": false,
  "standaard": "alleen live en komende sessies",
  "ingeschakeldDoorManager": "volledig dagverloop"
}

Wat doet dit?De schakelaar staat in Schermbeheer bij het gekozen scherm en is standaard uit. Een manager kan haar alleen activeren voor een TV waarop ook eerdere sessies nuttige daginformatie zijn.

Resultaat in de appIeder scherm krijgt de passende informatiedichtheid zonder dat de rustige standaard voor andere TV's verandert.

4 wijzigingen

  • Afgeronde sessies maken automatisch plaats voor wat nog relevant is: de TV toont standaard alleen live en komende sessies, zodat oude regels geen programmapagina's, ticker of sauna-zones meer vullen.
  • Nu & straks is in iedere taal ondubbelzinnig: teller, titel en eventboodschap vermelden correct hoeveel sessies nog bezig zijn of volgen.
  • Ook het einde van de dag blijft informatief: na de laatste sessie verschijnt het programma van morgen of een duidelijke melding dat alle sessies van vandaag zijn afgerond.
  • Een manager kiest dit per TV in Schermbeheer: Voltooide sessies tonen staat standaard uit, maar kan worden ingeschakeld wanneer een scherm bewust het volledige dagverloop moet laten zien.
v1.1.94 Klankbelevingskaart helder op moderne iPhones
Probleem / foutmelding

Op moderne iPhones met een schermbreedte vanaf 393 pixels bleef de klankbelevingskaart ten onrechte in twee smalle kolommen staan. Het brede sfeerbeeld drukte de titel, naam van de sound healer en profieltekst in een strook van enkele letters breed. De kaart schoof daardoor ook horizontaal buiten beeld en het herstelblok stond vijf pixels uit lijn.

Oplossing

De klankbelevingskaart gebruikt op smartphones nu één rustige verticale leeslijn. Eerst verschijnt een breed sfeerbeeld in 16:9, daarna het duidelijk leesbare profiel van de sound healer en de korte toelichting. Een dubbele titel en het extra binnenkader zijn verwijderd, het herstelblok sluit weer exact aan en de ruime tweekolomsopmaak op desktop blijft behouden.

Technisch

Een smartphonebrede mediaregel zet alleen de belevingskaart om naar één kolom, geeft het beeld een vaste 16:9-verhouding en maakt het profiel een volledige tekstregel. De buitenste sectie blijft de inhoud structureren; de overbodige binnenrand en herhaalde kaarttitel verdwijnen. De desktopregels worden niet overschreven.

Technische stappen
  1. De mobiele kaartregels gelden voortaan binnen de volledige smartphonegrens en niet uitsluitend tot 390 pixels.
  2. De inhoudskaart schakelt mobiel naar één kolom en het sfeerbeeld bewaart met aspect-ratio 16 / 9 zijn natuurlijke verhouding.
  3. Wanneer één klankbelevingskaart aanwezig is, blijven de dagtitel en uitleg bovenaan de enige hoofding; de herhaalde titel binnen de kaart wordt verborgen.
  4. De binnenkaart heeft mobiel geen eigen rand, achtergrond of schaduw meer. De omringende dagsectie blijft de inhoud duidelijk groeperen.
  5. De negatieve zijmarge van het herstelblok is gelijkgemaakt aan de mobiele binnenruimte. Regels buiten de mobiele mediaquery behouden de desktoplayout.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Klankbeleving op iedere moderne iPhone onder elkaar zetten
CSS
@media (max-width: 600px) {
  .guest-flyer.is-experience {
    grid-template-columns: minmax(0, 1fr);
    grid-template-rows: auto auto auto;
  }
}

Wat doet dit?De mobiele grens omvat ook iPhones van 393 pixels en breder. Beeld, profiel en toelichting hoeven daardoor niet langer een te smalle tweede kolom te delen.

Resultaat in de appTitel en sound-healernaam breken alleen nog op normale woordgrenzen en de kaart blijft volledig binnen het scherm.

Wijziging 2 Een breed sfeerbeeld boven het leesbare profiel tonen
CSS
.guest-flyer.is-experience .guest-flyer-preview {
  width: 100%;
  height: auto;
  aspect-ratio: 16 / 9;
}
.sound-healer-identity {
  grid-template-columns: 48px minmax(0, 1fr);
}

Wat doet dit?Het beeld gebruikt de volledige beschikbare breedte en behoudt een herkenbare liggende verhouding. Daaronder reserveert het profiel een vaste plaats voor de avatar en alle resterende ruimte voor rol en naam.

Resultaat in de appDe sfeerfoto blijft aantrekkelijk en de naam van de sound healer is onmiddellijk leesbaar.

Wijziging 3 Dubbele titel en extra binnenkader mobiel weglaten
CSS
.guest-flyer.is-sound-healer:only-child .guest-flyer-copy > span,
.guest-flyer.is-sound-healer:only-child .guest-flyer-copy > strong {
  display: none;
}
.guest-flyer.is-experience {
  border: 0;
  background: transparent;
  box-shadow: none;
}

Wat doet dit?De titel boven het sfeerbeeld blijft staan en hoeft binnen dezelfde kaart niet opnieuw te worden herhaald. De buitenste dagsectie biedt al voldoende visuele groepering.

Resultaat in de appDe mobiele pagina krijgt minder kaders en een duidelijkere, rustigere informatiehiërarchie.

Wijziging 4 Herstelblok uitlijnen en desktop ongemoeid laten
CSS
@media (max-width: 600px) {
  .moment-overview .moment-recovery {
    margin-inline: -14px;
    padding-inline: 14px;
  }
}
/* Buiten deze mediaregel blijft de tweekoloms desktopkaart actief. */

Wat doet dit?De zijmarge volgt exact de mobiele binnenruimte en verwijdert zo de verschuiving van vijf pixels. Omdat de correctie alleen binnen de mobiele mediaregel staat, verandert de desktopindeling niet.

Resultaat in de appHet herstelblok sluit links en rechts netjes aan, terwijl beeld en tekst op desktop naast elkaar blijven staan.

4 wijzigingen

  • Klankbeleving blijft nu leesbaar op moderne iPhones vanaf 393 pixels: de kaart staat mobiel in één kolom, zonder horizontale overloop of woorden die letter per letter afbreken.
  • Het sfeerbeeld en de sound healer krijgen een duidelijke volgorde: een breed 16:9-beeld staat boven het profiel, zodat naam, rol en toelichting voldoende plaats krijgen.
  • De kaart oogt rustiger met minder herhaling en minder kaders: de dubbele binnentitel en het extra binnenkader zijn verwijderd terwijl de dagtitel behouden blijft.
  • De mobiele uitlijning klopt opnieuw zonder desktop te veranderen: het herstelblok is vijf pixels gecorrigeerd en brede schermen behouden hun tweekolomsopmaak.
v1.1.93 Gezichten en namen in ieder TV-dagprogramma
Probleem / foutmelding

Het TV-dagprogramma vertelde al hoe laat een sessie start, wat er gebeurt en in welke sauna of ruimte gasten moeten zijn, maar de begeleider bleef in een volle planning minder snel herkenbaar. Vooral bij een duo of een opgietsessie met live sound healing was niet meteen zichtbaar wie de sessie samen verzorgt.

Oplossing

Iedere sessieregel op TV toont nu naast het uur een echt portret en een duidelijk leesbare naam van de opgieter of sound healer. Duo's en live-soundcombinaties krijgen overlappende portretten en hun gezamenlijke naam blijft zichtbaar. Als er geen bruikbare foto bestaat, verschijnt een verzorgd initialenmonogram; er wordt nooit een verzonnen persoonsfoto gebruikt.

Technisch

De TV gebruikt per sessie de bestaande fotolijst en de volgorde van de begeleiders. Ronde portretten schalen per compositie mee, duo's overlappen gecontroleerd en een laadfout schakelt naar een initialenmonogram. Alleen de interne programmapagina wisselt; het informatiescherm zelf blijft staan.

Technische stappen
  1. Het programma gebruikt de bestaande persoonsfoto's van opgieters en sound healers en maakt geen kunstmatige portretten aan.
  2. Bij meerdere begeleiders worden maximaal drie ronde portretten compact over elkaar gelegd. De volledige naam blijft daarnaast gewone leesbare tekst.
  3. Een foto die ontbreekt of niet kan laden, valt automatisch terug op de eerste letter van de persoonsnaam. Bij een begeleider zonder naam verschijnt een neutrale aanduiding.
  4. Het subtiele verschil voor een sound healer zit in de portretrand; tijd, naam, sessietype en echte locatie behouden dezelfde duidelijke leesvolgorde.
  5. Vertrekbord, Typografisch programma, Cinematische mediafocus, Vier sauna-zones, Editorial ribbon en Event director hebben elk een passende portretmaat en afstand zonder nieuwe kaarten rond de sessies.
  6. De weergave is afgestemd op compacte 1024 × 576-schermen, 1366 × 768 en Full HD 1920 × 1080. De bestaande interne programmapaginering blijft actief zonder volledige refresh.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Portret en naam naast ieder sessie-uur plaatsen
HTML
<article class="sessie">
  <time>17:00</time>
  <div class="portret"><img src="opgieter.jpg" alt=""></div>
  <div>
    <strong>ANOUCHKA</strong>
    <span>Opgietsessie</span>
    <small>Panorama Sauna</small>
  </div>
</article>

Wat doet dit?Het gezicht staat in dezelfde horizontale leeslijn als het uur. De naam, het sessietype en de echte sauna of ruimte blijven gewone tekst en zijn dus niet afhankelijk van de foto.

Resultaat in de appEen gast ziet in één oogopslag wanneer, met wie en waar de sessie doorgaat.

Wijziging 2 Meerdere begeleiders compact maar volledig tonen
JSON
{
  "naamOpScherm": "GEERT + ERICA",
  "type": "Opgietsessie met live sound healing",
  "portretten": [
    { "naam": "Geert", "rol": "opgieter" },
    { "naam": "Erica", "rol": "sound healer" }
  ],
  "weergave": "overlappend"
}

Wat doet dit?De portretten overlappen licht om schermruimte te sparen. De zichtbare naamcombinatie blijft daarnaast volledig staan en de sound healer behoudt haar eigen rolaccent.

Resultaat in de appOok een duo of live-soundsessie is persoonlijk herkenbaar zonder dat de uurregeling wordt verdrongen.

Wijziging 3 Veilige initialen tonen wanneer een foto ontbreekt
JavaScript
const toonPortret = (persoon) => {
  const initiaal = (persoon.naam || '?').trim().charAt(0).toUpperCase();
  return persoon.fotoWerkt
    ? { soort: 'foto', bron: persoon.foto }
    : { soort: 'monogram', tekst: initiaal };
};

const accent = persoon.rol === 'sound healer' ? 'zacht-groen' : 'goud';

Wat doet dit?Alleen een beschikbare echte foto wordt gebruikt. Wanneer het bestand ontbreekt of niet kan laden, neemt een eenvoudig monogram dezelfde plaats in; het subtiele accent maakt een sound healer herkenbaar zonder een extra kader toe te voegen.

Resultaat in de appIedere regel blijft verzorgd en eerlijk, ook wanneer nog niet voor iedere medewerker een foto beschikbaar is.

Wijziging 4 Portretten rustig laten meeschalen in zes composities
CSS
.tv-sessieportret {
  width: clamp(30px, 3vw, 54px);
  aspect-ratio: 1;
  border-radius: 50%;
}
.tv-sessieportretten { display: inline-flex; }
.tv-sessieportretten > * + * { margin-left: -10px; }

@media (prefers-reduced-motion: reduce) {
  .tv-programmapagina { transition: none; }
}

Wat doet dit?De ronde foto schaalt tussen compact liggend en Full HD. Overlap vervangt brede fotokaarten, zodat de zes composities hun rustige open indeling behouden. Een vol programma wisselt alleen van interne pagina en volgt de voorkeur voor minder beweging.

Resultaat in de appVertrekbord, dagprogramma, mediafocus, sauna-zones, editorial en event blijven leesbaar op 1024, 1366 en 1920 pixels zonder extra kaders of refreshflits.

4 wijzigingen

  • Gasten herkennen de begeleider nu meteen aan gezicht én naam: naast elk uur staat het echte portret van de opgieter of sound healer, samen met sessietype en sauna of ruimte.
  • Duo's en live sound healing blijven ook in een volle planning duidelijk: overlappende portretten nemen weinig plaats in en de gezamenlijke naam, bijvoorbeeld GEERT + ERICA, blijft zichtbaar.
  • Geen foto betekent nooit een verzonnen gezicht: een ontbrekende of gebroken foto krijgt automatisch een verzorgd initialenmonogram en een sound healer is subtiel herkenbaar aan een groen accent.
  • Alle zes TV-composities blijven rustig, professioneel en stabiel: portretten passen op 1024, 1366 en 1920 pixels zonder extra kaders, terwijl lange programma's intern doorbladeren zonder volledige paginaverversing.
v1.1.92 Altijd de juiste sessie op zes nieuwe TV-layouts
Probleem / foutmelding

Op een drukke dag moest iedere TV-presentatie even duidelijk blijven vertellen hoe laat een sessie start, om welk type het gaat, in welke echte sauna of ruimte ze plaatsvindt en wie begeleidt. De eerdere layoutvarianten maakten dat onderscheid nog niet overal sterk genoeg en een lang programma mocht niet buiten beeld vallen of de volledige pagina zichtbaar verversen.

Oplossing

De informatieschermen tonen iedere sessie nu volgens één volledige basis en geven die informatie vorm in zes radicaal verschillende professionele layouts. De aangeleverde saunalocatie wordt overal via één centrale schermregel getoond en een ontbrekende locatie krijgt een Nederlandse, Franse of Engelse melding. Dertien sessies kunnen binnen het programma doorbladeren, terwijl rustige sfeerbeweging en toegankelijke animatie-instellingen het beeld aangenaam houden.

Technisch

Eén meertalige basis bewaakt de juiste ruimtebenaming en verplichte sessiegegevens. De zes TV-layouts gebruiken verschillende schermstructuren maar delen dezelfde volledige inhoud. Lange programma's wisselen alleen hun interne programmapagina; zachte beeldbeweging wordt uitgeschakeld bij reduced-motion. Beheerpreview en TV blijven gekoppeld zonder bestaande configuratie te vervangen.

Technische stappen
  1. Het scherm bouwt iedere sessie op uit uur, vertaald type, centrale ruimtebenaming en begeleider, en neemt die vier gegevens mee in de leesvolgorde.
  2. Panorama Sauna, The Barn, Stoombad en Shou Sugi Ban worden in iedere layout met dezelfde aangeleverde naam getoond.
  3. Zonder bekende ruimte verschijnt per schermtaal ‘Locatie wordt aangekondigd’, ‘Lieu bientôt annoncé’ of ‘Location to be announced’.
  4. De zes TV-structuren heten Vertrekbord, Typografisch programma, Cinematische mediafocus, Vier sauna-zones, Editorial ribbon en Event director.
  5. De beweging bestaat uit rustige pan/zoom van sfeerbeelden, een fijne paginavoortgang en een trage ticker. Er wordt geen nieuwe echte video beloofd; bestaande videoslides blijven bruikbaar. Reduced-motion zet animaties uit.
  6. Een lang programma, waaronder een dag met dertien sessies, wordt intern in passende pagina's verdeeld zonder de website opnieuw te laden.
  7. Op compact liggend is de locatie minimaal 12,8 pixels; andere tekstmaten en rijen passen zich mee aan de beschikbare hoogte aan.
  8. De beheerminiaturen en builder gebruiken dezelfde structuur als het live scherm. Bestaande ID's, configuratie, verslepen/toevoegen van blokken en opgeslagen eigen sjablonen blijven behouden.
Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 De volledige sessieregel voor iedere gastentaal bewaren
JSON
{
  "tijd": "20:00",
  "type": "Opgiet",
  "ruimte": "Panorama Sauna",
  "begeleider": "Koen",
  "alsRuimteOntbreekt": {
    "nl": "Locatie wordt aangekondigd",
    "fr": "Lieu bientôt annoncé",
    "en": "Location to be announced"
  }
}

Wat doet dit?Dezelfde vaste gegevens worden in iedere layout getoond. De aangeleverde sauna of ruimte loopt via één centrale schermregel; alleen een werkelijk ontbrekende locatie gebruikt de vertaalde melding.

Resultaat in de appGasten vinden meteen de juiste sessie, sauna en begeleider, ongeacht de gekozen TV-layout of taal.

Wijziging 2 Zes verschillende manieren om het programma te presenteren
JSON
{
  "Vertrekbord": "tijd en bestemming",
  "Typografisch programma": "groot dagoverzicht",
  "Cinematische mediafocus": "sfeerbeeld en volgende sessie",
  "Vier sauna-zones": "groepering per ruimte",
  "Editorial ribbon": "beeld met informatielint",
  "Event director": "event met programmaticker"
}

Wat doet dit?Elke naam staat voor een andere indeling, niet alleen een andere kleur. De locaties, tijden en volgende sessie krijgen per toepassing bewust een andere plaats en nadruk.

Resultaat in de appEen receptie, sauna-ingang, lounge of eventdag kan een passende professionele TV-presentatie gebruiken.

Wijziging 3 Bewegende sfeerbeelden zonder verplichte animatie
CSS
.focus-photo-image {
  animation: rustige-beeldbeweging 32s ease-in-out infinite alternate;
}
.programme-page-progress {
  height: 1px;
  opacity: .52;
}

@media (prefers-reduced-motion: reduce) {
  .focus-photo-image,
  .programme-ticker-track,
  .programme-page-progress { animation: none !important; }
}

Wat doet dit?Stilstaande sfeerfoto's krijgen een zeer rustige pan/zoom en voortgang blijft een dunne, subtiele lijn. Dit is geen nieuwe echte video; reeds beschikbare videoslides blijven los daarvan werken. De systeeminstelling voor minder beweging maakt de presentatie statisch.

Resultaat in de appHet scherm trekt zacht de aandacht zonder druk te worden en respecteert gasten die animatie liever beperken.

Wijziging 4 Dertien sessies zonder volledige paginaverversing tonen
JavaScript
const programma = sessiesVanVandaag; // 13 sessies mogelijk
const aantalPerPagina = compactLiggend ? 5 : 7;
const programmapaginas = [];

for (let start = 0; start < programma.length; start += aantalPerPagina) {
  programmapaginas.push(programma.slice(start, start + aantalPerPagina));
}

wisselAlleenProgrammapagina(volgendePagina);

Wat doet dit?Het dagprogramma wordt in groepen verdeeld die binnen de schermhoogte passen. Alleen de zichtbare groep wisselt; de website zelf blijft staan. De compacte liggende opmaak bewaart daarbij minimaal 12,8 pixels voor de locatie.

Resultaat in de appOok op een drukke dag komen alle sessies aan bod zonder overloop, kleine locatietekst of storende herlaadflits.

Wijziging 5 Voorvertoning en live scherm gelijk houden
JSON
{
  "bestaandeIdBehouden": true,
  "bestaandeConfiguratieBehouden": true,
  "miniatuurBuilderEnTvGelijk": true,
  "blokkenVerslepenEnToevoegen": true,
  "eigenSjablonenBewaren": true
}

Wat doet dit?De nieuwe vormgeving gebruikt dezelfde bestaande schermidentiteit en opslag. Een beheerder ziet in miniatuur en builder dezelfde compositie als op TV en kan de vertrouwde aanpassingen blijven uitvoeren.

Resultaat in de appGasten krijgen het scherm dat vooraf werd gekozen, zonder dat bestaande links of eigen layouts opnieuw ingesteld moeten worden.

5 wijzigingen

  • Iedere sessie vertelt gasten volledig wat, waar, wanneer en met wie: tijd, opgiet/luxe scrub/sound of live, Panorama Sauna/The Barn/Stoombad/Shou Sugi Ban en de begeleider staan altijd samen; een onbekende locatie krijgt de juiste NL/FR/EN-melding.
  • Zes nieuwe layouts geven informatie elk een eigen podium: Vertrekbord, Typografisch programma, Cinematische mediafocus, Vier sauna-zones, Editorial ribbon en Event director verschillen duidelijk in opbouw en nadruk.
  • Sfeerbeelden bewegen rustig en toegankelijk: een langzame pan/zoom, subtiele voortgang en ticker geven richting zonder onrust; verminderde beweging wordt gerespecteerd en bestaande videoslides blijven beschikbaar.
  • Een volle dag blijft zonder herlaadflits leesbaar: dertien sessies worden binnen het programma gepagineerd zonder de volledige pagina te verversen, en een locatie blijft op compact liggend minstens 12,8 pixels groot.
  • De beheerpreview voorspelt het echte gastenscherm: miniatuur en builder tonen dezelfde structuur, terwijl bestaande scherm-ID's, configuratie, sleep- en toevoegbediening en eigen opgeslagen sjablonen behouden blijven.
v1.1.91 Informatieschermen met zes heldere composities
Probleem / foutmelding

De tien beschikbare TV-sjablonen leken qua indeling nog te veel op elkaar. Daardoor kregen verschillende ruimtes niet altijd een zichtbaar eigen schermkarakter en konden voorbeelden minder goed voorspellen hoe focus, programma of een event op de echte TV zou staan. Op sommige liggende schermformaten mocht tekst bovendien groter zonder buiten beeld te raken.

Oplossing

De tien sjablonen gebruiken nu zes werkelijk verschillende professionele composities: rustig verdeeld, programmawand, filmische focus, redactioneel welkom, event als blikvanger en minimalistisch licht. Voorbeelden, beheerbuilder en TV delen dezelfde structuur. De tekst en ruimteverdeling passen zich aan grote en compacte liggende schermen aan, zonder overloop of storende paginaflits.

Technisch

De publieke informatieschermen krijgen dezelfde zes compositieregels als de voorbeelden en builder in beheer. Schaalbare typografie en begrensde schermrijen houden de inhoud leesbaar op courante TV-formaten. Een aangepaste layout wordt binnen de bestaande rustige live-weergave verwerkt, zodat het beeld niet volledig hoeft te verversen.

Technische stappen
  1. De zes composities hebben elk een eigen hiërarchie: evenwichtig verdeeld, programma voorop, grote beeldfocus, redactionele ontvangst, brede eventaankondiging of lichte typografische rust.
  2. De tien bestaande sjablonen blijven beschikbaar; meerdere sjablonen kunnen dezelfde professionele basis gebruiken met een andere sfeer of informatiedichtheid.
  3. Miniatuur, beheerbuilder en TV lezen dezelfde blokvolgorde, zichtbaarheid en breedteverdeling. Op desktop schaalt het voorbeeldenraster mee zodat alle keuzes samen zichtbaar blijven.
  4. Blokken blijven verplaatsbaar en toevoegbaar, en een aangepaste combinatie kan als eigen sjabloon worden opgeslagen.
  5. Aparte TV-regels voor brede en compacte liggende schermen begrenzen tekst en hoogte. De rustige live-update blijft dezelfde pagina gebruiken en voorkomt zo overloop en een zichtbare paginaflits.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Zes professionele presentaties voor tien TV-sjablonen
JSON
{
  "TV-sjablonen": 10,
  "presentaties": [
    "Rustig verdeeld",
    "Programmawand",
    "Filmische focus",
    "Redactioneel welkom",
    "Event als blikvanger",
    "Minimalistisch licht"
  ]
}

Wat doet dit?De tien keuzes worden niet verwijderd. Ze zijn gekoppeld aan zes echt verschillende basisopbouwen, met elk een andere verhouding tussen programma, volgende sessie, ontvangst en eventinformatie.

Resultaat in de appGasten zien een schermpresentatie die zichtbaar past bij de plek en het doel van het informatiescherm.

Wijziging 2 Voorbeeld en TV dezelfde blokverdeling laten volgen
CSS
.layout-template-list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(205px, 1fr));
  gap: 14px;
}

.template-screen-main,
.layout-main-list,
.screen-main {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
}

[data-template-composition="cinematic"] .is-focus,
[data-layout-composition="cinematic"] .screen-focus {
  overflow: hidden;
}

Wat doet dit?Miniatuur, builder en uiteindelijke TV vertrekken van dezelfde twaalfdelige verdeling en dezelfde compositiekeuze. Het meeschalende desktopraster maakt alle voorbeelden tegelijk vergelijkbaar.

Resultaat in de appWat een beheerder vooraf kiest en ziet, is herkenbaar dezelfde structuur die gasten later op het informatiescherm bekijken.

Wijziging 3 Een lokale schermindeling opnieuw kunnen gebruiken
JSON
{
  "eigenSjabloon": "Relaxruimte",
  "volgorde": ["focus", "programma", "gastinformatie"],
  "eventZichtbaar": false,
  "blokkenKunnenWordenVersleept": true,
  "blokkenKunnenWordenToegevoegd": true
}

Wat doet dit?Een beheerder kan vanuit een professioneel voorbeeld vertrekken, onderdelen toevoegen of verplaatsen en het resultaat onder een eigen naam bewaren voor later gebruik.

Resultaat in de appDe informatie voor gasten kan per receptie, sauna of relaxruimte worden afgestemd zonder telkens opnieuw te beginnen.

Wijziging 4 Leesbare typografie zonder overloop of paginaflits
CSS
@media (orientation: landscape) and (min-width: 1101px) {
  .upcoming-time time {
    font-size: clamp(2.45rem, 2.45vw, 3.15rem);
  }
  .upcoming-copy strong {
    font-size: clamp(1.35rem, 1.45vw, 1.85rem);
  }
}

@media (orientation: landscape) and (min-width: 701px) and (max-width: 1100px) {
  html, body { overflow: hidden; }
  .screen-app { height: 100vh; min-height: 0; }
  .upcoming-copy strong { font-size: .98rem; }
}

Wat doet dit?Op 1366- en 1920-brede TV's groeit de tekst gecontroleerd mee. Compact liggend krijgt eigen maten en een vaste beschikbare hoogte. De bestaande live-weergave past dit binnen dezelfde pagina toe.

Resultaat in de appGasten lezen tijden en sessienamen van verder weg, terwijl inhoud binnen beeld blijft en de pagina niet zichtbaar flitst.

4 wijzigingen

  • Tien TV-sjablonen bieden nu zes echt verschillende composities: rustig verdeeld, programmawand, filmische focus, redactioneel welkom, event als blikvanger en minimalistisch licht geven iedere ruimte een professionele eigen uitstraling.
  • Het gekozen voorbeeld komt overeen met het echte informatiescherm: miniatuur en builder tonen dezelfde blokken, volgorde en nadruk, en op desktop kunnen alle tien voorbeelden samen in een raster worden vergeleken.
  • De schermindeling blijft volledig aanpasbaar: beheerders kunnen blokken toevoegen of verslepen en een eigen combinatie als herbruikbaar sjabloon bewaren, zodat gastinformatie per locatie passend blijft.
  • Tekst blijft helder en rustig in beeld: typografie is beter afgestemd op TV's van 1366 en 1920 pixels en op compacte liggende schermen, zonder overloop of storende paginaflits.
v1.1.90 Praktische app-informatie volledig leesbaar op mobiel
Probleem / foutmelding

Op een smalle telefoon kon de vaste taalkeuze het einde van het bericht ‘Programma bijgewerkt’ bedekken. De datum en het uur stonden bovendien in dezelfde lange regel. In de lichte ontwikkelaarsstrook van de donkere Praktisch-pagina hadden het label en de naam te weinig contrast, waardoor niet alle app-informatie leesbaar was.

Oplossing

De taalkeuze blijft op mobiel bovenaan de app staan en schuift niet meer als een vaste laag over lager gelegen informatie. Het tijdstip van de programma-update staat op een eigen duidelijke regel en de ontwikkelaarsvermelding gebruikt expliciete donkere tekst op haar lichte achtergrond, ook wanneer de rest van de app in nachtmodus staat.

Technisch

De aanpassing is beperkt tot de mobiele weergave van Praktisch. De taalkeuze blijft bereikbaar, terwijl status, tijdstempel en ontwikkelaarsvermelding ieder hun eigen veilige leesruimte en passende contrastkleur krijgen.

Technische stappen
  1. De taalkiezer is op schermen tot 839 pixels gekoppeld aan de app in plaats van aan de zichtbare browserrand, zodat hij bij scrollen geen lagere inhoud bedekt.
  2. Het tijdselement wordt mobiel als afzonderlijke regel weergegeven en mag binnen de beschikbare breedte veilig afbreken.
  3. De ontwikkelaarsregel erft niet langer een lichte nachtkleur, maar krijgt tekstkleuren die bij de eigen lichte achtergrond horen.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Mobiele taalkiezer blijft bovenaan de app
CSS
@media (max-width: 839px) {
  body.public-oak-app .guest-app > .language-switch {
    position: absolute;
  }
}

Wat doet dit?De taalkeuze hoort op mobiel bij de bovenkant van de app en blijft tijdens het scrollen niet als een vaste laag boven lagere informatie hangen.

Resultaat in de appDe volledige updateboodschap blijft zichtbaar, terwijl NL, FR en EN gewoon bedienbaar blijven.

Wijziging 2 Tijdstempel op een aparte regel
CSS
.update-status {
  display: grid;
  gap: 3px;
  line-height: 1.4;
}
.update-status time {
  color: var(--ink);
  font-weight: 700;
  overflow-wrap: anywhere;
}

Wat doet dit?Datum en uur krijgen onder het korte statuslabel een eigen contrastrijke regel en mogen veilig binnen de schermbreedte afbreken.

Resultaat in de appOok een langere Nederlandstalige datum en tijd is volledig leesbaar zonder botsing of afkapping.

Wijziging 3 Vast contrast in de lichte ontwikkelaarsstrook
CSS
.developer-credit { background: #f4f3f0; }
.developer-credit .developer-copy span { color: #706a65; }
.developer-credit .developer-copy strong {
  color: #201c19;
  line-height: 1.35;
  overflow-wrap: anywhere;
}

Wat doet dit?Het label en de naam gebruiken kleuren die bij de lichte achtergrond van dit onderdeel horen en erven geen lichte tekstkleur van de nachtmodus.

Resultaat in de app‘Ontwikkeld door opgieter’ en de volledige ontwikkelaarsnaam blijven duidelijk zichtbaar.

3 wijzigingen

  • De vaste taalkiezer bedekt de update-status niet meer: op een smal telefoonscherm blijft de volledige melding zichtbaar naast de bediening voor NL, FR en EN.
  • Datum en tijd staan op een eigen duidelijke regel: de laatste programma-update is sneller te lezen en lange tijdstempels worden niet meer afgekapt.
  • De ontwikkelaarsnaam en het bijbehorende label zijn opnieuw goed leesbaar: de lichte strook gebruikt ook in nachtmodus voldoende donker contrast.
v1.1.89 Tien TV-opmaken met vrij instelbare sfeer
Probleem / foutmelding

Een schermlocatie kon uit zes stijlen kiezen, maar kleur, tekstgrootte en informatiedichtheid waren nog onderdeel van die vaste keuze. Daardoor paste een goede blokverdeling niet altijd bij de lichtinval, kijkafstand of hoeveelheid informatie op de echte TV. Op compacte liggende mediaschermen kon een lang dagprogramma bovendien als één te lange kolom buiten beeld vallen.

Oplossing

De publieke informatieschermen ondersteunen nu tien professionele layouttypes en vier onafhankelijk instelbare opmaakgroepen. Een beheerder kan per scherm White Oak, Licht, Nacht of Natuurlijk combineren met tekstgrootte, dichtheid en uitlijning. De schermweergave verwerkt die keuzes zonder volledige paginavernieuwing, bewaart het open ontwerp met weinig kaders en gebruikt op kleinere liggende schermen automatisch compacte programmakolommen.

Technisch

De TV normaliseert het nieuwe appearance-profiel naast stijl en blokken en zet de gekozen waarden als lokale schermkenmerken om naar CSS. Een gerichte liggende-schermregel herstelt de 12-kolomsindeling onder 1100 pixels en verkleint alleen daar de programmarijen. De bestaande inhoudssleutel voorkomt onnodige DOM-opbouw en een harde meta-refresh blijft afwezig.

Technische stappen
  1. De TV accepteert alleen de tien bekende stijlen en de vooraf bepaalde waarden voor kleur, tekst, dichtheid en uitlijning.
  2. Oudere opgeslagen stijlen krijgen automatisch hun vertrouwde sfeer terug wanneer nog geen apart opmaakprofiel aanwezig is.
  3. Portrait en kleine telefoonweergaven blijven stapelen; liggende mediaschermen vanaf 701 pixels gebruiken opnieuw de 12-kolomsindeling en een compacte sessieverdeling.
  4. De publieke serviceworker gebruikt cache v123 met TV-CSS v34 en TV-JavaScript v42.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Vier extra belevingsgerichte layouts
JSON
{
  "photo": "Foto & programma",
  "spotlight": "Volgende sessie",
  "eventday": "Eventdag",
  "minimal": "Minimalistisch"
}

Wat doet dit?De TV kent voor ieder nieuw type een vaste, professionele structuur die dezelfde veilige inhoudsblokken gebruikt.

Resultaat in de appLobby, sauna-ingang, restaurant of eventruimte kan een herkenbare opmaak krijgen zonder vrije en onvoorspelbare vormgeving.

Wijziging 2 Sfeer los van de layout bewaren
JSON
{
  "theme": "light",
  "textScale": "large",
  "density": "calm",
  "contentAlign": "center"
}

Wat doet dit?De TV valideert iedere opmaakwaarde en gebruikt bij een onbekende keuze altijd de leesbare White Oak-standaard.

Resultaat in de appIedere schermlocatie krijgt een passende sfeer en kijkafstandinstelling, terwijl contrast en merkstijl bewaakt blijven.

Wijziging 3 Compact liggend programma volledig in beeld
JavaScript
if (portrait || width <= 700) return 1;
if (landscape && width <= 1100) minimumColumnWidth = 250;
return Math.min(gewensteKolommen, blokLimiet, breedteLimiet);

Wat doet dit?Een telefoon blijft rustig onder elkaar scrollen; een kleine liggende mediaspeler gebruikt de beschikbare breedte om meer sessies naast elkaar te tonen.

Resultaat in de appEen programma met elf sessies blijft op 1024 bij 576 pixels volledig zichtbaar en leesbaar.

Wijziging 4 Layout bijwerken zonder volledige herlaadflits
JavaScript
if (!force && renderKey === lastRenderKey) return;
applyAppearance(layout.appearance);
renderVisibleBlocks(layout.blocks);

Wat doet dit?De TV vergelijkt eerst de zichtbare toestand en past een gewijzigde opmaak binnen de bestaande pagina toe.

Resultaat in de appPeriodieke controles en layoutkeuzes veroorzaken geen storende paginaflits of tik op het scherm.

4 wijzigingen

  • Vier extra TV-indelingen maken het aanbod compleet: Foto & programma, Volgende sessie, Eventdag en Minimalistisch geven iedere locatie een passend professioneel vertrekpunt naast de zes bestaande stijlen.
  • Sfeer en leesbaarheid zijn voortaan losse keuzes: kleur, tekstgrootte, informatiedichtheid en uitlijning kunnen vrij worden gecombineerd, met correct contrast in zowel lichte als donkere varianten.
  • Lange dagprogramma's passen ook op compacte liggende schermen: het programma kiest op basis van oriëntatie, breedte en blokruimte één of twee compacte kolommen, zodat alle sessies zichtbaar blijven.
  • Een nieuwe layout verschijnt zonder storende schermtik: de bestaande TV-pagina past stijl en blokken intern aan en bouwt alleen opnieuw op wanneer de zichtbare gegevens echt veranderen.
v1.1.88 Zes rustige TV-stijlen per locatie
Probleem / foutmelding

De informatieschermen konden wel van blokverhouding wisselen, maar alle opgeslagen voorbeelden gebruikten nog dezelfde visuele basis. Daardoor was er te weinig onderscheid tussen een scherm bij de receptie, naast de sauna, in de lobby of in een rustige avondlounge.

Oplossing

Het TV-scherm ondersteunt nu zes gecontroleerde White Oak-stijlen. Ze leggen telkens een andere nadruk op het programma, de eerstvolgende beleving, een welkom of de avondsfeer, terwijl de open rijen en subtiele scheidingslijnen behouden blijven. De indeling wordt rustig in het bestaande scherm bijgewerkt en veroorzaakt geen paginavernieuwing.

Technisch

De bestaande style-eigenschap van de TV-layout is nu een gecontroleerde visuele keuze. Het scherm past uitsluitend kleuraccenten, typografische nadruk en leesruimte aan; de verplichte planning, veilige blokzones en kaderarme basis blijven hetzelfde.

Technische stappen
  1. Het publieke scherm accepteert alleen open, signature, programme, focus, welcome, compact en evening; een onbekende waarde valt veilig terug op de standaardstijl.
  2. Blokvolgorde, zichtbaarheid en breedte blijven via hetzelfde gevalideerde layoutobject werken.
  3. De publieke serviceworker gebruikt cache v122 met TV-CSS v33 en TV-JavaScript v41.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Stijl veilig begrenzen
JavaScript
var styles = {
  open: true, signature: true, programme: true,
  focus: true, welcome: true, compact: true, evening: true
};
if (!styles[style]) style = 'open';

Wat doet dit?Het informatiescherm gebruikt alleen vooraf ontworpen stijlen en weigert onbekende waarden.

Resultaat in de appEen ongeldige instelling kan de TV-layout niet onvoorspelbaar vormgeven.

Wijziging 2 Leesnadruk per locatie
CSS
[data-layout-style="programme"] .upcoming-time time {
  font-size: 2.7rem;
}
[data-layout-style="focus"] .focus-time {
  font-size: 5.4rem;
}

Wat doet dit?De programmastijl maakt tijden groter; de focusstijl vergroot de live tijd en eerstvolgende beleving.

Resultaat in de appReceptiebezoekers lezen het uur sneller, terwijl gasten naast de sauna meer aandacht krijgen voor wat nu of straks gebeurt.

Wijziging 3 Layout wisselen zonder paginaflits
JSON
{
  "type": "whiteoak:preview-layout",
  "layout": { "style": "evening", "blocks": [] }
}

Wat doet dit?Een voorvertoning of opgeslagen layout wordt binnen de bestaande TV-pagina toegepast.

Resultaat in de appDe scherminhoud tikt of flitst niet door een volledige herlaadlus.

3 wijzigingen

  • Iedere schermlocatie kan een passende professionele sfeer krijgen: zes White Oak-voorbeelden variëren rustig in nadruk, verhouding en kleur zonder dat gasten een drukke verzameling kaarten zien.
  • Programma of beleving kan bewust voorrang krijgen: grote tijden helpen op afstand, terwijl een ruimere focusweergave de eerstvolgende sessie sterker laat spreken.
  • Wijzigingen blijven rustig verschijnen: de TV verwerkt een nieuwe stijl binnen de bestaande schermweergave, zonder harde paginavernieuwing of zichtbare tik.
v1.1.87 Open sessierijen en ruimere tv-programma's
Probleem / foutmelding

Een komende, actieve of bijzondere sessie kon in de mobiele gastenplanning nog een eigen achtergrondvlak en een groot afgetekend aftelblok krijgen. Daardoor bleef de lijst drukker dan het open overzicht waarvoor was gekozen. Op de informatieschermen stonden focus en programma bovendien nog in herkenbare panelen, en drie kolommen naast een focusblok lieten soms te weinig plaats voor langere namen.

Oplossing

Alle mobiele sessies blijven nu transparante open rijen, ongeacht hun status. De timing staat als compacte tekst bij de sessie in plaats van in een groot kader. Op tv scheiden witruimte en fijne lijnen de onderdelen zonder panelen of statusrails. Wanneer focus en programma het scherm delen, gebruikt het programma maximaal twee brede kolommen; drie kolommen blijven beschikbaar voor een programma over de volledige breedte.

Technisch

De mobiele gastenplanning past dezelfde transparante rijbasis toe op iedere status en toont startinformatie als een compacte ongekadreerde regel. De tv-stijl haalt panelen, rails en schaduwen weg bij zowel de gewone als actieve focus- en programmavarianten. De programmaberekening gebruikt de twaalfdelige layoutbreedte en de gemeten beschikbare ruimte om één, twee of alleen bij volledige breedte drie kolommen te kiezen.

Technische stappen
  1. De publieke mobiele rijstijl heeft voor iedere sessiestatus een transparante achtergrond, rechte open vorm, dunne onderlijn en geen slagschaduw.
  2. De startinformatie verliest haar kaartachtergrond, buitenrand en grote klokcontainer en wordt als compacte regel onder de sessiedetails getoond.
  3. Focuskaarten en programmarijen op tv overschrijven ook hun live-, komende en bijzondere statusvariant met de open basisstijl.
  4. Het aantal programmakolommen volgt zowel de opgeslagen layoutbreedte als de werkelijk gemeten ruimte: tot acht van de twaalf delen maximaal twee, bij volledige breedte maximaal drie.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Ook actieve mobiele sessies volledig open houden
CSS
@media (max-width: 719px) {
    :is(.timeline-row, .timeline-row.is-live,
        .timeline-row.is-featured-session,
        .timeline-row.is-unassigned) {
        background: transparent;
        border: 0;
        border-bottom: 1px solid var(--oak-line);
        border-radius: 0;
        box-shadow: none;
    }
    .ritual-cue.is-inline-signal {
        min-height: 0;
        background: transparent;
        border: 0;
        border-top: 1px solid var(--oak-line);
        border-radius: 0;
    }
}

Wat doet dit?De open rijstijl geldt expliciet voor normale, live, opvallende en nog niet toegewezen sessies. De startmelding blijft leesbaar, maar wordt niet langer als een grote aparte aftelkaart vormgegeven.

Resultaat in de appGasten overzien meer sessies tegelijk en worden niet afgeleid door extra kaders zodra een status verandert.

Wijziging 2 Tv-onderdelen met witruimte en dunne lijnen ordenen
CSS
.screen-main > [data-screen-block]:first-child:not(:last-child) {
    padding-right: 0;
    border-right: 0;
}
.focus-card,
.focus-card:is(.is-soon, .is-live, .is-afterglow),
.upcoming-row,
.upcoming-row:is(.is-featured, .is-preparing, .is-live) {
    border: 0;
    border-radius: 0;
    background: transparent;
    box-shadow: none;
}
.upcoming-row { border-bottom: 1px solid var(--line); }

Wat doet dit?De regels verwijderen de visuele panelen ook bij een gewijzigde sessiestatus. Een fijne onderlijn tussen programmarijen en de bestaande tussenruimte blijven als enige ordening over.

Resultaat in de appHet informatiescherm oogt rustig en ruim, terwijl iedere volgende sessie duidelijk herkenbaar blijft.

Wijziging 3 Gedeelde tv-layouts tot twee brede programmakolommen beperken
JavaScript
var block = layoutBlock(screenLayout(), 'programme');
var span = Math.max(1, Math.min(12, Number(block.span) || 7));
var spanLimit = span <= 4 ? 1 : (span <= 8 ? 2 : 3);
var widthLimit = Math.max(1, Math.min(3,
    Math.floor((list.clientWidth + gap) / (minimumWidth + gap))
));
return Math.max(1, Math.min(desired, spanLimit, widthLimit));

Wat doet dit?De layoutverhouding en echte schermruimte bepalen samen het aantal kolommen. Een programma dat het scherm met focus deelt kan nooit drie smalle kolommen krijgen; de derde kolom wordt alleen toegestaan bij een ruimer, volledig breed programma.

Resultaat in de appNamen, ruimtes en sessietitels blijven op afstand goed leesbaar, ook wanneer veel sessies op het scherm staan.

3 wijzigingen

  • Alle mobiele sessies vormen nu één open en transparante lijst: ook komende, actieve en bijzondere momenten krijgen geen afzonderlijk kaartvlak meer; de grote omkaderde aftelling maakt plaats voor een compacte tekstregel.
  • Focus en dagprogramma gebruiken op tv geen panelen of gekleurde zijkaders meer: witruimte en dunne scheidingslijnen houden het programma geordend zonder een druk raster van kaders.
  • Gedeelde tv-layouts tonen maximaal twee brede programmakolommen: in een 5/7- of 4/8-verdeling blijven namen en titels ruim leesbaar; alleen een volledig breed programma kan drie kolommen gebruiken.
v1.1.86 Open mobiele planning en rustige informatieschermen
Probleem / foutmelding

De mobiele gastenplanning en de informatieschermen konden nog te veel aanvoelen als een stapel afzonderlijke kaarten. Op tv was de verdeling niet voor iedere locatie even passend en periodieke controles konden onnodig dezelfde inhoud opnieuw tekenen.

Oplossing

De gastenplanning gebruikt op mobiel open, makkelijk scanbare rijen. Informatieschermen tonen focus en dagprogramma in een kaderarme, responsieve layout die per locatie kan worden afgestemd. Automatische controles laten ongewijzigde inhoud staan en bereiden een volgende dia voor voordat die zichtbaar wordt.

Technisch

De publieke mobiele lijst en tv-weergave gebruiken dezelfde open vormentaal. Het scherm ontvangt een gevalideerde layout met volgorde, verhouding en zichtbare onderdelen. Bij iedere controle wordt eerst een inhoudssleutel vergeleken; alleen echte wijzigingen worden opgebouwd. Media worden vooraf geladen en de server houdt onbekende, inactieve of onleesbare schermstate buiten de live weergave.

Technische stappen
  1. De mobiele lijst deelt de open rijstijl met de interne dagplanning en heeft geen zwaar buitenkader meer.
  2. De tv verwerkt de opgeslagen volgorde, 4/8–8/4-verhouding en zichtbare onderdelen van het gekozen schermprofiel.
  3. De schermpagina bevat geen harde meta-refresh; gelijke planning, layout en statussen leveren geen nieuwe DOM-opbouw op.
  4. Afbeeldingen en video's worden voorbereid vóór de diawissel. Onbekende of inactieve schermlinks tonen veilig dat het scherm niet beschikbaar is.
  5. Uitgeleverd met publieke cache v120, gedeelde CSS v36, thema-CSS v11, tv-CSS v31 en tv-JavaScript v39. De gekoppelde interne bediening gebruikt cache v423, HTML-cache v360 en Schermbeheer CSS v4/JavaScript v3.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 De gastenplanning als open mobiele lijst tonen
CSS
@media (max-width: 719px) {
    .public-oak-app .timeline { border: 0; }
    .public-oak-app .timeline-row {
        background: transparent;
        border: 0;
        border-bottom: 1px solid var(--oak-line);
        box-shadow: none;
    }
    .public-oak-app .timeline-row[data-session-type]::before {
        width: 8px; height: 8px; border-radius: 50%;
    }
    .public-oak-app .session-avatar-fallback {
        color: var(--oak-forest-deep);
        background: var(--oak-sage);
    }
}

Wat doet dit?Het buitenkader en de losse kaartvlakken verdwijnen op mobiel. Een klein typepunt en een contrastrijke naamweergave houden iedere sessie herkenbaar zonder extra visuele drukte.

Resultaat in de appGasten kunnen het programma sneller lezen op een telefoon en zien meteen welk soort sessie volgt.

Wijziging 2 De gekozen tv-layout responsief weergeven
CSS
.screen-main {
    display: grid;
    grid-template-columns: repeat(12, minmax(0, 1fr));
}
.screen-main > [data-screen-block="focus"] {
    grid-column: span var(--focus-span, 5);
}
.screen-main > [data-screen-block="programme"] {
    grid-column: span var(--programme-span, 7);
}
.upcoming-row {
    border: 0;
    border-bottom: 1px solid var(--line);
    border-radius: 0;
    background: transparent;
}
@media (max-width: 1100px) {
    .screen-main > [data-screen-block] { grid-column: 1 / -1; }
}

Wat doet dit?De opgeslagen verhouding wordt over twaalf delen verdeeld. Rustige scheidingslijnen vervangen zware kaarten en bij minder breedte komen de onderdelen vanzelf in één leesbare kolom.

Resultaat in de appFocus, programma en extra informatie blijven helder op grote tv's én smallere voorvertoningen, ongeacht de gekozen locatie-layout.

Wijziging 3 Alleen echte schermwijzigingen tonen
JavaScript
function render(force) {
    var renderKey = JSON.stringify([schedule.days, appliedLayout, stageStates]);
    if (!force && renderKey === lastRenderKey) return;
    lastRenderKey = renderKey;
    rebuildScreen();
}

prepareManagedMedia(nextSlide).then(function (media) {
    activatePreparedSlide(media);
});

// Geen meta-refresh: een onbekend of inactief scherm krijgt
// een veilige niet-beschikbaarmelding van de server.

Wat doet dit?Een controle vergelijkt eerst de zichtbare planning, layout en status. Zijn die gelijk, dan blijft het bestaande scherm onaangeroerd. De volgende afbeelding of video wordt geladen vóór de wissel en ongeldige schermlinks worden niet als een actief toestel behandeld.

Resultaat in de appDe tv blijft rustig staan tussen echte updates, wisselt dia's vloeiender en toont bij een verkeerde of uitgeschakelde link een veilige melding.

3 wijzigingen

  • De mobiele gastenplanning is opener en sneller te scannen: sessies staan in kaderarme rijen met een subtiel typepunt, een rustige bronvermelding en een leesbare fallback-avatar wanneer geen foto beschikbaar is.
  • Informatieschermen tonen een rustigere, responsieve layout: focus, programma, eventinformatie en gastinformatie volgen de gekozen schermindeling; leesbare kolommen en minder kaders passen zich automatisch aan de beschikbare breedte aan.
  • Planning- en layoutupdates verschijnen zonder zichtbare onrust: het tv-scherm herlaadt niet hard, tekent ongewijzigde inhoud niet opnieuw, laadt dia's vóór de wissel en vangt inactieve of ongeldige schermlinks veilig op.
v1.1.85 Gastenapp en informatieschermen blijven rustig staan
Probleem / foutmelding

Met meerdere gastenapps, informatieschermen of voorvertoningen tegelijk open kon een nieuwe serviceworker elkaar herhaaldelijk activeren. Iedere weergave reageerde daarop met een herlaadactie, waardoor de pagina zichtbaar leek te tikken of telkens opnieuw op te bouwen.

Oplossing

De gastenapp en de schermweergave registreren voortaan exact dezelfde publieke serviceworker via één vaste URL en één vaste scope. Een extra herlaadrem onthoudt bovendien het laatste updatemoment en weigert gedurende dertig seconden een volgende automatische herlaadactie. Zo blijft de inhoud rustig zichtbaar, ook wanneer meerdere tabbladen en schermen tegelijk actief zijn.

Technisch

De registratie is in beide publieke clients gelijkgetrokken naar de absolute URL /thewhiteoak/sw.js met de expliciete scope /thewhiteoak/. Bij controllerchange leest de client de laatste worker-herlaadtijd uit de sessieopslag. Alleen wanneer minstens dertig seconden verstreken zijn, schrijft hij een nieuwe tijd en voert hij één herlaadactie uit. De gastenapp en het scherm blijven daarmee automatisch bij, zonder een zichtbare lus.

Technische stappen
  1. guest.js en screen.js registreren allebei uitsluitend /thewhiteoak/sw.js.
  2. Beide registraties gebruiken expliciet de scope /thewhiteoak/, onafhankelijk van de geopende route of queryparameters.
  3. De gastenapp en schermclient gebruiken dezelfde sessiesleutel wo_public_worker_reload_at voor de dertigsecondencontrole.
  4. Na een geldige controllerchange mag de weergave één keer herladen; volgende meldingen binnen dertig seconden worden genegeerd.
  5. De voorvertoning behoudt preview=1 en blijft verder gescheiden van de heartbeat van het echte toestel.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Dezelfde serviceworker voor app, tv en preview registreren
JavaScript
var PUBLIC_WORKER_URL = '/thewhiteoak/sw.js';

navigator.serviceWorker.register(PUBLIC_WORKER_URL, {
    scope: '/thewhiteoak/',
    updateViaCache: 'none'
}).then(function (registration) {
    registration.update().catch(function () {});
});

Wat doet dit?Een absolute URL verwijst vanuit de gastenapp, de schermroute en preview=1 altijd naar hetzelfde workerbestand. De expliciete scope houdt de registratie voor alle publieke routes gelijk, ook wanneer verschillende queryparameters of tabbladen worden gebruikt.

Resultaat in de appDe gastenapp, het echte informatiescherm en de voorvertoning delen één voorspelbare updatebasis en lokken niet langer elkaars herlaadreacties uit.

Wijziging 2 Herhaalde worker-herlaadacties dertig seconden afremmen
JavaScript
var workerReloadGuardKey = 'wo_public_worker_reload_at';

function allowWorkerReload() {
    var now = Date.now();
    var lastReload = Number(sessionStorage.getItem(workerReloadGuardKey) || 0);
    if (lastReload && now - lastReload < 30000) return false;
    sessionStorage.setItem(workerReloadGuardKey, String(now));
    return true;
}

navigator.serviceWorker.addEventListener('controllerchange', function () {
    if (!allowWorkerReload()) return;
    window.location.reload();
});

Wat doet dit?De laatste automatische worker-herlaadactie wordt als tijdstempel in de huidige sessie bewaard. Komt binnen dertig seconden opnieuw een controllerchange-melding binnen, dan stopt de functie voordat de pagina nogmaals kan herladen.

Resultaat in de appZelfs bij meerdere gelijktijdig geopende schermen en tabbladen blijft elke weergave rustig en ontstaat geen zichtbare herlaadstorm.

2 wijzigingen

  • Gastenapp en informatiescherm gebruiken nu één vaste serviceworker-URL en scope: routeverschillen konden afzonderlijke update-reacties veroorzaken; beide clients registreren voortaan uitsluitend /thewhiteoak/sw.js binnen /thewhiteoak/.
  • Een herlaadrem van dertig seconden stopt opeenvolgende update-reacties: wanneer meerdere tabbladen, tv-schermen of voorvertoningen tegelijk openstaan, mag iedere weergave na een workerwissel nog maar één keer gecontroleerd herladen.
v1.1.84 Schermvoorbeelden openen schermbreed op mobiel
Probleem / foutmelding

Op sommige smalle telefoons gebruikte de schermkeuze niet de volledige beschikbare breedte. Hoewel het paneel op 100 procent stond, hield het ingebouwde dialoogvenster nog een standaard maximale breedte aan. Daardoor bleef aan de zijkant een lege strook staan.

Oplossing

De mobiele schermselector schakelt die standaard breedtebeperking nu expliciet uit. Het keuzevenster sluit daardoor aan op de volledige linker- en rechterrand van het toestel en blijft onderaan als overzichtelijk paneel openen.

Technisch

De bestaande mobiele regel met width: 100% werd nog begrensd door de standaard max-width van het native dialog-element. max-width: none verwijdert die beperking alleen op schermen tot 600 pixels. Publieke cache v117 haalt hiervoor guest.css v95 op; de bestaande JavaScriptbediening blijft ongewijzigd in guest.js v139.

Technische stappen
  1. De mobiele CSS voor .screen-launcher-dialog bevat nu max-width: none naast width: 100%.
  2. De aanpassing geldt alleen tot en met 600 pixels; grotere schermen behouden de bestaande gecentreerde maximale breedte.
  3. Publieke service-worker v117 laadt guest.css v95 met deze correctie; guest.js blijft v139. Intern wordt de wijziging aangekondigd via cache v418 en HTML-cache v355.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 De standaard dialoogbreedte op mobiel opheffen
CSS
@media (max-width: 600px) {
    .screen-launcher-dialog {
        inset: auto 0 0;
        width: 100%;
        max-width: none;
        margin: 0;
        border-width: 1px 0 0;
        border-radius: 14px 14px 0 0;
    }
}

Wat doet dit?Het paneel had al width: 100%, maar het native dialoogvenster paste daarnaast nog zijn eigen maximale breedte toe. Met max-width: none krijgt de opgegeven volle breedte echt voorrang. De positie en nulmarge houden het paneel tegen de onder-, linker- en rechterrand.

Resultaat in de appDe schermvoorbeelden openen op smalle telefoons zonder lege zijstrook in een rustig paneel dat de volledige toestelbreedte benut.

1 wijziging

  • De schermkeuze vult op mobiel nu de volledige breedte: een standaardlimiet van het dialoogvenster veroorzaakte een lege strook aan de zijkant; het paneel sluit voortaan netjes aan op beide randen van het toestel.
v1.1.83 Kies zelf welk informatiescherm je wilt bekijken
Probleem / foutmelding

Gasten konden het actuele programma op de schermen in de wellness zien, maar in de gastenapp ontbrak een duidelijke plek om die schermen zelf terug te vinden. Bij meerdere locaties was niet zichtbaar welk scherm waar stond of welk formaat het gebruikte. Een voorbeeldweergave mocht bovendien nooit de online status van het echte toestel beïnvloeden, ook niet wanneer de app tijdelijk op opgeslagen offline-inhoud terugviel.

Oplossing

Onder Praktisch staat nu een professionele knop naar de informatieschermen. Een toegankelijke dialoog toont voor ieder actief scherm het type, de naam, de locatie en het formaat. Iedere voorvertoning opent apart met preview=1. De offline opslag houdt ieder scherm en de voorbeeldmodus strikt gescheiden, zodat een bekeken voorbeeld nooit als heartbeat van een echt toestel wordt behandeld. Alle nieuwe teksten zijn beschikbaar in het Nederlands, Frans en Engels.

Technisch

De server levert uitsluitend actieve schermsamenvattingen aan de gastenpagina. De native dialoog combineert duidelijke labels met focusbeheer en een mobiele paneelweergave. Voorbeeldlinks openen met preview=1 en noopener. In publieke cache v116 wordt de cachekey opgebouwd uit de laatste screen- en previewwaarde, gelijk aan de serverinterpretatie, en uitsluitend exact gematcht. Daardoor delen verschillende schermen, preview en live geen opgeslagen HTML en blijft de heartbeat van het fysieke toestel betrouwbaar.

Technische stappen
  1. De knop en dialoog verschijnen alleen wanneer minstens één actief schermprofiel beschikbaar is.
  2. De dialoog gebruikt aria-labelledby en aria-describedby, verplaatst de focus naar Sluiten, houdt Tab binnen de geopende dialoog en zet de focus na sluiten terug op de oorspronkelijke knop.
  3. De openbare schermsamenvatting bevat alleen gegevens voor de keuzeweergave en laat inactieve profielen weg.
  4. Iedere voorbeeldlink bevat het gekozen screen-id en preview=1; de schermclient behandelt die modus zonder toestelheartbeat.
  5. De publieke service worker maakt een afzonderlijke cachekey voor screen-id en previewmodus en gebruikt bij dubbele parameters dezelfde laatste waarde als de server.
  6. Er bestaat geen algemene schermfallback meer die opgeslagen preview- en live-HTML tussen schermen of modi kan uitwisselen.
  7. Publieke cache v116 laadt guest.css v94 en guest.js v139; dezelfde cacheversie wordt in de offline-status getoond.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Een herkenbare schermknop onder Praktisch tonen
Twig
{% if screenProfiles is not empty %}
  <button class="screen-launcher-open" id="screenLauncherOpen"
          type="button" aria-haspopup="dialog"
          aria-controls="screenLauncherDialog">
    <small>Live in de wellness</small>
    <strong>Bekijk onze informatieschermen</strong>
    <span>Kies een scherm en ontdek de locatie en het formaat.</span>
  </button>
{% endif %}

Wat doet dit?De knop staat bij de praktische informatie en wordt alleen opgebouwd wanneer de server minstens één actief profiel heeft gevonden. aria-haspopup en aria-controls maken vooraf duidelijk dat de actie een dialoog opent. De korte tekst vertelt meteen wat gasten achter de knop kunnen verwachten.

Resultaat in de appGasten vinden de informatieschermen zonder een verborgen route te kennen en openen vanuit Praktisch met één duidelijke actie de juiste keuzeweergave.

Wijziging 2 Actieve schermen toegankelijk vergelijken in één dialoog
Twig / JavaScript
<dialog id="screenLauncherDialog"
        aria-labelledby="screenLauncherDialogTitle"
        aria-describedby="screenLauncherDialogIntro"
        aria-modal="true">
  {% for screen in screenProfiles %}
    <article class="screen-profile-card">
      <h3>{{ screen.name }}</h3>
      <p>{{ screen.screenTypeLabel }} · {{ screen.location }} · {{ screen.formatLabel }}</p>
    </article>
  {% endfor %}
</dialog>

screenLauncherDialog.addEventListener('close', restoreScreenLauncherFocus);
screenLauncherDialog.addEventListener('cancel', function (event) {
    event.preventDefault();
    closeScreenLauncher();
});

Wat doet dit?De titel en uitleg van de dialoog zijn programmatisch gekoppeld. Elk actief profiel krijgt één overzichtelijke kaart met de vier herkenningspunten. De sluitactie werkt ook met Escape, de focus blijft tijdens het kiezen in de dialoog en keert na sluiten terug naar de knop. Op kleine schermen plaatst CSS dezelfde inhoud als een goed leesbaar paneel onderaan.

Resultaat in de appDe schermkeuze blijft begrijpelijk en bedienbaar op desktop en mobiel, met muis, aanraking, toetsenbord en ondersteunende technologie.

Wijziging 3 Preview en echt toestel volledig apart bewaren
PHP / JavaScript
'previewUrl' => '/thewhiteoak/scherm/?screen='
    . rawurlencode($screen['id']) . '&preview=1',

var screenValues = url.searchParams.getAll('screen');
var previewValues = url.searchParams.getAll('preview');
var screenId = screenValues.length ? screenValues[screenValues.length - 1] : '';
var isPreview = previewValues.length && previewValues[previewValues.length - 1] === '1';
if (screenId) screenCacheUrl.searchParams.set('screen', screenId);
if (isPreview) screenCacheUrl.searchParams.set('preview', '1');
var screenCacheKey = screenCacheUrl.href;
var cached = await cache.match(screenCacheKey);

Wat doet dit?De link zet de schermclient expliciet in voorbeeldmodus. De service worker verwerkt screen en preview op dezelfde manier als de server, ook wanneer een URL meerdere waarden bevat. Daarna bewaart en zoekt hij uitsluitend met de volledige, exacte combinatie. Een algemene fallback naar een ander scherm of naar de live modus wordt niet gebruikt.

Resultaat in de appEen voorvertoning kan geen echte toestelstatus vervalsen en offline inhoud van het ene scherm of de ene modus verschijnt niet per ongeluk bij een ander scherm.

Wijziging 4 Alle schermteksten in drie talen aanbieden
JavaScript
var copy = {
  nl: { screenPickerTitle: 'Kies een informatiescherm', screenPreviewCta: 'Bekijk dit scherm' },
  fr: { screenPickerTitle: 'Choisissez un écran d’information', screenPreviewCta: 'Voir cet écran' },
  en: { screenPickerTitle: 'Choose an information display', screenPreviewCta: 'View this display' }
};

document.querySelectorAll('[data-i18n]').forEach(function (element) {
    element.textContent = text(element.dataset.i18n);
});

Wat doet dit?De nieuwe knop, dialoogtitel, uitleg, veldnamen, vier schermtypes, voorbeeldactie, nieuw-tabbladmelding en veiligheidsnota gebruiken dezelfde bestaande vertaalmethode als de rest van de gastenapp. Bij een taalwissel vult text de juiste waarde in alle elementen met data-i18n in.

Resultaat in de appNederlandstalige, Franstalige en Engelstalige gasten krijgen dezelfde volledige uitleg en veiligheidsinformatie in hun gekozen taal.

4 wijzigingen

  • Onder Praktisch staat een professionele knop naar onze informatieschermen: de beschikbare schermweergaven waren moeilijk terug te vinden; één herkenbare ingang brengt gasten nu rechtstreeks naar de schermkeuze.
  • Een toegankelijke en responsieve dialoog toont ieder actief scherm met type, naam, locatie en formaat: gasten kunnen eerst rustig vergelijken en daarna met toetsenbord, aanraakscherm of schermlezer het juiste voorbeeld openen.
  • Voorvertoningen blijven strikt gescheiden van echte toestellen: iedere link gebruikt preview=1 en een eigen offline-cachekey, zodat een voorbeeld nooit een toestelheartbeat nabootst of opgeslagen live-inhoud met een ander scherm verwisselt.
  • De volledige schermselector werkt in Nederlands, Frans en Engels: knop, uitleg, schermtypes, veldnamen, voorbeeldactie en veiligheidsmelding volgen onmiddellijk de gekozen taal van de gastenapp.
v1.1.82 Wellnessscherm wordt een beheerde beleving
Probleem / foutmelding

Het grote scherm kon het dagprogramma tonen, maar vormde nog geen centraal beheerde gastenbeleving. Extra foto's, video's en praktische of inspirerende informatie hadden geen vaste rubrieken, het toestelprofiel was niet duidelijk herkenbaar en een verouderde slide mocht nooit belangrijker worden dan een live of bijna startende sessie.

Oplossing

Het wellnessscherm draait nu als het professioneel beheerde profiel Wellness Live 01 voor de Wellnessruimte op 50 inch. Het verplichte dagprogramma wisselt af met geselecteerde foto's en video's uit duidelijke inhoudsrubrieken. De inhoud en toestelstatus worden automatisch bijgewerkt. Zodra een sessie live is of binnen tien minuten start, krijgt het dagprogramma altijd voorrang op de andere slides.

Technisch

Het schermprofiel, de toegestane kanalen en de gefilterde slides worden samen met de planning aan de publieke schermclient geleverd. De speler houdt Dagprogramma als eerste en verplichte afspeellijstitem, wisselt daarna media per rubriek af en controleert de bron opnieuw volgens het ingestelde interval. Een heartbeat maakt de toestelstatus zichtbaar in beheer. De prioriteitsregel omzeilt de normale slidevolgorde wanneer een sessie live is of binnen tien minuten begint.

Technische stappen
  1. Het publieke scherm ontvangt één geselecteerd profiel via het unieke screen-id wellness-live-01.
  2. De profieltaal is standaard Nederlands en het 50-inchformaat wordt in het beheer bij dit toestel bewaard.
  3. De afspeellijst begint altijd met kind schedule en voegt daarna alleen actieve slides voor dit scherm en ingeschakelde inhoudskanalen toe.
  4. Afbeeldingen worden als img en video's als automatisch afspelende, gedempte video weergegeven.
  5. De schermclient vraagt de planning zonder browsercache opnieuw op volgens refreshSeconds en bouwt bij een nieuwe schermrevision de afspeellijst opnieuw op.
  6. Buiten de voorbeeldmodus stuurt het toestel periodiek zijn screen-id, breedte en hoogte mee; daarmee kan de beheerder de online status volgen.
  7. prioritizeLive stuurt de afspeellijst naar het verplichte dagprogramma zodra een sessie actief is of nog hoogstens tien minuten verwijderd is.
Voorbeeldcode per wijziging4 voorbeelden
Wijziging 1 Wellness Live 01 stuurt het 50-inchscherm aan
JSON
{
  "id": "wellness-live-01",
  "name": "Wellness Live 01",
  "location": "Wellnessruimte",
  "sizeInches": 50,
  "orientation": "landscape",
  "language": "nl",
  "refreshSeconds": 60,
  "scheduleDuration": 45,
  "prioritizeLive": true,
  "active": true
}

Wat doet dit?Een algemeen profiel gaf niet aan welk fysiek toestel of welke ruimte werd bediend. Dit profiel legt de zichtbare naam, locatie, schermgrootte, liggende stand en standaardtaal voor één uniek screen-id vast. Ook de normale speelduur van het dagprogramma, het verversingsinterval en de livevoorrang horen bij precies dit toestel. Daardoor kan later een tweede scherm een eigen profiel krijgen zonder Wellness Live 01 te veranderen.

Resultaat in de appGasten in de Wellnessruimte zien een stabiel, professioneel ingesteld programma dat specifiek voor het 50-inchscherm is beheerd.

Wijziging 2 Dagprogramma en rubriekslides vormen één gastenafspeellijst
JavaScript / JSON
function playlistItems() {
    return [{
        kind: 'schedule',
        duration: Number(screenProfile().scheduleDuration) || 45
    }].concat(screenSlides().map(function (slide) {
        return {
            kind: 'slide',
            duration: Number(slide.duration) || 20,
            slide: slide
        };
    }));
}

{
  "channels": {
    "schedule": true,
    "events": true,
    "beauty": true,
    "practical": false,
    "brand": true
  },
  "slide": {
    "category": "events",
    "mediaUrl": "/opgietplanner/schermmedia.php?id=slide-voorbeeld",
    "isImage": true,
    "isVideo": false
  }
}

Wat doet dit?Een ongestructureerde verzameling media zou het scherm druk en onvoorspelbaar maken. playlistItems plaatst daarom eerst altijd het dagprogramma en voegt vervolgens alleen de door de server geselecteerde slides toe. De kanaalconfiguratie onderscheidt Dagprogramma, Events & rituelen, Beauty & verzorging, Praktische informatie en Sfeer & merkverhaal. Per slide bepalen isImage en isVideo hoe de media wordt weergegeven, terwijl duration de zichtbare tijd begrenst.

Resultaat in de appHet scherm wisselt het programma af met relevante foto's en video's, maar behoudt een rustige volgorde en duidelijke inhoud per rubriek.

Wijziging 3 Nieuwe inhoud wordt automatisch opgehaald en als toestelstatus gemeld
JavaScript
var url = new URL(scheduleEndpoint, location.origin);
url.searchParams.set('_screen_refresh', String(Date.now()));
url.searchParams.set('_screen_width', String(
    window.screen && window.screen.width ? window.screen.width : window.innerWidth
));
url.searchParams.set('_screen_height', String(
    window.screen && window.screen.height ? window.screen.height : window.innerHeight
));

fetch(url.toString(), { cache: 'no-store' })
    .then(function (response) {
        if (!response.ok) throw new Error('schedule ' + response.status);
        return response.json();
    })
    .then(function (next) {
        if (!validSchedule(next)) throw new Error('stale schedule');
        data = next;
        window.SCREEN_SCHEDULE = next;
        render();
        updateClock();
    });

Wat doet dit?Een televisiescherm blijft vaak de hele dag openstaan; zonder automatische controle kan het oude sessies of verouderde slides blijven tonen. Het werkelijke schermscript bouwt daarom rechtstreeks een URL vanaf scheduleEndpoint. De parameter _screen_refresh voorkomt dat een tussenliggende cache dezelfde aanvraag hergebruikt, terwijl _screen_width en _screen_height de echte toestelafmetingen meesturen. fetch vraagt de gegevens met cache: no-store op, controleert het antwoord en vervangt daarna de actieve planning via data = next. render() tekent onmiddellijk de nieuwe scherminhoud en updateClock() werkt de tijdsstatus bij.

Resultaat in de appGasten zien zonder handmatige tussenkomst actuele planning en media, terwijl het beheerplatform kan aangeven of het scherm online is en welk formaat het werkelijk doorgeeft.

Wijziging 4 Livevoorrang onderbreekt slides vanaf tien minuten voor de start
JavaScript
function shouldPrioritizeSchedule() {
    if (!screenProfile().prioritizeLive || !currentState) return false;
    if (currentState.active) return true;
    if (currentState.tomorrow || !currentState.featured) return false;
    var minutes = minutesUntil(currentState.featured);
    return minutes > 0 && minutes <= 10;
}

function playPlaylistItem() {
    var items = playlistItems();
    if (!items.length) return;
    if (playlistIndex >= items.length) playlistIndex = 0;
    if (shouldPrioritizeSchedule()) playlistIndex = 0;
    var item = items[playlistIndex];
    if (item.kind === 'slide') showManagedSlide(item.slide, item.duration);
    else showScheduleItem();
    schedulePlaylistAdvance(shouldPrioritizeSchedule() ? 10 : item.duration);
}

Wat doet dit?Sfeer- of informatieslides zijn nuttig zolang er geen dringend programmamoment is. shouldPrioritizeSchedule controleert daarom eerst of een sessie momenteel actief is. Zo niet, dan berekent de functie hoeveel minuten resteren tot de uitgelichte sessie van vandaag. Bij tien minuten of minder zet playPlaylistItem de index terug op 0, waar het verplichte dagprogramma staat, en controleert de speler om de tien seconden opnieuw.

Resultaat in de appEen live of bijna startende sessie verdwijnt nooit achter een gewone slide: gasten krijgen op tijd het relevante uur, de ruimte en de actuele sessiestatus te zien.

4 wijzigingen

  • Het wellnessscherm gebruikt nu een professioneel beheerd 50-inchprogramma: een algemeen scherm zonder herkenbaar profiel was moeilijk gericht te beheren; Wellness Live 01 koppelt de gastenweergave nu duidelijk aan de Wellnessruimte.
  • Extra slides verschijnen per inhoudsrubriek tussen de programmamomenten: losse foto's en video's misten samenhang; Events & rituelen, Beauty & verzorging, Praktische informatie en Sfeer & merkverhaal zorgen nu voor een geordende beleving.
  • Planning, media en toestelstatus actualiseren automatisch: een scherm dat lang aanstaat kon achterlopen; het haalt voortaan zelf nieuwe inhoud op en meldt zijn actuele verbinding en afmetingen aan het beheerplatform.
  • Live en bijna startende sessies krijgen altijd voorrang: een gewone slide kon het belangrijkste moment verbergen; het verplichte dagprogramma neemt nu over zodra een sessie bezig is of binnen tien minuten start.
v1.1.81 Rustige sessiestatus blijft leesbaar op mobiel
Probleem / foutmelding

De vier fasewoorden Voorbereiding, Begint zo, Bezig en Herstel werden in een smalle sessierij soms tot losse letters samengedrukt. Tijdens een live sessie kwam dezelfde status op meerdere plaatsen terug en na afloop bleef een onduidelijke stippenlijn zichtbaar. Daardoor was het programma rond het belangrijkste moment minder snel te begrijpen.

Oplossing

De vierstappenlijn is uit de mobiele dagrijen verwijderd. Binnen 15 minuten voor aanvang verschijnt één open statusstrook met een ronde minutenaftelling en de ruimte. Live toont die nog één pulserende groene stip, LIVE en ‘In {ruimte}’. Net na afloop verandert dit in één vinkje met een rustige afkoel- en drinkboodschap. Alleen de dot, signaalbalkjes en dunne onderlijn bewegen subtiel; bij de toestelinstelling voor verminderde beweging staan ze stil.

Technisch

guest.js v138 houdt de berekende sessiefasen, maar gebruikt de vierstappen-timeline niet meer in de zichtbare dagrij. syncTimelineStartSignal bouwt vanaf 15 minuten voor de start één cue, past die voor live en afterglow aan en voorkomt dubbele statusinformatie. CSS v35 zet live de lege klokwaarde om in een pulserende groene dot, animeert alleen de functionele signaalaccenten en stopt alle beweging bij prefers-reduced-motion. Publieke cache v114 zorgt dat de nieuwe JavaScript- en CSS-versies worden opgehaald.

Technische stappen
  1. guest.js v138 verwijdert de timeline-journey uit de dagrij door syncTimelineJourney met false aan te roepen.
  2. createRitualCue ondersteunt afterglow en maakt daarvoor een vinkje zonder tijdseenheid.
  3. syncTimelineStartSignal toont alleen bij soon, imminent, live of afterglow een compacte cue en verwijdert vooraf een oud exemplaar.
  4. Bij live worden klokwaarde en eenheid leeggemaakt; de vertaalbare sleutel startRailLive levert In {ruimte} in het Nederlands en overeenkomstige tekst in Frans en Engels.
  5. Bij afterglow worden sessionComplete en coolDown gebruikt, zodat de nazorgtekst eveneens meertalig blijft.
  6. white-oak-modern.css v35 verbergt de oude timeline-journey, laat de cue over de volle rij lopen en verzorgt de statusdot, signaalbalkjes en voortgangslijn.
  7. prefers-reduced-motion schakelt animaties en overgangen uit zonder informatie te verbergen.
  8. Publieke service-worker v114 laadt guest.js v138 en de gedeelde CSS v35 als nieuwe cacheversie; intern gebeurt hetzelfde via v415 en HTML v352.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Eén meertalige statusstrook vervangt de vierstappenlijn
JavaScript / CSS
var signalVisible = featured && onToday && (live || afterglow || soon || imminent);

syncTimelineJourney(row, session, stage, false);
syncTimelineStartSignal(row, session, stage, signalVisible);
state.hidden = signalVisible || !(completed || (featured && (live || afterglow || soon || imminent || preparing || stage === 'scheduled')));

function syncTimelineStartSignal(row, session, stage, visible) {
    var existing = row.querySelector('[data-timeline-start-signal]');
    if (existing) existing.remove();
    row.classList.toggle('has-start-signal', visible);
    if (!visible) return;

    var cue = createRitualCue(session, stage);
    if (!cue) return;
    var minutes = Math.max(1, minutesUntil(session.startsAt));
    cue.classList.add('is-inline-signal', 'timeline-start-signal');
    cue.dataset.timelineStartSignal = '';
    cue.style.setProperty('--ritual-progress', sessionJourneyProgress(session, stage) + '%');
    cue.setAttribute('aria-label', sessionStageLabel(stage) + '. ' + session.room + '.');

    var unit = cue.querySelector('.ritual-cue-clock small');
    var value = cue.querySelector('.ritual-cue-clock b');
    var label = cue.querySelector('.ritual-cue-copy small');
    var detail = cue.querySelector('.ritual-cue-copy strong');
    if (stage === 'live') {
        value.textContent = '';
        unit.textContent = '';
        label.textContent = text('liveSessionShort').toUpperCase();
        detail.textContent = replace(text('startRailLive'), { room: session.room });
    } else if (stage === 'afterglow') {
        value.textContent = '✓';
        unit.textContent = '';
        label.textContent = text('sessionComplete');
        detail.textContent = text('coolDown');
    } else if (stage === 'imminent') {
        detail.textContent = replace(text('startRailImminent'), { room: session.room });
    } else {
        detail.textContent = replace(text('startRailSoon'), { room: session.room });
    }
    row.appendChild(cue);
}

.public-oak-app .timeline-row .timeline-journey,
.internal-oak-app .session-row .row-journey { display: none !important; }

.public-oak-app .ritual-cue.is-inline-signal.is-live .ritual-cue-clock b,
.internal-oak-app .ritual-cue.is-inline-signal.is-live .ritual-cue-clock b {
    width: 10px;
    height: 10px;
    display: block;
    border-radius: 50%;
    background: var(--start-rail-accent);
    animation: oakLiveDotPulse 1.35s ease-in-out infinite;
}

@media (prefers-reduced-motion: reduce) {
    .white-oak-modern *,
    .white-oak-modern *::before,
    .white-oak-modern *::after { scroll-behavior: auto !important; animation: none !important; transition: none !important; }
}

Wat doet dit?Dit is representatieve code uit guest.js v138 en white-oak-modern.css v35. De eerste regels zetten de oude timeline altijd uit en maken alleen voor de actuele uitgelichte sessie een nieuw signaal. syncTimelineStartSignal verwijdert eerst een eerder signaal, neemt daarna de fase uit createRitualCue over en vervangt live of afterglow door precies de korte inhoud die gasten nodig hebben. De teksten lopen via de bestaande vertaalfuncties. CSS verbergt de oude stappenlijn definitief en tekent van de lege live-klok één groene dot; de reduced-motion-regel houdt dezelfde betekenis zichtbaar zonder animatie.

Resultaat in de appOp kleine schermen blijven tijd, LIVE, ruimte en nazorg in één oogopslag leesbaar, zonder herhaalde statuswoorden, losse letters of een achterblijvende stippenlijn.

1 wijziging

  • De gastenapp toont op mobiel één rustige, duidelijke statusstrook voor bijna starten, live en net afgerond, met ruimte, aftelling en passende nazorg.
v1.1.80 Gastenprogramma blijft automatisch bij zonder onnodig herladen
Probleem / foutmelding

Een gastenapp of tv-scherm dat langere tijd open bleef kon een eerdere planning of vorige kalenderdag blijven tonen totdat iemand handmatig vernieuwde. Een vaste harde herlaadbeurt iedere minuut zou dit oplossen, maar zou tegelijk storend zijn tijdens het lezen van details of invullen van een formulier en onnodig veel navigaties veroorzaken wanneer niets was gewijzigd.

Oplossing

De gastenapp controleert voortaan de inhoudsrevision van het actuele programma. Na 15 seconden, daarna iedere 60 seconden en onmiddellijk bij reconnect, pageshow of opnieuw zichtbaar worden vergelijkt zij revision en dag. Alleen bij andere inhoud wordt de pagina vernieuwd, en niet zolang een dialoog, modal of formulierveld actief is. Aftellingen en live-statussen blijven onafhankelijk iedere 30 seconden lokaal bewegen. Het tv-scherm haalt elke minuut verse planning zonder cache op en herberekent de sessiestatus iedere 15 seconden.

Technisch

De oplossing scheidt gegevensactualiteit van tijdactualiteit. guest.js v137 controleert iedere minuut een revision die alleen verandert wanneer zichtbare planninginhoud of de dag verandert. Daardoor hoeft de pagina niet iedere minuut hard te herladen. Een aparte lokale lus werkt klok en statussen iedere 30 seconden bij. screen.js v35 ververst zijn JSON wel iedere minuut in dezelfde pagina en rendert iedere 15 seconden opnieuw. De server beschermt de spreadsheet met een cache-TTL van 60 seconden, terwijl het endpoint zelf no-store blijft zodat browsers en service workers geen oude JSON tussen de controles plaatsen.

Technische stappen
  1. De revision is een 20 tekens lange SHA-256-afleiding van todayIso, isFallback, days, calendar en hosts.
  2. Tijdstempels zoals generatedAt en checkedAt zijn niet opgenomen, zodat dezelfde planning dezelfde revision behoudt.
  3. guestBuildSchedule gebruikt data/cache/guest-schedule-v32.json met een TTL van 60 seconden en voegt revision toe aan nieuwe, gecachete en laatst geldige planning.
  4. checkScheduleRevision vraagt het publieke schermendpoint op met cache: no-store en vergelijkt next.revision en next.todayIso met de geladen planning.
  5. scheduleRefreshIsBlocked voorkomt navigatie wanneer een dialog, aria-modal of INPUT, TEXTAREA of SELECT actief is.
  6. Een gelijkblijvende revision veroorzaakt geen harde reload; de lokale 30-secondenlus blijft wel daglabels, klok en sessiestatus bijwerken.
  7. Het online-event vraagt meteen verse planning en start direct de revisioncontrole; pageshow en visibilitychange doen hetzelfde.
  8. Het tv-scherm gebruikt een no-store fetch iedere 60 seconden en voert render plus updateClock iedere 15 seconden uit.
  9. Het tv-scherm controleert zijn service-workerregistratie iedere 300.000 milliseconden en gebruikt meta refresh 900 als vangnet.
  10. De JSON-response heeft Cache-Control: no-store, no-cache, must-revalidate, max-age=0; ook de publieke en interne service worker behandelen dit endpoint als no-store.
  11. Bij offline gebruik weigert de revisioncheck te navigeren en blijft de bestaande door de service worker opgeslagen inhoud zichtbaar.
  12. Deze release gebruikt publieke service-worker v113, guest.js v137 en screen.js v35; de interne app controleert service-worker v414 met HTML v351 eveneens iedere vijf minuten.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Gastenapp inhoud laten vergelijken en alleen bij wijziging herladen
JavaScript
function scheduleRefreshIsBlocked() {
    var active = document.activeElement;
    return !!document.querySelector('dialog[open], [aria-modal="true"]')
        || !!(active && /^(INPUT|TEXTAREA|SELECT)$/.test(active.tagName));
}

function checkScheduleRevision() {
    if (scheduleCheckPromise || scheduleReloading || document.hidden || navigator.onLine === false) return scheduleCheckPromise;
    var base = String(window.GUEST_BASE || '/thewhiteoak').replace(/\/$/, '');
    var endpoint = new URL(base + '/scherm/data.php', location.origin);
    endpoint.searchParams.set('_app_check', Date.now());
    scheduleCheckPromise = fetch(endpoint.toString(), {
        cache: 'no-store',
        credentials: 'same-origin',
        headers: { Accept: 'application/json' }
    }).then(function (response) {
        if (!response.ok) throw new Error('schedule ' + response.status);
        return response.json();
    }).then(function (next) {
        if (!next || !next.revision || !next.todayIso) return false;
        var changed = (scheduleRevision && next.revision !== scheduleRevision) || next.todayIso !== data.todayIso;
        if (!scheduleRevision) scheduleRevision = next.revision;
        if (!changed || scheduleRefreshIsBlocked()) return false;
        scheduleRevision = next.revision;
        scheduleReloading = true;
        var url = new URL(location.href);
        url.searchParams.set('_schedule', Date.now());
        location.replace(url.toString());
        return true;
    }).catch(function () { return false; }).then(function (result) {
        scheduleCheckPromise = null;
        return result;
    });
    return scheduleCheckPromise;
}

window.addEventListener('online', function () {
    updateConnectionStatus();
    try { sessionStorage.removeItem('wo_guest_stale_reload'); } catch (error) {}
    requestFreshSchedule();
    checkScheduleRevision();
});
window.setTimeout(checkScheduleRevision, 15000);
window.setInterval(function () { syncCurrentDay(); updateDynamicContent(); }, 30000);
window.setInterval(checkScheduleRevision, 60000);

Wat doet dit?Dit is de werkelijke publieke revisioncontrole. De fetch omzeilt cache, vergelijkt revision en todayIso en navigeert uitsluitend bij een inhoudswijziging. De blokkeerfunctie beschermt actieve dialogen en velden. De 30-secondenlus blijft alleen lokale tijd- en statusinformatie bijwerken. Bij reconnect worden zowel een vers verzoek als de revisioncontrole onmiddellijk gestart.

Resultaat in de appGasten zien actuele sessies en statussen zonder periodieke harde herlaadbeurten, onderbroken formulieren of een handmatige vernieuwactie na reconnect.

Wijziging 2 Stabiele revision combineren met zelfstandig actueel tv-scherm
PHP / JavaScript / HTML
function guestScheduleRevision(array $schedule): string
{
    $snapshot = [
        'todayIso' => $schedule['todayIso'] ?? '',
        'isFallback' => !empty($schedule['isFallback']),
        'days' => $schedule['days'] ?? [],
        'calendar' => $schedule['calendar'] ?? [],
        'hosts' => $schedule['hosts'] ?? [],
    ];
    return substr(hash('sha256', (string)json_encode($snapshot, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)), 0, 20);
}

$scheduleCache = dirname(__DIR__, 2) . '/data/cache/guest-schedule-v32.json';
if (file_exists($scheduleCache) && time() - filemtime($scheduleCache) < 60) {
    $cachedSchedule = json_decode((string)file_get_contents($scheduleCache), true);
}

header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');

var options={cache:'no-store',credentials:'same-origin',headers:{Accept:'application/json'}};
refreshPromise=fetch(url.toString(),options).then(function(response){
    if(!response.ok)throw new Error('schedule '+response.status);
    return response.json()
});
window.setInterval(function(){
    if(data.todayIso!==brusselsTodayIso())refreshSchedule();
    else{render();updateClock()}
},15000);
window.setInterval(refreshSchedule,60000);
window.addEventListener('online',refreshSchedule);
window.addEventListener('pageshow',refreshSchedule);
document.addEventListener('visibilitychange',function(){if(!document.hidden)refreshSchedule()});
window.setInterval(function(){registration.update().catch(function(){})},300000);

<meta http-equiv="refresh" content="900">

Wat doet dit?De gedeelde PHP-laag maakt een inhoudsgebonden hash en hergebruikt het nieuwe cachebestand maximaal 60 seconden. De JSON-response zelf is no-store. Het tv-script haalt die response iedere minuut op, rekent de dag en statussen iedere 15 seconden opnieuw uit en controleert bij relevante browsergebeurtenissen direct. De service-workercontrole na vijf minuten en meta-refresh na 900 seconden vormen extra vangnetten.

Resultaat in de appEen langdurig geopend tv-scherm en de gastenapp volgen zelfstandig planningwijzigingen en dagwissels, terwijl offline de laatste bruikbare inhoud in beeld blijft.

2 wijzigingen

  • De gastenapp controleert automatisch een stabiele planningrevision en herlaadt alleen bij gewijzigde inhoud of een nieuwe dag, zonder geopende details of formulierinvoer te onderbreken.
  • Het tv-scherm, de 60-seconden servercache, no-store endpoint, reconnect en service-workercontroles houden het programma zelfstandig actueel en bewaren offline de laatst beschikbare inhoud.
v1.1.79 Live melding leest rustiger zonder herhaalde statuswoorden
Probleem / foutmelding

Tijdens een live sessie herhaalde de compacte rail dezelfde boodschap in de klok, de eenheid en de fasecopy. LIVE, BEZIG, NU LIVE en een hoofdtekst dat de beleving bezig was stonden tegelijk in één kleine zone. Hierdoor bleef de startmelding druk, hoewel de vorm zelf al compacter was gemaakt.

Oplossing

De live melding toont ieder gegeven nu één keer. De klok bevat alleen LIVE en de lege eenheidsregel wordt verborgen. De fase toont de juiste taalvariant van Nu live en de hoofdtekst vermeldt uitsluitend In gevolgd door de ruimte. De sleutels voor Nederlands, Frans en Engels zijn aangepast, zodat iedere taal dezelfde rustige hiërarchie gebruikt. De interne opgietplanner gebruikt parallel Nu bezig en In {ruimte}.

Technisch

guest.js v136 laat de bestaande statusberekening intact en vereenvoudigt alleen de zichtbare live-copy. De eenheid wordt een lege string, liveNow levert de fase in de gekozen taal en startRailLive bevat uitsluitend de locatiezin. Gedeelde CSS v34 verbergt de lege eenheid via :empty. Daardoor verandert er niets aan timing, ruimtekeuze of toegankelijkheidslabel, maar verdwijnt de tekstuele herhaling.

Technische stappen
  1. createRitualCue blijft LIVE in het hoofddeel van de klok zetten; syncTimelineStartSignal maakt bij de live fase alleen het small-element leeg.
  2. De CSS-selector voor .ritual-cue-clock small:empty gebruikt display: none en verwijdert daardoor ook de eerder gereserveerde ruimte.
  3. sessionStageLabel('live') blijft liveNow gebruiken voor de vertaalde fase Nu live, En direct of Live now.
  4. De live hoofdtekst wordt opgebouwd met replace(text('startRailLive'), { room: session.room }).
  5. startRailLive is aangepast naar 'In {room}' voor Nederlands, 'Dans {room}' voor Frans en 'In {room}' voor Engels.
  6. De interne app gebruikt dezelfde vereenvoudiging met Nu bezig en 'In ' + data.room.
  7. Publieke cache v112 verwijst naar guest.js v136 en gedeelde CSS v34; interne cache v413 en HTML v350 laden de parallelle wijziging.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 De publieke live rail met bestaande vertaalhelpers vereenvoudigen
JavaScript / CSS
var unit = cue.querySelector('.ritual-cue-clock small');
var detail = cue.querySelector('.ritual-cue-copy strong');
if (stage === 'live') {
    unit.textContent = '';
    detail.textContent = replace(text('startRailLive'), { room: session.room });
} else if (stage === 'imminent') {
    detail.textContent = replace(text('startRailImminent'), { room: session.room });
} else {
    detail.textContent = replace(text('startRailSoon'), { room: session.room });
}

.public-oak-app .ritual-cue.is-inline-signal .ritual-cue-clock small:empty,
.internal-oak-app .ritual-cue.is-inline-signal .ritual-cue-clock small:empty { display: none; }

Wat doet dit?De werkelijke live-tak maakt alleen de kleine klokeenheid leeg en vult de hoofdtekst via de bestaande replace- en text-helpers met startRailLive. Die sleutel bevat In {room}, Dans {room} of In {room}; de fase blijft via sessionStageLabel en liveNow vertaald. De gedeelde :empty-regel zorgt dat de lege eenheid ook visueel geen plaats inneemt.

Resultaat in de appGasten zien een korte live-hiërarchie zonder dubbele statuswoorden: LIVE, de live-fase in hun taal en alleen de juiste ruimte.

1 wijziging

  • De live rail toont voortaan alleen LIVE, één vertaalde live-fase en In {ruimte}, zodat gasten de actuele status zonder herhaling kunnen lezen.
v1.1.78 Een rustige aftelling wijst de weg naar de volgende sessie
Probleem / foutmelding

Kort voor de start zette een mobiele CSS-regel de startmelding automatisch in een vrije gridcel. Daardoor belandde de aftelling soms in een veel te smalle kolom, brak de tekst onnodig af en ontstonden lange sessieblokken met lege ruimte. Het extra kader rond de melding stond bovendien binnen de sessierij en maakte het programma visueel druk.

Oplossing

De startmelding staat nu vast over de volledige breedte onder de sessiegegevens. Een vlakke en compacte statusrail vervangt het kader-in-kader. Korte faseboodschappen, een subtiel pulserende statusdot, bewegende signaalbalkjes en een rustige voortgangslijn tonen wanneer een sessie binnen 15 minuten begint, bijna start of live is. Wie minder beweging heeft ingesteld, ziet dezelfde informatie zonder animatie. De interne opgietplanner gebruikt dezelfde verbeterde weergave.

Technisch

De planninggegevens waren correct; alleen de mobiele CSS-plaatsing van de dynamisch toegevoegde melding ging fout. De publieke tijdlijn reserveert de named area signal over alle kolommen. Gedeelde CSS v33 bewaart op mobiel expliciet grid-area: signal, grid-column: 1 / -1 en margin: 9px 0 0. guest.js v135 levert kortere fasecopy. De voortgangslijn gebruikt width: var(--ritual-progress), haar achtergrond volgt de statuskleur en oakStartRailProgress animeert alleen de opacity. De klokdot en signaalbalkjes gebruiken respectievelijk oakStartRailPulse en oakSignalWave.

Technische stappen
  1. De publieke .timeline-start-signal behoudt de named grid area signal en overspant met grid-column: 1 / -1 de volledige sessierij.
  2. De eerdere mobiele combinatie grid-column: auto en grid-row: auto veroorzaakte impliciete gridplaatsing en is voor de startmelding verwijderd.
  3. De statusrail heeft geen buitenkaart of afzonderlijk gevuld klokvak meer en gebruikt een compacte driedelige indeling.
  4. guest.js v135 kiest kortere tekst op basis van de fasen soon, imminent en live en blijft de actuele tijd als bron gebruiken.
  5. De voortgangslijn krijgt haar actuele lengte via width: var(--ritual-progress) en gebruikt oakStartRailProgress uitsluitend voor een rustige opacity-animatie. De klokdot pulseert met oakStartRailPulse en de signaalbalkjes bewegen met oakSignalWave.
  6. prefers-reduced-motion schakelt de beweging uit, terwijl de aftelling, fase, ruimte en voortgangspositie zichtbaar blijven.
  7. Publieke cache v111 haalt gedeelde CSS v33 en guest.js v135 op; interne cache v412 en HTML v349 laden dezelfde structuur in de opgietplanner.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 De publieke aftelling in haar gereserveerde gridzone houden
CSS
@media (max-width: 719px) {
  .public-oak-app .timeline-row .timeline-start-signal,
  .internal-oak-app .session-row .row-start-signal {
    grid-area: signal;
    grid-column: 1 / -1;
    margin: 9px 0 0;
  }
}

Wat doet dit?De mobiele regel koppelt de startmelding expliciet aan de bestaande named area signal en laat die met grid-column: 1 / -1 alle kolommen overspannen. De marge van 9 pixels bewaart een rustige afstand tot de sessiegegevens. grid-row: auto is bewust niet aanwezig, zodat de melding niet opnieuw automatisch in een smalle vrije cel kan worden geplaatst.

Resultaat in de appDe startstatus staat netjes onder de volledige sessie en alle tekst blijft op telefoonformaat goed leesbaar.

Wijziging 2 Korte gastgerichte tekst voor iedere startfase kiezen
JavaScript
var unit = cue.querySelector('.ritual-cue-clock small');
var detail = cue.querySelector('.ritual-cue-copy strong');
if (stage === 'live') {
  unit.textContent = text('stageLive');
  detail.textContent = replace(text('startRailLive'), { room: session.room });
} else if (stage === 'imminent') {
  detail.textContent = replace(text('startRailImminent'), { room: session.room });
} else {
  detail.textContent = replace(text('startRailSoon'), { room: session.room });
}

Wat doet dit?De fase wordt nog steeds uit de werkelijke starttijd berekend. Per fase verschijnt nu één korte vertaalbare boodschap. De ruimte wordt in de hoofdtekst ingevuld, terwijl de klok het resterende aantal minuten of de live-status afzonderlijk toont.

Resultaat in de appGasten weten snel waar zij moeten zijn en wat de actuele fase is, zonder lange of herhaalde tekst in de kaart.

Wijziging 3 Rustige beweging tonen en de systeemvoorkeur respecteren
CSS
.public-oak-app .ritual-cue.is-inline-signal::after,
.internal-oak-app .ritual-cue.is-inline-signal::after {
  width: var(--ritual-progress);
  height: 2px;
  border-radius: 0 2px 2px 0;
  background: var(--start-rail-accent);
  animation: oakStartRailProgress 1.8s ease-in-out infinite;
}

.public-oak-app .ritual-cue.is-inline-signal:is(.is-imminent, .is-live) .ritual-cue-clock::before,
.internal-oak-app .ritual-cue.is-inline-signal:is(.is-imminent, .is-live) .ritual-cue-clock::before {
  animation: oakStartRailPulse 1.25s ease-in-out infinite;
}

.public-oak-app .ritual-cue.is-inline-signal.is-soon .ritual-cue-signal i,
.internal-oak-app .ritual-cue.is-inline-signal.is-soon .ritual-cue-signal i {
  animation: oakSignalWave 2.4s ease-in-out infinite;
}
.public-oak-app .ritual-cue.is-inline-signal.is-imminent .ritual-cue-signal i,
.internal-oak-app .ritual-cue.is-inline-signal.is-imminent .ritual-cue-signal i {
  animation: oakSignalWave 1.15s ease-in-out infinite;
}
.public-oak-app .ritual-cue.is-inline-signal.is-live .ritual-cue-signal i,
.internal-oak-app .ritual-cue.is-inline-signal.is-live .ritual-cue-signal i {
  animation: oakSignalWave .95s ease-in-out infinite;
}

@media (prefers-reduced-motion: reduce) {
  .public-oak-app .ritual-cue.is-inline-signal::after,
  .internal-oak-app .ritual-cue.is-inline-signal::after,
  .public-oak-app .ritual-cue.is-inline-signal .ritual-cue-clock::before,
  .internal-oak-app .ritual-cue.is-inline-signal .ritual-cue-clock::before {
    animation: none;
  }
}

Wat doet dit?De pulserende dot is het ::before-element van .ritual-cue-clock en gebruikt in de fasen imminent en live oakStartRailPulse. De signaalbalkjes gebruiken oakSignalWave met een fasegebonden tempo. De voortgangslijn krijgt haar lengte via width: var(--ritual-progress), gebruikt de statuskleur als achtergrond en animeert met oakStartRailProgress alleen haar opacity. De bestaande prefers-reduced-motion-regels stoppen de beweging automatisch.

Resultaat in de appHet naderende startmoment trekt professioneel aandacht zonder onrust en blijft toegankelijk voor gasten die minder beweging verkiezen.

3 wijzigingen

  • De aftelling beslaat op mobiel altijd de volledige sessierij en veroorzaakt geen smalle kolom of uitzonderlijk hoog blok meer.
  • Een vlakke statusrail met korte faseboodschappen, subtiele statusdot, signaalbalkjes en voortgangslijn vervangt het drukke kader-in-kader.
  • Dezelfde duidelijke startbeleving werkt in de gastenapp en opgietplanner en respecteert de instelling voor minder beweging.
v1.1.77 Rustige sessieaccenten blijven nu ook in nachtmodus zichtbaar
Probleem / foutmelding

De gewone mobiele sessies hadden geen zware buitenkaders meer, maar een later geladen nachtmodusstijl overschreef nog twee onderdelen. De subtiele kleurband van een uitgelichte sessie verdween en het sound-healerblok kreeg opnieuw een gevulde achtergrond. Daardoor was de vernieuwde rustige opmaak in nachtmodus niet gelijk aan de lichte modus.

Oplossing

Theme-switcher CSS v10 bevat nu als laatste stijllaag de definitieve mobiele nachtmodusregels. Uitgelichte, live en speciale sessies krijgen in de gastenapp en interne app dezelfde rustige gradient en een smalle accentlijn van 3 pixels. De sound-healerinformatie blijft transparant en staat zonder genest kader bij de sessie.

Technisch

Theme-switcher.css wordt bewust als laatste geladen. Daarom bevat versie 10 de mobiele selectors opnieuw binnen html[data-wo-theme="dark"]. De regels wijzigen alleen de nachtmoduskleuren, de 3px-accentlijn en de transparantie van de sound-healerinformatie. De open sessiestructuur uit gedeelde CSS v32 blijft daardoor intact zonder zwaardere specificiteitsmiddelen.

Technische stappen
  1. De nachtmodusstijl wordt na de gedeelde stylesheet geladen en bevat daarom zelf de definitieve mobiele overschrijvingen.
  2. Alle correcties staan onder html[data-wo-theme="dark"] en max-width 719px, zodat de lichte modus en ruimere schermen niet veranderen.
  3. De echte selectors voor uitgelichte, live en speciale rijen van de publieke en interne app delen dezelfde gradient- en accentopbouw.
  4. De publieke .timeline-live-with en interne .session-person small.is-live-partner krijgen in de laatste laag opnieuw background: transparent.
  5. Publieke cache v110 en interne cache v411 met HTML v348 verwijzen naar gedeelde CSS v32 en thema-CSS v10.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Uitgelichte en live sessies in nachtmodus rustig markeren
CSS
@media (max-width: 719px) {
  html[data-wo-theme="dark"] body.public-oak-app .timeline-row.is-featured-session,
  html[data-wo-theme="dark"] body.public-oak-app .timeline-row.is-live-special,
  html[data-wo-theme="dark"] body.internal-oak-app .session-row.is-current-focus,
  html[data-wo-theme="dark"] body.internal-oak-app .session-row.is-live-special {
    background: linear-gradient(90deg, rgba(209, 175, 81, .12), rgba(209, 175, 81, .025) 72%, transparent);
    border: 0;
    border-bottom: 1px solid #544c34;
    border-radius: 0;
    box-shadow: inset 3px 0 0 #d1af51;
  }

  html[data-wo-theme="dark"] body.public-oak-app .timeline-row.is-live,
  html[data-wo-theme="dark"] body.internal-oak-app .session-row.is-current-focus[data-stage="live"],
  html[data-wo-theme="dark"] body.internal-oak-app .session-row[data-stage="live"] {
    background: linear-gradient(90deg, rgba(111, 174, 132, .14), rgba(111, 174, 132, .03) 72%, transparent);
    border-bottom-color: #45604f;
    box-shadow: inset 3px 0 0 #6fae84;
  }
}

Wat doet dit?De selectors gebruiken de werkelijke nachtmodusstatus van de pagina en de bestaande statusklassen van beide apps. De gouden en groene varianten volgen dezelfde rustige opbouw en gebruiken exact 3 pixels voor het linkeraccent, zonder een volledig kaartkader terug te brengen.

Resultaat in de appGasten herkennen de volgende, live of speciale sessie direct, ook wanneer nachtmodus actief is, zonder dat het programma opnieuw druk oogt.

Wijziging 2 Sound-healerinformatie transparant houden in de laatste stijllaag
CSS
@media (max-width: 719px) {
  html[data-wo-theme="dark"] body.public-oak-app .timeline-row .timeline-live-with,
  html[data-wo-theme="dark"] body.internal-oak-app .session-person small.is-live-partner {
    background: transparent;
    border-radius: 0;
  }
}

Wat doet dit?Omdat het themabestand na gedeelde CSS v32 komt, zet deze gerichte regel de achtergrond daar definitief op transparant. De inhoud, profielfoto en compacte groepering blijven behouden; alleen het onnodige gevulde binnenkader verdwijnt.

Resultaat in de appDe live samenwerking blijft zichtbaar als onderdeel van dezelfde sessie en veroorzaakt geen kader-in-kader meer in mobiele nachtmodus.

2 wijzigingen

  • Uitgelichte, live en speciale sessies behouden in mobiele nachtmodus hun rustige gradient en accentlijn van 3 pixels.
  • De informatie over de sound healer blijft transparant zonder genest kader, zowel in de gastenapp als interne app.
v1.1.76 Dagprogramma oogt rustiger zonder losse kaartkaders
Probleem / foutmelding

Op mobiele schermen kreeg iedere sessie een eigen afgerond kader. Een livesessie bevatte bovendien aparte kaders voor de sound healer en het thema met de warmtebeleving. Deze opeenstapeling maakte het programma druk en liet gewone sessies even zwaar ogen als de volgende of live sessie.

Oplossing

Het mobiele dagprogramma is nu één doorlopend overzicht met rustige lijnen tussen de sessies. Gewone sessies hebben geen afzonderlijk kaartkader meer. Alleen de volgende, live of speciale sessie krijgt een zachte kleurband en een smalle accentlijn. Informatie over de sound healer en het thema met de warmte staat compacter in dezelfde sessie, zonder kader-in-kader. Dit geldt in de gastenapp en interne app, zowel in lichte als nachtmodus.

Technisch

De inhoud en werking van het programma veranderen niet. Gedeelde CSS v32 verlaagt alleen het visuele gewicht van de mobiele tijdlijn: gewone rijen worden open weergegeven, belangrijke statusrijen krijgen een beperkt accent en aanvullende gegevens blijven zonder extra kaartlaag bij hun sessie staan. Dezelfde regels en kleurvariabelen worden door de gastenapp en interne app gebruikt.

Technische stappen
  1. Op mobiele breedtes maakt gedeelde CSS v32 gewone tijdlijnrijen transparant en verwijdert die de volledige rand, afronding en schaduw.
  2. Een dunne scheidingslijn tussen de rijen vervangt de reeks afzonderlijke kaarten.
  3. De statusklassen voor volgende, live en speciale sessies voegen doelgericht een lichte achtergrond en linkeraccent toe.
  4. Sound-healer- en thema-informatie blijven onderdeel van dezelfde klikbare sessie en krijgen een compacte transparante presentatie.
  5. Publieke cache v109, interne cache v410 met HTML v347 en gedeelde CSS v32 voorkomen dat een oudere kaderopmaak bewaard blijft.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Van losse sessiekaarten één mobiele tijdlijn maken
CSS
@media (max-width: 719px) {
  .public-oak-app .timeline {
    gap: 0;
    border-block: 1px solid var(--oak-line);
  }

  .public-oak-app .timeline-row {
    background: transparent;
    border: 0;
    border-bottom: 1px solid var(--oak-line);
    border-radius: 0;
    box-shadow: none;
  }
}

Wat doet dit?De tijdlijn krijgt een rustige begrenzing als geheel. Elke gewone sessie gebruikt alleen nog een dunne lijn naar de volgende rij; de volledige kaartomtrek en schaduw worden verwijderd.

Resultaat in de appGasten lezen het dagprogramma als één samenhangende planning in plaats van als een stapel zware kaarten.

Wijziging 2 Volgende, live en speciale sessies herkenbaar houden
CSS
@media (max-width: 719px) {
  .public-oak-app .timeline-row.is-featured-session,
  .public-oak-app .timeline-row.is-live-special {
    background: linear-gradient(90deg,
      rgba(193, 154, 52, .10),
      rgba(193, 154, 52, .025) 72%,
      transparent);
    box-shadow: inset 3px 0 0 var(--oak-gold);
  }

  .public-oak-app .timeline-row.is-live {
    background: linear-gradient(90deg,
      rgba(79, 142, 100, .13),
      transparent);
    box-shadow: inset 3px 0 0 #4f8e64;
  }
}

Wat doet dit?De toepassing voegt het accent uitsluitend toe op basis van de bestaande sessiestatus. Een belangrijke sessie krijgt een zachte kleurband en één smalle lijn, terwijl alle andere rijen visueel rustig blijven.

Resultaat in de appDe relevante sessie trekt voldoende aandacht zonder dat het volledige programma opnieuw druk wordt.

Wijziging 3 Sound healer en sessieprofiel compact integreren
CSS
@media (max-width: 719px) {
  .public-oak-app .timeline-copy .timeline-live-with {
    padding: 5px 0 5px 10px;
    background: transparent;
    border-radius: 0;
  }

  .public-oak-app .timeline-copy .timeline-signature {
    padding: 8px 0 0;
    background: transparent;
    border: 0;
    border-top: 1px solid #ded6bd;
  }

  html[data-wo-theme="dark"] body.public-oak-app
  .timeline-copy .timeline-signature {
    background: transparent;
    border-color: #4b513e;
  }
}

Wat doet dit?De aanvullende informatie blijft direct zichtbaar, maar wordt niet meer in een tweede gevuld kader geplaatst. De korte accentlijn groepeert de gegevens. In nachtmodus gebruiken de accenten aangepaste waarden om voldoende contrast te behouden.

Resultaat in de appSound healer, thema en warmte blijven duidelijk, nemen minder plaats in en ogen in beide modi als onderdeel van dezelfde sessie.

3 wijzigingen

  • Het mobiele dagprogramma is nu één rustig overzicht met scheidingslijnen, zonder een afzonderlijk kader rond iedere gewone sessie.
  • De volgende, live en speciale sessies behouden gerichte aandacht met een subtiele kleurband en smalle accentlijn.
  • Sound healer, thema en warmte staan compacter zonder geneste kaders en blijven helder in lichte en nachtmodus.
v1.1.75 Alle vijf warmte-vlammen staan weer mooi naast elkaar
Probleem / foutmelding

Een algemene tekstregel op het tv-scherm kon ieder vuuricoon van de warmtemeter op exact dezelfde plaats zetten. De vijf vlammen vielen daardoor visueel over elkaar en het warmteniveau was niet duidelijk.

Oplossing

De tv-weergave zet de vijf warmte-vlammen nu verplicht in één horizontale rij. Alle vlammen blijven afzonderlijk zichtbaar, waarbij het gekozen aantal helder is en de rest gedimd. Het woordniveau blijft staan en een zichtbare score zoals 3/5 wordt niet toegevoegd.

Technisch

De correctie begrenst alleen de indeling van de warmtemeter. Elke vlam behoudt haar eigen flexpositie, terwijl actieve vlammen helder en overige vlammen gedimd blijven. De exacte score blijft beschikbaar voor schermlezers via het aria-label.

Technische stappen
  1. De tv-meter gebruikt expliciet display: inline-flex met een horizontale richting en zonder terugloop.
  2. De vijf meteronderdelen krijgen ieder een gewone, vaste flexpositie.
  3. De is-filled-status en het aria-label blijven ongewijzigd verantwoordelijk voor respectievelijk de visuele en toegankelijke uitleg.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Overlappende vuuriconen horizontaal uitlijnen
CSS
.screen-heat-meter {
  display: inline-flex;
  flex-direction: row;
  flex-wrap: nowrap;
  align-items: center;
}

.screen-heat-meter > i {
  position: static;
  flex: 0 0 auto;
}

Wat doet dit?De container legt één horizontale rij vast. Ieder vuuricoon blijft onderdeel van die rij en kan door een algemenere tekstregel niet meer op dezelfde positie als de andere iconen worden geplaatst.

Resultaat in de appGasten zien alle vijf vlammen afzonderlijk en kunnen het gekozen warmteprofiel vanop afstand correct herkennen.

Wijziging 2 De tv-correctie met nieuwe publieke versies ophalen
JavaScript / configuratie
const CACHE_VERSION = 'v108';
const GUEST_JS_VERSION = '134';
const TV_CSS_VERSION = '28';

precache([
  `/assets/guest.js?v=${GUEST_JS_VERSION}`,
  `/scherm/assets/screen.css?v=${TV_CSS_VERSION}`
]);

Wat doet dit?De publieke cache verwijst naar de verhoogde versies van het gastenappscript en de tv-stijl. Hierdoor wordt niet langer een lokaal bewaarde versie met de overlappende vlammen gebruikt.

Resultaat in de appGeopende en geïnstalleerde gastenapps en tv-schermen ontvangen de herstelde warmteweergave bij hun volgende update.

2 wijzigingen

  • De vijf warmte-vlammen vallen op het tv-scherm niet meer over elkaar en staan in één nette rij.
  • Nieuwe publieke cache- en assetversies zorgen dat de gecorrigeerde weergave automatisch wordt geladen.
v1.1.74 Warmte herken je nu aan vijf duidelijke vlammen
Probleem / foutmelding

De warmtebeleving stond met balkjes en een score zoals 3/5 bij een sessie. Dat oogde technisch en vroeg extra uitleg, vooral in compacte kaarten en op het tv-scherm.

Oplossing

De gastenapp toont warmte voortaan met vijf vuuriconen. Het gekozen aantal vlammen is helder en de overige vlammen zijn gedimd. Het begrijpelijke woordniveau, bijvoorbeeld ‘Gebalanceerd’, blijft zichtbaar. De cijfernotatie verdwijnt uit beeld, maar blijft via het aria-label beschikbaar voor schermlezers. Dezelfde aanpak geldt voor kaarten, details en het tv-scherm.

Technisch

HeatLevel blijft intern een getal van 1 tot 5. De browser gebruikt die waarde om vijf vlammen op te bouwen en uitsluitend het gekozen aantal te activeren. Het bijbehorende woordniveau blijft gewone tekst; de cijferwaarde wordt alleen nog gebruikt in de toegankelijke omschrijving.

Technische stappen
  1. De vijf bestaande meteronderdelen worden met CSS als vuuriconen weergegeven.
  2. De status is-filled bepaalt welke vlammen helder zijn; de andere vlammen blijven bewust zichtbaar maar gedimd.
  3. De cijferwaarde wordt uit zichtbare labels verwijderd en blijft in het aria-label staan als ‘niveau op 5’.
  4. Het dagprogramma, de details en het tv-scherm gebruiken hetzelfde centrale sessieprofiel en kunnen daardoor niet van niveau verschillen.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Vuuriconen op gastenkaarten en in sessiedetails
Twig / CSS
<span class="guest-heat-meter"
      aria-label="Warmtebeleving {{ heatLevel }} op 5, {{ heatLabel }}">
  {% for marker in 1..5 %}
    <i class="{{ marker <= heatLevel ? 'is-filled' : '' }}" aria-hidden="true"></i>
  {% endfor %}
</span>
<small>Warmtebeleving · {{ heatLabel }}</small>

.guest-heat-meter i::before { content: "🔥"; opacity: .22; }
.guest-heat-meter i.is-filled::before { opacity: 1; }

Wat doet dit?De kaart maakt altijd vijf vlamposities. Het gekozen niveau bepaalt hoeveel posities helder worden. Het woordniveau wordt naast de meter getoond en de volledige cijferwaarde blijft alleen in het aria-label staan.

Resultaat in de appEen gast begrijpt de verwachte warmte in één oogopslag, zowel in het programma als na het openen van de details.

Wijziging 2 Woordniveau zichtbaar en score toegankelijk houden
JavaScript
heatText.textContent = heatLevelLabel(profile.heatLevel);

heatMeter.setAttribute(
  'aria-label',
  'Warmtebeleving ' + profile.heatLevel +
    ' op 5, ' + heatLevelLabel(profile.heatLevel)
);

Wat doet dit?De zichtbare begeleidende tekst bevat alleen het begrijpelijke niveau, zoals Gebalanceerd. Een schermlezer ontvangt daarnaast nog steeds de precieze waarde op vijf, zodat er geen informatie verloren gaat.

Resultaat in de appDe pagina oogt rustiger zonder aan toegankelijkheid of betekenis in te boeten.

Wijziging 3 De vuurindicatie passend maken voor tv
JavaScript / CSS
heatText.textContent = compact
  ? heatLabel(level)
  : 'Warmtebeleving · ' + heatLabel(level);

.screen-heat-meter i::before {
  content: "🔥";
  filter: grayscale(1);
  opacity: .2;
}
.screen-heat-meter i.is-filled::before {
  filter: none;
  opacity: 1;
}

Wat doet dit?Het tv-scherm gebruikt dezelfde vijf vlammen, maar schaalt ze per kaartformaat. Gedimde vlammen blijven zichtbaar als vaste schaal en de actieve vlammen vallen vanop afstand duidelijk op.

Resultaat in de appZowel in de grote volgende-sessiekaart als in het volledige tv-programma is het warmteniveau herkenbaar zonder cijfernotatie.

3 wijzigingen

  • Alle gastenkaarten en sessiedetails tonen de warmte nu met vijf heldere of gedimde vuuriconen.
  • Het woordniveau blijft zichtbaar en de score op vijf blijft uitsluitend als toegankelijke schermlezertekst bestaan.
  • Ook het tv-scherm gebruikt dezelfde compacte vuurindicatie zonder zichtbare 3/5-notatie.
v1.1.73 Volledig sessieprofiel blijft zichtbaar op drukke tv-dagen
Probleem / foutmelding

Bij een volledig dagprogramma met elf sessies kreeg iedere tv-rij minder hoogte. Een sessie met thema en warmte kon daardoor onderaan worden afgesneden, ook al stond de informatie technisch wel in het programma.

Oplossing

De tv gebruikt voor zo'n sessie nu een horizontale detailindeling: naam en locatie staan links, het thema en de warmtebeleving rechts. De vijf balken, het woordniveau en de score op vijf blijven volledig zichtbaar zonder andere sessies uit beeld te duwen.

Technisch

De tv-rij krijgt bij een sessieprofiel een tweede interne kolom, niet een extra blok onderaan. Daardoor verandert de buitenhoogte van de rij niet wanneer een opgieter een thema en warmte-intensiteit invult.

Technische stappen
  1. De aangepaste rij wordt alleen gebruikt wanneer die concrete sessie een ingevuld profiel heeft.
  2. Een intern raster voorkomt dat de profielstrook de totale rijhoogte vergroot.
  3. De controle gebeurde op de live planning in een tv-viewport van 1920 × 1080.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Alle profielinformatie binnen dezelfde tv-rij houden
CSS
.has-session-profile .upcoming-copy {
  display: grid;
  grid-template-columns: minmax(135px, .82fr) minmax(160px, 1.18fr);
}

.has-session-profile .screen-session-signature {
  grid-column: 2;
  grid-row: 1 / span 3;
}

Wat doet dit?De gewone sessie-informatie en de nieuwe profielstrook delen dezelfde beschikbare hoogte. Alleen de breedte wordt verdeeld, waardoor alle programmarijen even hoog blijven.

Resultaat in de appEen vol tv-programma blijft overzichtelijk en toch staat alle bijzondere sessie-informatie direct in beeld.

Wijziging 2 Balken en score toegankelijk combineren
JavaScript / CSS
heatText.textContent = heatLabel(level) + ' · ' + level + '/5';

.screen-signature-heat {
  display: flex;
  justify-content: space-between;
}

Wat doet dit?De balken geven snel een visuele indruk. Het woord en cijfer ernaast leggen dezelfde informatie ook uit voor wie kleur of kleine grafische verschillen minder goed ziet.

Resultaat in de appDe warmtebeleving is snel herkenbaar én letterlijk leesbaar op afstand.

2 wijzigingen

  • Naam, ruimte, sessiethema en warmte staan op drukke tv-dagen voortaan naast elkaar zonder afsnijding.
  • Het volledige programma met elf sessies is live getest en blijft in één oogopslag zichtbaar.
v1.1.72 Thema en warmte blijven volledig zichtbaar op tv
Probleem / foutmelding

In het volledige tv-programma stond de warmte-indicatie onder het zichtbare deel van sommige compacte sessierijen. Bij de grote volgende sessie kon de extra thematekst ook ruimte van de aftelling innemen.

Oplossing

De tv-indeling is verder verfijnd: iedere compacte sessierij toont thema, warmtebalken en niveau naast elkaar. De grote kaart houdt meer plaats vrij voor de informatie, waardoor de korte aankondiging en de melding ‘Begint zo’ samen zichtbaar blijven.

Technisch

De compacte weergave gebruikt geen tweede rasterregel meer voor warmte. De langere teaser blijft bewust alleen op de grote kaart staan; zo blijven alle sessies zichtbaar en is de belangrijkste informatie toch direct leesbaar.

Technische stappen
  1. Compacte profielen staan nu in drie kolommen en blijven daardoor binnen de vaste rijhoogte.
  2. Het uitgebreide profiel gebruikt een begrensde teaser van maximaal twee regels.
  3. De warmte wordt nog steeds toegankelijk weergegeven met balken, een woord en een score op vijf.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Thema en warmte in één tv-strook plaatsen
CSS
.screen-session-signature.is-compact {
  grid-template-columns: 28px minmax(0, 1fr) auto;
}

.screen-signature-heat {
  display: grid;
  justify-items: end;
}

Wat doet dit?De laatste kolom blijft precies breed genoeg voor de vijf balken en het korte niveau. Het thema gebruikt flexibel de overige ruimte en mag indien nodig over twee regels lopen.

Resultaat in de appGasten zien het thema en de warmtebeleving rechtstreeks in het volledige tv-programma.

Wijziging 2 Een lange teaser begrenzen zonder informatie te verbergen
CSS
.focus-card.has-session-profile .screen-signature-copy span {
  display: -webkit-box;
  overflow: hidden;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
}

Wat doet dit?De grote tv-kaart toont de korte aankondiging op maximaal twee regels. Zo blijft de boodschap leesbaar en blijft onderaan voldoende ruimte voor de aftelling, locatie en verwachte duur.

Resultaat in de appDe volgende sessie oogt rustig en alle informatie die gasten nodig hebben blijft tegelijk zichtbaar.

2 wijzigingen

  • Iedere tv-programmarij houdt thema, warmtemeter en niveau nu volledig binnen beeld.
  • De grote volgende-sessiekaart toont profiel en aftelling voortaan tegelijk zonder afsnijding.
v1.1.71 Thema en warmte zijn direct zichtbaar in het dagprogramma
Probleem / foutmelding

Het thema en de warmtebeleving waren beschikbaar, maar de korte aankondiging stond vooral in de uitgelichte kaart en de details. Daardoor moest een gast nog doorklikken om de volledige informatie te ontdekken en was de compacte tv-weergave te klein.

Oplossing

Iedere sessie waarvoor de opgieter informatie heeft ingevuld krijgt nu direct in het dagprogramma een herkenbare strook met thema, korte omschrijving en warmteniveau. Dezelfde weergave geldt voor elke gekozen dag. Het tv-scherm toont deze informatie groter en met meer contrast.

Technisch

De pagina voegt de informatiestrook alleen toe wanneer een opgieter voor die datum, dat uur, die ruimte en dat sessietype een profiel heeft ingevuld. Daardoor blijven gewone sessies compact en krijgen alleen aangekondigde thema's extra aandacht.

Technische stappen
  1. De app gebruikt één centraal sessionProfile per concrete sessie voor dagprogramma, details en tv.
  2. De warmte wordt met vijf balken, een woord en een cijfer getoond voor voldoende contrast en toegankelijkheid.
  3. De langere teaser wordt op tv alleen in de grote focuskaart getoond, zodat alle programmarijen voldoende ruimte houden.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Thema en warmte zonder extra klik op de kaart plaatsen
Twig / HTML
{% if session.sessionProfile %}
  <span class="timeline-signature">
    <span class="timeline-signature-copy">
      <small>Thema &amp; warmte</small>
      <b>{{ session.sessionProfile.theme }}</b>
      <span>{{ session.sessionProfile.teaser }}</span>
    </span>
    <span class="timeline-signature-heat">
      <span class="guest-heat-meter">…</span>
      <small>Warmtebeleving · {{ session.sessionProfile.heatLabel }} · {{ session.sessionProfile.heatLevel }}/5</small>
    </span>
  </span>
{% endif %}

Wat doet dit?De dagplanning controleert iedere sessie op een ingevuld profiel en plaatst de drie onderdelen meteen onder de gewone sessiegegevens. De detailknop blijft beschikbaar voor de uitgebreide uitleg, maar is niet meer nodig om het thema te zien.

Resultaat in de appEen gast kan het volledige programma scannen en ziet onmiddellijk welke sessies een eigen thema en warmte-indicatie hebben.

Wijziging 2 Alle onderdelen op mobiel in een vaste volgorde houden
CSS
@media (max-width: 719px) {
  .timeline-signature {
    grid-template-columns: 24px minmax(0, 1fr);
  }

  .timeline-signature-heat {
    grid-column: 2;
    justify-content: flex-start;
  }
}

Wat doet dit?Het herkenningsicoon blijft links staan. Thema en teaser staan ernaast en de meter begint precies onder die tekst. De kaart hoeft daardoor geen tekst te verkleinen of over andere onderdelen te leggen.

Resultaat in de appOok op kleine smartphones blijft de sessiekaart rustig, volledig en direct leesbaar.

Wijziging 3 Twee tv-formaten uit dezelfde sessiegegevens maken
JavaScript
const uitgebreid = sessionSignature(session, false);
focusDetails.appendChild(uitgebreid);

const compact = sessionSignature(session, true);
programmaCopy.appendChild(compact);

Wat doet dit?De grote focuskaart krijgt thema, teaser en warmte. De rij in het volledige tv-programma gebruikt dezelfde bron en toont label, thema, meter en niveau in een kortere opmaak.

Resultaat in de appHet tv-scherm is vanop afstand duidelijk zonder dat het volledige programma uit beeld verdwijnt.

3 wijzigingen

  • Iedere ingevulde sessie toont thema, teaser en warmte nu meteen in het dagprogramma, zonder doorklikken.
  • De mobiele weergave houdt alle informatie in een vaste, leesbare volgorde bij elke gekozen dag.
  • Het tv-scherm toont de sessiesignatuur groter in focus en duidelijker in het volledige programma.
v1.1.70 Ontdek het thema en warmteprofiel van iedere sessie
Probleem / foutmelding

Gasten zagen het uur, de ruimte en de begeleider, maar nog niet welke sfeer een opgieter voor een specifieke sessie voorbereidt of hoe krachtig de warmte naar verwachting wordt.

Oplossing

Wanneer de opgieter een sessieprofiel invult, toont de gastenapp nu het thema, een vijfdelige warmtemeter en eventueel een korte teaser. De compacte versie staat in het programma; de volledige versie verschijnt bij Nu & straks en in de details. Het tv-scherm gebruikt dezelfde sessiesignatuur.

Technisch

De nieuwe gegevens reizen als een klein sessionProfile-object mee met iedere sessie. De browser bouwt daar per schermformaat een compacte of uitgebreide component van, zodat de bron gelijk blijft maar de leesafstand klopt.

Technische stappen
  1. Alle publieke weergaven lezen hetzelfde centrale sessieprofiel; losse kopieën kunnen daardoor niet uiteenlopen.
  2. De tv-meter beweegt alleen tijdens voorbereiding, vlak voor de start en live. Verminderde beweging op het toestel schakelt dit uit.
  3. De publieke offline-cache is verhoogd naar v103 en haalt de nieuwe app- en tv-bestanden op.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Eén sessieprofiel op elk schermformaat gebruiken
JavaScript
function maakSessiesignatuur(sessie, modus) {
  const profiel = sessie.sessionProfile;
  if (!profiel) return null;

  return {
    thema: profiel.theme,
    warmte: `${warmteLabel(profiel.heatLevel)} · ${profiel.heatLevel}/5`,
    teaser: modus === 'compact' ? '' : profiel.teaser
  };
}

Wat doet dit?Dezelfde gegevens worden niet driemaal gekopieerd. Alleen de presentatie verandert: compact in een lijst en uitgebreider wanneer de sessie centraal staat.

Resultaat in de appThema en warmte blijven overal gelijk, terwijl kleine telefoons en grote tv-schermen elk een passende indeling krijgen.

Wijziging 2 Gerichte beweging alleen rond het actuele moment
CSS
.focus-card.is-soon .screen-heat-meter i.is-filled,
.focus-card.is-live .screen-heat-meter i.is-filled {
  animation: heat-breathe 2.4s ease-in-out infinite;
}

@media (prefers-reduced-motion: reduce) {
  .screen-heat-meter i { animation: none !important; }
}

Wat doet dit?Alleen de gevulde warmtebalken van een bijna startende of live focuskaart ademen zacht. Gewone programmarijen en scrollen blijven stil.

Resultaat in de appHet tv-scherm trekt op het juiste moment aandacht zonder voortdurende beweging of onrust.

Wijziging 3 Warmte als indicatie helder vertalen
JSON
{
  "nl": { "levels": ["Rustig", "Geleidelijk", "Gebalanceerd", "Intens", "Krachtig"] },
  "fr": { "levels": ["Douce", "Progressive", "Équilibrée", "Intense", "Puissante"] },
  "en": { "levels": ["Gentle", "Gradual", "Balanced", "Intense", "Powerful"] }
}

Wat doet dit?Elk niveau heeft naast vijf balken ook een woord in de gekozen taal. In details staat erbij dat de werkelijke ervaring afhangt van persoon, plaats en luchtverplaatsing.

Resultaat in de appIedere gast kan de indicatie begrijpen zonder ze als een exacte temperatuur te interpreteren.

3 wijzigingen

  • Dagprogramma, focuskaart, kalenderdetails en sessiedetails tonen voortaan dezelfde thema- en warmte-informatie.
  • Het tv-scherm presenteert de sessiesignatuur groot en geeft een bijna startende of live warmtebeleving subtiel beweging.
  • De warmte blijft nadrukkelijk een persoonlijke ervaringsindicatie en geen vaste temperatuur of garantie.
v1.1.69 Aftelling past nu ook perfect op kleine telefoons
Probleem / foutmelding

Op een scherm smaller dan 360 pixels kon de nieuwe aftelbalk door het compacte kaartrooster naast namen, foto's of de infoknop worden geplaatst. Dat maakte de aankondiging juist op kleine telefoons minder duidelijk.

Oplossing

De aftelling krijgt nu ook op de kleinste schermen een eigen regel over de volledige sessiekaart. Alle sessiegegevens blijven erboven in een vaste, verticale leesvolgorde staan.

Technisch

Zonder benoemde rasterrij mocht de browser zelf bepalen waar het nieuwe element terechtkwam. De startbalk heeft nu op alle mobiele breedtes dezelfde vaste positie en kan daardoor niets overlappen.

Technische stappen
  1. De mobiele rasterindeling onder 360 pixels bevat nu een expliciete, schermbrede signaalrij.
  2. De publieke offline-cache is verhoogd naar v102 en laadt de gecorrigeerde gedeelde stijl.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 De aftelbalk altijd over de volle kaartbreedte plaatsen
CSS
@media (max-width: 359px) {
  .timeline-row {
    grid-template-areas:
      "time copy action"
      "time avatars action"
      "signal signal signal"
      "journey journey journey";
  }
}

Wat doet dit?De rij met de naam ‘signal’ beslaat de tijd-, inhoud- en actiekolom. Zo krijgt de aftelling altijd de volledige beschikbare breedte, ongeacht hoeveel begeleiders worden getoond.

Resultaat in de appOok op het smalste ondersteunde scherm blijven tijd, tekst, bewegend signaal en ruimte ordelijk onder elkaar staan.

1 wijziging

  • De aftelling voor een bijna startende sessie blijft nu op elke telefoonbreedte volledig leesbaar.
v1.1.68 Bijna startende sessies zijn nu veel duidelijker
Probleem / foutmelding

Vlak voor de start stond de resterende tijd in een kleine losse knop onder de sessie. De gewone status, voortgangsstippen en aftelling stonden naast elkaar, waardoor vooral op een telefoon en bij twee gelijktijdige sessies niet meteen duidelijk was waar en wanneer beide belevingen begonnen.

Oplossing

Vanaf 15 minuten voor de start verschijnt nu één compacte, professionele startstrook met een grote aftelling en de juiste ruimte. In de laatste 5 minuten wordt de melding nadrukkelijker en tijdens de sessie verandert ze automatisch naar een groene liveweergave. Het tv-scherm gebruikt dezelfde visuele taal in een grotere variant.

Technisch

De drie vaste fasen zijn overal gelijk: 6–15 minuten vooraf is de melding goud, de laatste 5 minuten koraal en tijdens de sessie groen. Daardoor herkennen gasten dezelfde status op hun telefoon en op het informatiescherm.

Technische stappen
  1. De startfase wordt lokaal uit het exacte sessie-uur berekend en zonder pagina-herlading bijgewerkt.
  2. Eén startcomponent vervangt tijdens deze fase de vroegere losse statuspil en stippenlijn.
  3. De offline-cache is verhoogd naar v101 en verwijst naar de nieuwe CSS- en JavaScriptbestanden.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 De mobiele startfase zonder dubbele meldingen tonen
JavaScript
const startSignaalZichtbaar = uitgelicht && vandaag
  && (fase === 'soon' || fase === 'imminent' || fase === 'live');

statusPil.hidden = startSignaalZichtbaar;
voortgang.hidden = startSignaalZichtbaar;
maakStartstrook(sessie, fase, startSignaalZichtbaar);

Wat doet dit?Zodra de sessie binnen de startfase valt, verdwijnen de kleine statuspil en de aparte stippenlijn. Op exact dezelfde plaats wordt één nieuwe strook opgebouwd met de actuele minuten en ruimte.

Resultaat in de appDe sessiekaart bevat geen dubbele aftelling meer en blijft ook op een klein scherm snel leesbaar.

Wijziging 2 Een afstandsleesbaar startsignaal op het tv-scherm maken
JavaScript
const signaal = maakTvStartsignaal(sessie, fase);
if (signaal) {
  kaart.classList.add('has-start-signal');
  details.appendChild(signaal);
}

const label = minuten <= 15
  ? `Start over ${minuten} min`
  : 'Volgende';

Wat doet dit?De grote focuskaart krijgt een eigen aftelvlak met een cijfer, korte instructie en bewegende balkjes. De kleinere rij in het volledige tv-programma gebruikt tegelijk de echte resterende minuten in plaats van alleen ‘Volgende’.

Resultaat in de appGasten zien vanop afstand dat een sessie bijna begint en kunnen meteen de juiste ruimte herkennen.

Wijziging 3 Rustige animatie met een toegankelijke terugval
CSS
.focus-start-bars i {
  animation: focus-signal-wave 2.3s ease-in-out infinite;
  transform-origin: center bottom;
}
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation: none !important;
    transition: none !important;
  }
}

Wat doet dit?Alleen de drie signaalbalkjes en een zachte ring bewegen. Er wordt niets aan de scrollpositie of kaartafmetingen geanimeerd. Wie op het toestel verminderde beweging heeft ingesteld, krijgt dezelfde informatie volledig stil te zien.

Resultaat in de appDe aandacht gaat naar het juiste moment zonder schokken, tragere bediening of onnodige visuele drukte.

3 wijzigingen

  • Het mobiele dagprogramma toont nu één grote, duidelijke startstrook met aftelling en ruimte.
  • Het tv-scherm toont dezelfde startfase groter en vermeldt de aftelling ook in het volledige programma.
  • De nieuwe beweging blijft beperkt tot bijna startende en live sessies en respecteert de toegankelijkheidsinstelling.
v1.1.67 Tv-scherm blijft vanzelf actueel
Probleem / foutmelding

Een tv-scherm dat meerdere dagen bleef aanstaan kon een oude dagplanning blijven tonen. De bestaande oplossing herlaadde alleen de volledige pagina. Bij een trage verbinding of een eerder offline toestel kon de service worker daarbij opnieuw dezelfde verouderde pagina uit de cache teruggeven.

Oplossing

Het tv-scherm haalt de planning nu via een apart, niet-gecachet gegevenskanaal opnieuw op. De planning wordt iedere minuut gecontroleerd, de datum en sessiestatussen worden om de 15 seconden bijgewerkt en na een verbindingsherstel volgt automatisch meteen een nieuwe controle.

Technisch

De zichtbare tv-pagina en de planningsgegevens zijn van elkaar losgekoppeld. Daardoor hoeft de browser niet meer volledig te herladen om nieuwe sessies, een nieuwe kalenderdag of gewijzigde statussen te tonen.

Technische stappen
  1. Een JSON-eindpunt levert uitsluitend de actuele planning met no-store-headers.
  2. De service worker behandelt de schermpagina netwerk-eerst en slaat antwoorden van het live gegevenskanaal nooit op.
  3. Een browser-eigen herlaadbeveiliging controleert ieder halfuur ook de schermcode zelf.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Iedere minuut verse planningsgegevens ophalen
JavaScript
function refreshSchedule() {
  const url = new URL(scheduleEndpoint, location.origin);
  url.searchParams.set('_screen_refresh', Date.now());
  return fetch(url, { cache: 'no-store' })
    .then(response => response.json())
    .then(next => {
      data = next;
      render();
    });
}
setInterval(refreshSchedule, 60_000);

Wat doet dit?De pagina vraagt een klein JSON-bestand op in plaats van zichzelf volledig te herladen. De unieke tijdparameter en no-store-instelling voorkomen dat een browser of tussenliggende cache een oud antwoord hergebruikt.

Resultaat in de appNieuwe of gewijzigde sessies verschijnen vanzelf op het tv-scherm, zonder zichtbare paginaflits en zonder tussenkomst van een medewerker.

Wijziging 2 Dag en sessiestatus om de 15 seconden controleren
JavaScript
setInterval(() => {
  if (data.todayIso !== brusselsTodayIso()) {
    refreshSchedule();
  } else {
    render();
    updateClock();
  }
}, 15_000);

Wat doet dit?De lokale klok wordt in de tijdzone Europe/Brussels vergeleken met de datum van de geladen planning. Op dezelfde dag worden de tijdsafhankelijke statussen opnieuw getekend; bij een nieuwe dag worden onmiddellijk nieuwe gegevens gevraagd.

Resultaat in de appEen sessie gaat automatisch van voorbereiding naar live, herstel en voltooid, en om middernacht verschijnt de juiste nieuwe dag.

Wijziging 3 Tv-routes buiten de oude navigatiecache houden
JavaScript
if (isScreenData) {
  event.respondWith(fetch(event.request, { cache: 'no-store' }));
  return;
}
if (event.request.mode === 'navigate' && isScreenPage) {
  event.respondWith(networkFirstScreenPage());
}

Wat doet dit?De service worker behandelt het live gegevenskanaal apart en gebruikt voor de tv-pagina een netwerk-eerststrategie. Alleen wanneer er echt geen verbinding is, blijft de laatst bekende schermpagina beschikbaar.

Resultaat in de appZodra internet beschikbaar is, kan een oude vrijdagpagina niet opnieuw voorrang krijgen op de actuele planning.

3 wijzigingen

  • Het tv-scherm vraagt de actuele planning nu iedere minuut rechtstreeks en cachevrij op.
  • De dagwissel en alle live- of voltooidstatussen worden zelfstandig om de 15 seconden gecontroleerd.
  • De offline-cache kan online niet langer een oude tv-dagplanning blijven teruggeven.
v1.1.66 Reserveer nu voor de Belgian Sauna Herbal Cup
Probleem / foutmelding

De Herbal Cup was al zichtbaar als speciaal event, maar de gastenapp vertelde nog niet dat de reservaties voor de wedstrijdopgietingen geopend zijn. Daardoor was ook niet duidelijk dat wedstrijdscrubs een andere reservatieroute volgen.

Oplossing

Een nieuwe aankondiging toont de officiële Herbal Cup-afbeelding, de eventdata en een rechtstreekse reservatieknop. Online reserveer je het wellnessbezoek en de wedstrijdopgietingen; wedstrijdscrubs reserveer je alleen op de eventdag aan de receptie.

Technisch

De aankondiging wordt op de server binnen een vast tijdvenster geactiveerd. De geselecteerde taal wordt daarna door JavaScript toegepast op alle onderdelen, terwijl de officiële XPlan-link ongewijzigd blijft.

Technische stappen
  1. De content komt uit één centrale eventconfiguratie en wordt op alle relevante schermen hergebruikt.
  2. De taalwissel vertaalt ook de datum, titel, uitleg en reservatieknop van de aankondiging.
  3. De afbeelding, JavaScript en CSS zijn opgenomen in een nieuwe offline-cacheversie.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 De reservatie-oproep boven het programma plaatsen
Twig
{% if bookingAnnouncement %}
  <aside class="herbal-booking-banner">
    <img src="{{ bookingAnnouncement.imageUrl }}" alt="Belgian Sauna Herbal Cup">
    <div>
      <p>Reservaties zijn open</p>
      <h2>Reserveer je plek voor de wedstrijdopgietingen</h2>
      <a href="{{ bookingAnnouncement.bookingUrl }}">Reserveer voor de Herbal Cup</a>
    </div>
  </aside>
{% endif %}

Wat doet dit?De voorwaarde voorkomt dat een oude campagne na de ingestelde periode zichtbaar blijft. De kaart gebruikt rechtstreeks de centrale afbeelding en officiële boekingslink.

Resultaat in de appBezoekers zien de reservatiemogelijkheid vroeg in de pagina, terwijl het normale dagprogramma direct eronder beschikbaar blijft.

Wijziging 2 Online en ter plaatse uit elkaar houden
JavaScript
const routes = [
  [reservation.onlineLabel, reservation.onlineText],
  [reservation.onsiteLabel, reservation.onsiteText]
];
routes.forEach(([label, explanation]) => {
  const row = document.createElement('span');
  row.appendChild(Object.assign(document.createElement('b'), { textContent: label }));
  row.appendChild(document.createTextNode(explanation));
  routesContainer.appendChild(row);
});
bookingLink.href = reservation.bookingUrl;

Wat doet dit?De eventdetails bouwen twee afzonderlijke informatierijen op. De eerste benoemt wat via XPlan kan; de tweede zegt expliciet dat wedstrijdscrubs pas op de eventdag aan de receptie worden gereserveerd.

Resultaat in de appGasten komen niet op de online reservatiepagina terecht met de verwachting daar ook een wedstrijdscrub te kunnen boeken.

2 wijzigingen

  • Boven het dagprogramma staat nu een opvallende maar compacte aankondiging voor de Herbal Cup-reservaties.
  • Onder Reserveren en in de eventdetails staat helder wat online kan en wat alleen aan de receptie kan.
v1.1.65 Details blijven binnen het scherm
Probleem / foutmelding

Tijdens de live nacontrole bleek dat het vernieuwde detailvenster op een pagina waarop al was gescrold te hoog kon openen. De inhoud zelf was correct, maar de bovenrand en sluitknop konden daardoor buiten beeld terechtkomen.

Oplossing

Het detailvenster wordt nu aan het zichtbare browservenster verankerd en daarbinnen gecentreerd. De pagina erachter kan op om het even welke positie staan: foto, sluitknop en scrollbare uitleg blijven volledig bereikbaar.

Technisch

Het dialoogvenster is gekoppeld aan de viewport in plaats van aan zijn positie in het langere paginadocument.

Technische stappen
  1. De modal gebruikt een vaste schermpositie met automatische centrering.
  2. De gastenapp-cache is vernieuwd zodat de positioneringscorrectie onmiddellijk beschikbaar komt.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Detailvenster aan het scherm verankeren
CSS
.session-dialog {
  position: fixed;
  inset: 0;
  margin: auto;
  height: min(90dvh, 900px);
}

Wat doet dit?Een vaste positie rekent vanaf de zichtbare browserranden. Met gelijke afstanden rondom en automatische marges wordt het venster horizontaal en verticaal gecentreerd, ook wanneer de onderliggende pagina ver is doorgescrold.

Resultaat in de appDe ruimtefoto, sluitknop en detailtekst blijven samen volledig bereikbaar op desktop en mobiel.

1 wijziging

  • Details openen nu altijd volledig binnen het zichtbare scherm, ongeacht de scrollpositie van het dagprogramma.
v1.1.64 Rustiger details met de juiste ruimtefoto
Probleem / foutmelding

Bij Goodnight Soundhealing XL gebruikte de detailkop de verticale eventaffiche als brede locatieafbeelding. Daardoor werd de affiche hard afgesneden, terwijl het onderschrift de ruimte Shou Sugi Ban noemde. De scrollbalk liep bovendien langs de volledige modal en stond visueel tegen de foto en sluitknop.

Oplossing

De detailkop toont nu altijd de echte foto van de ruimte waar de sessie doorgaat. De eventaffiche blijft volledig zichtbaar in het aparte eventgedeelte. De foto en sluitknop blijven rustig op hun plaats, terwijl alleen de inhoud onder de foto scrolt. Op smalle mobiele schermen worden de fotohoogte, titel en witruimte afzonderlijk aangepast.

Technisch

De sessie behoudt één afbeeldingsveld voor de fysieke ruimte. De eventafbeelding blijft onderdeel van eventInfo en wordt uitsluitend door de volledige eventkaart gerenderd.

Technische stappen
  1. Eventmetadata overschrijft de gewone ruimteafbeelding niet langer.
  2. Het dialoogvenster gebruikt twee vaste zones: media bovenaan en een afzonderlijk scrollbare detailinhoud.
  3. Dynamische viewporthoogte voorkomt dat mobiele browserbalken de onderkant van het venster afsnijden.
  4. De offline app-cache en planningcache krijgen een nieuwe versie.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Ruimtefoto niet vervangen door event artwork
PHP
$sessionMeta = array_merge($sessionMeta, [
    'title' => $eventSession['title'],
    'durationLabel' => $eventSession['durationLabel'],
    'image' => $sessionMeta['image'],
]);

Wat doet dit?Titel en duur worden wel met het speciale event verrijkt, maar het afbeeldingsveld blijft de foto die op basis van Shou Sugi Ban, The Barn, Panorama Sauna of Stoombad werd gekozen.

Resultaat in de appDe kop zegt niet alleen waar de beleving doorgaat, maar laat diezelfde ruimte ook werkelijk zien.

Wijziging 2 Alleen de inhoud laten scrollen
CSS
.session-dialog[open] {
  display: grid;
  grid-template-rows: 240px minmax(0, 1fr);
  overflow: hidden;
}
.dialog-body {
  min-height: 0;
  overflow-y: auto;
}

Wat doet dit?De modal bestaat uit een vaste mediakop en een tweede zone die de langere uitleg bevat. Alleen die tweede zone krijgt een verticale scrollbar.

Resultaat in de appDe foto en sluitknop verschuiven niet meer wanneer iemand de details doorneemt.

Wijziging 3 Mobiele browserhoogte correct benutten
CSS
@media (max-width: 600px) {
  .session-dialog {
    width: calc(100% - 12px);
    height: calc(100dvh - 16px);
    grid-template-rows: 190px minmax(0, 1fr);
  }
}

Wat doet dit?De dynamische schermhoogte houdt rekening met browserbalken op Android en iPhone. De locatieafbeelding wordt op mobiel bewust iets compacter.

Resultaat in de appMeer relevante detailinformatie past op het scherm zonder dat titel, foto of bediening te klein worden.

3 wijzigingen

  • De detailkop toont voortaan de echte ruimtefoto; de eventaffiche blijft volledig in het eventgedeelte staan.
  • De foto en sluitknop blijven vast staan, terwijl alleen de detailtekst scrolt.
  • De detailweergave schaalt nu rustiger op kleine mobiele schermen.
v1.1.63 Precies twee activiteiten om 20u
Probleem / foutmelding

De nieuwste spreadsheetgegevens bevatten al een gewone soundhealingsregel met Sarah om 20:00. De eerste eventweergave zette Goodnight Soundhealing XL daar afzonderlijk bij, waardoor tijdelijk drie kaarten om 20:00 konden verschijnen. Alexander kwam bovendien via twee records met verschillende hoofdletters binnen.

Oplossing

Goodnight Soundhealing XL wordt nu over de bestaande soundsessie gelegd: dezelfde kaart krijgt de eventtitel, affiche, Sarah Vrolix en een duur van één uur. De gewone opgietsessie blijft daarnaast staan. De gastenapp controleert alle hostnamen binnen hetzelfde tijd- en ruimteslot samen, zodat verschillende hoofdletters geen dubbele begeleider meer maken.

Technisch

De app gebruikt de actuele spreadsheetregel als basis en verrijkt die met de pas ontvangen eventinformatie. Dit voorkomt dat een late aankondiging en een later bijgewerkte spreadsheet dezelfde activiteit dubbel maken.

Technische stappen
  1. Een event wordt eerst gekoppeld op tijd + begeleider + sessietype.
  2. Alleen wanneer geen passende bronregel bestaat, wordt een nieuwe eventregel gemaakt.
  3. De serverplanning is na de wijziging zonder oude cache opnieuw opgebouwd.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Eerst een actuele soundsessie zoeken
PHP
foreach ($rawSessions[$iso] as &$session) {
    if ($session['time'] !== $event['time']) continue;
    if (normalize($session['host']) !== normalize($event['host'])) continue;
    if (!isSoundSession($session)) continue;

    $session['specialEventSession'] = $event;
    $matched = true;
    break;
}

if (!$matched) $rawSessions[$iso][] = $event;

Wat doet dit?De bestaande dagplanning wordt eerst doorzocht. Alleen een soundsessie van dezelfde begeleider op hetzelfde uur mag de eventgegevens ontvangen. De laatste regel is een fallback voor aankondigingen die nog helemaal niet in de spreadsheet staan.

Resultaat in de appDe app past zich correct aan, ongeacht of de manager de sessie vóór of na de aparte aankondiging in de spreadsheet zet.

Wijziging 2 Hoofdletters niet als een tweede persoon behandelen
PHP
$personen = dedupeSessionPersonNames(['Alexander', 'ALEXANDER']);
// Eén resultaat: Alexander

Wat doet dit?Beide labels worden in kleine letters vergeleken voordat de zichtbare hostlijst wordt gemaakt. Omdat de genormaliseerde waarden gelijk zijn, blijft slechts één naam over.

Resultaat in de appDe sessiekaart toont één profielfoto en één naam voor Alexander.

2 wijzigingen

  • Goodnight Soundhealing XL gebruikt nu de bestaande soundsessie van 20:00, zodat gasten precies twee gelijktijdige activiteiten zien.
  • Alexander en ALEXANDER worden over afzonderlijke bronregels heen als één begeleider weergegeven.
v1.1.62 Goodnight Soundhealing XL vandaag om 20u
Probleem / foutmelding

De Goodnight Soundhealing XL werd pas apart aangekondigd en staat niet in de gewone spreadsheetplanning. Daardoor zagen gasten het event nog niet. Op hetzelfde uur is ook een gewone opgietsessie gepland, zodat een eenvoudige vervanging één van beide wellnessmomenten zou verbergen. Een opgietersnaam verscheen bovendien dubbel als ‘Alex & ALEXANDER’.

Oplossing

Het gastenprogramma toont vandaag om 20:00 twee evenwaardige keuzes: de gewone opgietsessie in The Barn en Goodnight Soundhealing XL met Sarah Vrolix. De XL-klankbeleving staat extra in de kijker met de volledige affiche, een speciaal-eventlabel, uitleg over de ontspannen afsluiter en een verwachte duur van één uur. Dezelfde informatie staat in de kalender en in het detailscherm. Dubbele schrijfwijzen van dezelfde voornaam worden voortaan samengevoegd.

Technisch

De dagplanning groepeert alleen sessies met dezelfde tijd én dezelfde ruimte. Daardoor kunnen de twee activiteiten van 20:00 naast elkaar bestaan. Voor persoonsnamen wordt een genormaliseerde vergelijking gebruikt voordat avatars en labels worden opgebouwd.

Technische stappen
  1. Het event wordt als een aanvullend sessierecord verwerkt en niet als wijziging van de spreadsheetplanning.
  2. De gastencache is vernieuwd naar schedule-v29 en de offline appcache naar thewhiteoak-public-v96.
  3. De sessieduur van 60 minuten bepaalt ook correct wanneer de status ‘bezig’ en ‘afgerond’ verschijnt.
  4. Naamvarianten worden vóór het maken van de zichtbare sessiekaart gecontroleerd.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Twee activiteiten op hetzelfde uur zichtbaar houden
PHP
$key = $session['time'] . '|' . mb_strtolower($session['room']);
$program[$key] = $session;

// 20u00|the barn
// 20u00|the white oak wellness

Wat doet dit?Het uur alleen is niet voldoende om een sessie te herkennen. Door ook de ruimte in de sleutel op te nemen, krijgen de gewone opgietsessie en Goodnight Soundhealing XL elk een eigen kaart. De eventgegevens vullen vervolgens titel, beeld, begeleider en duur aan.

Resultaat in de appOm 20:00 kan de gast beide sessies zien en bewust het juiste detailscherm openen.

Wijziging 2 Eén begeleider uit een dubbel naamlabel halen
PHP
$namen = guestSplitNames('Alex & ALEXANDER');
$zichtbareNaam = implode(' & ', $namen);
// ALEXANDER

Wat doet dit?De namen worden zonder verschil in hoofdletters vergeleken. Alex is een korte schrijfwijze van Alexander en beide verwijzen hier naar dezelfde persoon, zodat alleen de volledige variant wordt behouden. Verschillende namen, zoals Wim en Yvonne, blijven wel als duo staan.

Resultaat in de appDe sessiekaart toont geen verzonnen duo meer en gebruikt één begeleidersprofiel.

2 wijzigingen

  • Gasten zien Goodnight Soundhealing XL met Sarah Vrolix vandaag om 20:00 als speciaal event met volledige affiche en een duur van één uur, naast de gewone opgietsessie.
  • De dubbele naam Alex & ALEXANDER verschijnt voortaan correct als één begeleider.
v1.1.61 Luxe scrubsessie om 18u opnieuw zichtbaar
Probleem / foutmelding

Vandaag staat dezelfde begeleider in de spreadsheet op twee aparte regels om 18:00: een luxe scrub in het Stoombad en sound healing in Shou Sugi Ban. Omdat de app voorheen eerst alleen unieke uren per naam bewaarde, bleef in het gastenprogramma ten onrechte alleen de sound healing over.

Oplossing

De gastenapp leest nu ook het soort spreadsheetrij en de bijbehorende ruimte. Daardoor staan om 18:00 opnieuw twee afzonderlijke kaarten in het dagprogramma: Luxe scrubsessie met SARAH in het Stoombad, met Prijs €10 en Max. 14 gasten, en Sound healing met SARAH in Shou Sugi Ban. Dezelfde verwerking geldt automatisch op andere dagen waarop één begeleider gelijktijdig op verschillende sessierijen staat.

Technisch

De spreadsheet was correct. Tijdens de oude verwerking werden twee records met dezelfde naam en hetzelfde uur te vroeg tot één uur herleid. De app bewaart het rijtype nu voordat er wordt gegroepeerd.

Technische stappen
  1. De sessie-identiteit bestaat voortaan uit tijd, ruimte en rol in plaats van alleen tijd en naam.
  2. Alleen records met dezelfde tijd én dezelfde ruimte worden nog als één sessie gegroepeerd.
  3. De serverplanning gebruikt cacheversie v28 en de gastenappcache is vernieuwd naar thewhiteoak-public-v95.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Tijd, ruimte en rol samen als sessie-identiteit gebruiken
PHP
$slotKey = $slotTime . '|' . $room . '|' . $role;
$slots[$iso][$slotKey] = [
    'time' => $slotTime,
    'room' => $room,
    'role' => $role,
    'isSoundHealer' => $role === 'sound',
];

foreach ($slots[$iso] as $slot) {
    $rawSessions[$iso][] = $slot;
}

Wat doet dit?De sleutel bevat drie concrete eigenschappen. Voor vandaag ontstaan daardoor twee verschillende sleutels: 18u00 + Stoombad + scrub en 18u00 + Shou Sugi Ban + sound. Beide worden daarna aan het publieke dagprogramma toegevoegd. Alleen een exact gelijke combinatie kan nog worden samengevoegd.

Resultaat in de appDe gastenapp toont alle elf sessies en behoudt beide verschillende belevingen om 18:00.

1 wijziging

  • Om 18:00 verschijnen de Luxe scrubsessie in het Stoombad en de Sound healing in Shou Sugi Ban voortaan beide in het programma, ook wanneer dezelfde begeleider op beide spreadsheetrijen staat.
v1.1.60 Extra sessies zichtbaar in de dagkeuze
Probleem / foutmelding

Een dag met ingevulde extra sessies zag er bovenaan hetzelfde uit als een gewone dag. Alleen wanneer de extra uren nog niet bekend waren, stond ‘Extra sessies volgen’ in de knop. Gasten konden daardoor pas in het programma zelf ontdekken dat er meer sessies waren aangekondigd.

Oplossing

De zeven dagknoppen tonen nu een kleine goudkleurige statusregel. ‘Extra sessies’ met een volle stip betekent dat de aanvullende sessies al in het dagprogramma staan. ‘Extra sessies volgen’ met een open stip blijft gereserveerd voor een aangekondigde dag waarvan de definitieve uren of begeleiders nog ontbreken.

Technisch

De app gebruikte de extra-planningsstatus al in de maandkalender, maar nog niet volledig in de weekknoppen. Diezelfde gegevens worden nu ook daar weergegeven, zonder een extra gegevensophaling te doen.

Technische stappen
  1. De dagknop leest de bestaande velden hasExtraSessions en extraSessionsPending uit dezelfde actuele weekplanning.
  2. Een volle stip staat voor bevestigde extra inhoud; een open stip voor een aankondiging die nog wordt ingevuld.
  3. De gedeelde stylesheet is vernieuwd naar versie 28 en de gastenapp-cache naar versie 94.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 De juiste status rechtstreeks in iedere dagknop tonen
Twig
{% if day.hasExtraSessions %}
  <small class="day-extra-sessions {{ day.extraSessionsPending ? 'is-pending' : 'is-confirmed' }}"
         data-i18n="{{ day.extraSessionsPending ? 'extraSessionsPendingLegend' : 'extraSessionsLegend' }}">
    {{ day.extraSessionsPending ? 'Extra sessies volgen' : 'Extra sessies' }}
  </small>
{% endif %}

Wat doet dit?hasExtraSessions bepaalt of de kleine regel nodig is. extraSessionsPending kiest vervolgens tussen een bevestigde en een nog onvolledige planning. Het vertaalsleutelattribuut laat dezelfde knop na een taalwissel automatisch de Nederlandse, Franse of Engelse tekst gebruiken.

Resultaat in de appGasten zien al in de dagkeuze welke dagen extra aanbod hebben en of de details definitief zijn.

Wijziging 2 Een compacte volle of open statusstip gebruiken
CSS
.day-extra-sessions {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 4px;
  color: #8a671c;
  font-size: .54rem;
}

.day-extra-sessions::before {
  width: 5px;
  height: 5px;
  border: 1px solid currentColor;
  border-radius: 50%;
  background: currentColor;
}

.day-extra-sessions.is-pending::before { background: transparent; }

Wat doet dit?De aanduiding krijgt bewust geen grote knop of opvallend vlak. Een klein goudkleurig punt en korte tekst blijven leesbaar op mobiel. De gevulde of open stip maakt ook visueel duidelijk of de extra planning klaar is of nog volgt.

Resultaat in de appDe dagkiezer geeft meer informatie zonder voller of drukker aan te voelen.

2 wijzigingen

  • Vandaag, Morgen, Overmorgen en de vier volgende dagknoppen tonen nu een kleine aanduiding wanneer extra sessies zijn aangekondigd.
  • ‘Extra sessies’ betekent dat de uren al ingevuld zijn; ‘Extra sessies volgen’ maakt duidelijk dat de definitieve planning nog wordt aangevuld.
v1.1.59 Dagprogramma blijft zichtbaar bij een korte Google-storing
Probleem / foutmelding

Om 03:12 werd tijdens een automatische vernieuwing kortstondig geen geldige planning van Google Sheets ontvangen. De app bewaarde die mislukte ophaling ten onrechte als een lege week. Daardoor verscheen ‘Programma volgt’, hoewel er vandaag en de komende dagen wel sessies gepland zijn.

Oplossing

De planning is opnieuw opgebouwd en toont weer 11 sessies op ieder van de zeven getoonde dagen. De app bewaart voortaan apart de laatst bekende correcte week. Een onverwacht volledig lege ophaling mag die kopie niet overschrijven en activeert automatisch de correcte noodweergave. Zodra Google opnieuw antwoordt, schakelt de app vanzelf terug naar de nieuwste gegevens.

Technisch

De app controleert voortaan het totale sessieaantal voordat een weekcache als geldig wordt opgeslagen. Alleen een gevulde planning vervangt de noodkopie. De noodkopie wordt uitsluitend gebruikt wanneer ze bij dezelfde datum hoort, zodat de dag altijd correct blijft.

Technische stappen
  1. De live week werd om 03:21 hersteld met zeven dagen van telkens 11 sessies.
  2. De gewone vijfminutencache en de laatst-correcte-weekcache zijn nu afzonderlijke bestanden.
  3. Voor iedere nieuwe cache wordt eerst het totale aantal sessies gevalideerd.
  4. De terugval geldt alleen voor dezelfde kalenderdag, zodat gisteren nooit als vandaag wordt getoond.
  5. Ook de onderliggende Sheets-ophaling gebruikt voortaan verlopen gegevens als tijdelijke noodkopie bij een netwerkfout.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Een volledig lege week als ongeldige tussenstand herkennen
PHP
$countSessions = static function (array $schedule): int {
    return array_sum(array_map(
        static fn(array $day): int => count($day['sessions'] ?? []),
        $schedule['days'] ?? []
    ));
};

if ($countSessions($result) > 0) {
    file_put_contents($scheduleCache, $encoded);
    file_put_contents($lastGoodCache, $encoded);
    return $result;
}

Wat doet dit?De controle telt niet alleen de sessies van Vandaag, maar van alle zeven aangeboden dagen. Een planning met minstens één echte sessie is geldig en mag worden opgeslagen. Een resultaat van nul wordt behandeld als een mogelijke technische fout en mag de bewezen correcte kopie niet vervangen.

Resultaat in de appDe melding ‘Programma volgt’ verschijnt niet meer door een kortstondig mislukte gegevensophaling.

Wijziging 2 Alleen de noodkopie van dezelfde dag tonen
PHP
if (is_array($lastGood)
    && ($lastGood['todayIso'] ?? '') === $today->format('Y-m-d')
    && $countSessions($lastGood) > 0
) {
    $lastGood['isFallback'] = true;
    return $lastGood;
}

Wat doet dit?De terugval wordt alleen gebruikt als de opgeslagen planning bij exact dezelfde datum hoort en werkelijk sessies bevat. Bij een nieuwe kalenderdag wordt dus nooit de planning van gisteren als Vandaag weergegeven. De technische vlag maakt zichtbaar dat de app tijdelijk de noodkopie gebruikt.

Resultaat in de appGasten behouden een volledig programma zonder risico dat een verkeerde dag wordt getoond.

2 wijzigingen

  • Een korte storing tijdens het ophalen van Google Sheets kan niet langer de volledige dag- en weekplanning laten verdwijnen.
  • De app toont automatisch de laatst bekende correcte week wanneer een nieuwe ophaling onverwacht nul sessies bevat.
v1.1.58 Duidelijke sessiekaarten op iedere gekozen dag
Probleem / foutmelding

Na het kiezen van Morgen, Overmorgen of een latere dag kon het programma een andere of kleinere kaartindeling tonen dan Vandaag. Daardoor stonden tijd, ruimte en begeleiders niet altijd op dezelfde plaats en konden meerdere foto’s op een kleine smartphone de namen verdringen.

Oplossing

Iedere dagkeuze gebruikt nu dezelfde overzichtelijke sessiekaart. Tijd, sessietype, begeleiders, ruimte, prijs, maximumaantal, live samenwerking en detailactie staan in een vaste volgorde. Iedere begeleider houdt een eigen foto en op de kleinste schermen krijgen de foto’s extra ruimte onder de naam.

Technisch

De dagselectie verandert alleen nog de getoonde datum en sessiegegevens, niet de vorm van de kaart. Eén gedeelde CSS-gridindeling vangt gewone, actuele en live sessies op; een smal mobiel breekpunt beschermt de leesbaarheid bij meerdere begeleiders.

Technische stappen
  1. Alle kaartstatussen gebruiken één responsieve rasterindeling.
  2. De ruimte wordt per sessie genormaliseerd zodat de juiste rustige ruimtebadge verschijnt.
  3. Een afzonderlijk breekpunt onder 360 pixels plaatst meerdere deelnemersfoto’s onder de tekst.
  4. De gedeelde stylesheet is vernieuwd naar versie 27 en de offline cache naar versie 93.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Iedere gekozen dag dezelfde kaart laten gebruiken
CSS
.timeline-row,
.timeline-row.is-compact,
.timeline-row.is-featured-session,
.timeline-row.is-current {
  display: grid;
  grid-template-columns: 82px minmax(0, 1fr) auto 44px;
  grid-template-areas: "time content people action";
  min-height: 154px;
  border-radius: 8px;
}

Wat doet dit?Voorheen konden extra klassen zoals compact, current of featured de kaart anders opbouwen. Deze selector brengt al die statussen onder één rastercomponent. Daardoor blijft de vorm gelijk wanneer de bezoeker een andere dag kiest; alleen de inhoud en actuele status veranderen.

Resultaat in de appHet programma voelt op Vandaag, Morgen, Overmorgen en de volgende dagen als één consistente toepassing.

Wijziging 2 Ruimte en praktische informatie betrouwbaar tonen
Twig
<button class="timeline-row"
        data-room="{{ session.room|lower|e('html_attr') }}">
  <time>{{ session.time }}</time>
  <strong>{{ session.label }}</strong>
  <span>{{ session.host }}</span>
  <span class="timeline-room">{{ session.room }}</span>
  {% if session.price %}<span>Prijs €{{ session.price }}</span>{% endif %}
  {% if session.capacity %}<span>Max. {{ session.capacity }} gasten</span>{% endif %}
</button>

Wat doet dit?De ruimte wordt als veilige kleine-letterwaarde aan de kaart gekoppeld zodat de juiste ruimtebadge en accentkleur kunnen worden gekozen. De zichtbare inhoud houdt prijs en maximumaantal voor betalende sessies apart van de naam en ruimte, waardoor die gegevens niet verdwijnen wanneer de kaart compacter wordt weergegeven.

Resultaat in de appGasten zien in één oogopslag waar een sessie plaatsvindt en of prijs of capaciteit van toepassing is.

Wijziging 3 Foto’s en namen op 320 pixels beschermen
CSS
@media (max-width: 359px) {
  .timeline-row {
    grid-template-columns: 72px minmax(0, 1fr) 40px;
    grid-template-areas:
      "time content action"
      "time people action";
  }

  .timeline-avatars {
    grid-area: people;
    justify-self: start;
    margin-top: 8px;
  }
}

Wat doet dit?Vanaf 360 pixels staan de foto’s efficiënt rechts. Op een nog smaller toestel reserveert de kaart een tweede regel voor de deelnemers. Zo blijft de tekstkolom breed genoeg voor volledige namen en hoeven de foto’s niet over elkaar of over de tekst te schuiven.

Resultaat in de appDuo’s en trio’s blijven ook op kleine smartphones duidelijk herkenbaar, zonder horizontaal scrollen.

3 wijzigingen

  • Vandaag, Morgen, Overmorgen en de vier volgende dagen tonen voortaan exact dezelfde overzichtelijke sessiekaart.
  • Uur, sessietype, begeleider(s), ruimte, prijs, maximumaantal, live samenwerking en detailactie blijven in een vaste leesvolgorde zichtbaar.
  • Duo- en triofoto’s staan afzonderlijk zonder overlap; op zeer smalle telefoons krijgen ze een eigen regel zodat namen volledig leesbaar blijven.
v1.1.57 Grotere deelnemersfoto’s en live sessies die direct opvallen
Probleem / foutmelding

Bij een live sessie waren de foto’s en rollen van de opgieter en sound healer niet altijd duidelijk van elkaar te onderscheiden. Als voor de sound healer nog geen eigen foto beschikbaar was, kon dezelfde foto tweemaal verschijnen. Daardoor leek het alsof Francine ook als Barbara werd afgebeeld. De live markering viel bovendien in de kalender- en dagdetails minder sterk op dan in het actuele programma.

Oplossing

Foto’s worden groter weergegeven en iedere opgieter en sound healer krijgt een eigen avatar, naam en rol. Barbara gebruikt voortaan een duidelijke B-placeholder zolang geen eigen foto is geüpload en neemt nooit meer Francines foto over. Live sessies hebben in Vandaag, de kalender en de dagdetails dezelfde herkenbare kaart, accentkleur en live aanduiding.

Technisch

De gastenapp bouwt de avatars van de hoofdopgieter en de live sound healer uit twee afzonderlijke fotolijsten op. Ontbreekt een persoonlijke foto, dan toont de betreffende rol de eerste letter van de eigen naam. De live status wordt daarnaast hergebruikt voor de actuele sessiekaart en de kalenderdetailregels.

Technische stappen
  1. De hoofdopgieter en sound healer gebruiken elk hun eigen foto-opzoeking.
  2. Barbara krijgt een B-placeholder zolang zij geen eigen geüploade foto heeft.
  3. De grotere avatars blijven naast de juiste naam en rol staan, ook op een kleine smartphone.
  4. Vandaag, kalender en dagdetails gebruiken dezelfde live status en visuele nadruk.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Opgieter en sound healer als afzonderlijke deelnemers opbouwen
Twig
<div class="timeline-primary-avatars">
  {% for photo in session.opgieterPhotos %}
    <img src="{{ photo }}" alt="Foto van {{ session.host }}">
  {% else %}
    <span class="participant-avatar is-fallback">
      {{ session.host|first|upper }}
    </span>
  {% endfor %}
</div>

{% if session.liveWith %}
  <div class="timeline-live-with">
    {% for photo in session.liveWithPhotos %}
      <img src="{{ photo }}" alt="Foto van {{ session.liveWith }}">
    {% else %}
      <span class="live-avatar is-fallback">
        {{ session.liveWith|first|upper }}
      </span>
    {% endfor %}
    <span><small>Sound healer</small><b>{{ session.liveWith }}</b></span>
  </div>
{% endif %}

Wat doet dit?Het eerste blok gebruikt uitsluitend de foto’s van de opgieter die de sessie begeleidt. Het tweede blok wordt alleen voor een live samenwerking toegevoegd en leest een afzonderlijke fotolijst voor de sound healer. De else-delen maken voor elke rol een eigen letterplaceholder wanneer een foto ontbreekt. Hierdoor kan Francines foto niet in Barbara’s blok terechtkomen en blijft toch duidelijk zichtbaar dat Barbara de sound healer is.

Resultaat in de appIedere deelnemer verschijnt met de juiste naam, rol en eigen foto of letterplaceholder.

Wijziging 2 Dezelfde live herkenning in programma en kalender gebruiken
JavaScript + CSS
const isLive = Boolean(session.liveWith);
row.classList.toggle('is-live-special', isLive);

if (isLive) {
  row.insertAdjacentHTML('afterbegin',
    '<span class="calendar-live-badge">Live sessie</span>'
  );
}

.is-live-special {
  border-color: #a98a43;
  background: color-mix(in srgb, var(--surface) 92%, #d9bd6a);
}

.timeline-avatar { width: 48px; height: 48px; }
.timeline-live-avatar { width: 40px; height: 40px; }

Wat doet dit?De eerste twee regels bepalen vanuit de sessiegegevens of het om een live samenwerking gaat en zetten dezelfde statusklasse op iedere rij. Daarna wordt alleen voor zo’n sessie een duidelijk label toegevoegd. De CSS geeft de kaart een warmer contrast zonder felle kleurvlakken. De laatste regels vergroten de hoofdavatar en de afzonderlijke sound-healeravatar, zodat beide rollen op mobiel herkenbaar blijven.

Resultaat in de appLive sessies springen in Vandaag en kalenderdetails op dezelfde rustige maar duidelijke manier in het oog.

2 wijzigingen

  • Deelnemersfoto’s zijn groter en iedere opgieter of sound healer wordt afzonderlijk weergegeven; Barbara krijgt een B-placeholder zolang geen eigen foto is geüpload en er verschijnt geen verkeerde dubbele foto meer.
  • Live sessies krijgen in Vandaag én in de kalender- en dagdetails dezelfde duidelijke live aanduiding, sterker contrast en herkenbare deelnemersopmaak.
v1.1.56 Badkledingmelding oogt rustiger en professioneler
Probleem / foutmelding

De woorden van de badkledingmelding waren al duidelijk, maar het gedraaide ruiticoon oogde niet als een wellnesssymbool. De strook en de pulserende gloed vroegen bovendien te veel aandacht ten opzichte van het dagprogramma, vooral op een klein scherm of in nachtmodus.

Oplossing

De gastenapp behoudt exact ‘Vandaag is het badkledingdag’ en ‘Badkleding is op deze dag verplicht in de wellness.’ Het ruiticoon is vervangen door een rustig watergolvenicoon in een ronde wellness-tegel. De melding gebruikt evenwichtigere witruimte, een fijnere rand en een subtielere gloed. Dezelfde professionele vormgeving wordt ook in de interne Opgietplanner gebruikt.

Technisch

De bestaande datum- en taalgevoelige titel blijft behouden; alleen de Nederlandse tekst en de presentatie zijn visueel gelijkgetrokken. thewhiteoak-public-v91 vernieuwt de publieke offlinecache. guest.css v85 bevat de compacte strook, ronde icoontegel en licht-/nachtkleuren; guest.js v124 activeert de vernieuwde appcache. De interne app gebruikt opgietplanner-v391 en opgietplanner-html-v328.

Technische stappen
  1. De Nederlandse titel en toelichting blijven exact zoals goedgekeurd.
  2. Het nieuwe lijnicoon blijft scherp op telefoons, tablets en grote schermen.
  3. De ronde tegel past visueel bij de rustige wellnessstijl van The White Oak.
  4. De evenwichtige afstanden houden icoon en tekst duidelijk van elkaar gescheiden.
  5. De gloed is zachter in zowel licht- als nachtmodus.
  6. De verhoogde cacheversies vervangen het oude ruiticoon ook in geïnstalleerde apps.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 De goedgekeurde titel en toelichting exact behouden
JavaScript
const copy = {
  nl: {
    swimwearNotice: '{day} is het badkledingdag',
    swimwearNoticeDetail:
      'Badkleding is op deze dag verplicht in de wellness.'
  }
};

const offset = dayOffsetFromToday(day.iso);
noticeTitle.textContent = replace(text('swimwearNotice'), {
  day: dayLabel(offset, day.iso)
});
noticeDetail.textContent = text('swimwearNoticeDetail');

Wat doet dit?De vertaaltabel bewaart de twee goedgekeurde Nederlandse zinnen op één centrale plaats. dayOffsetFromToday bepaalt alleen of de titel Vandaag, Morgen, Overmorgen of een weekdag moet noemen. De praktische toelichting wordt zonder verdere omzetting ingevuld en blijft daardoor steeds exact gelijk.

Resultaat in de appOp de actuele badkledingdag ziet iedere Nederlandstalige gast precies de afgesproken titel en toelichting.

Wijziging 2 Een watergolvenicoon als rustig wellnesssymbool tonen
HTML / SVG
<span class="notice-icon" aria-hidden="true">
  <svg viewBox="0 0 24 24" fill="none">
    <path d="M3 7c2 0 2-2 4-2s2 2 4 2 2-2 4-2 2 2 4 2" />
    <path d="M3 12c2 0 2-2 4-2s2 2 4 2 2-2 4-2 2 2 4 2" />
    <path d="M3 17c2 0 2-2 4-2s2 2 4 2 2-2 4-2 2 2 4 2" />
  </svg>
</span>

Wat doet dit?De notice-icon vormt een ronde tegel die niet meer wordt gedraaid. Drie eenvoudige lijnen verbeelden watergolven en sluiten beter aan bij wellness dan de oude ruit. Omdat het om een SVG gaat, blijft het symbool helder bij iedere schermgrootte. aria-hidden houdt de voorgelezen melding kort en duidelijk.

Resultaat in de appDe badkledingmelding krijgt een herkenbaar, verzorgd icoon dat niet afleidt van de praktische tekst.

Wijziging 3 De badkledingstrook evenwichtiger en zachter laten opvallen
CSS
.day-notice {
  display: flex;
  align-items: center;
  gap: 13px;
  padding: 12px 16px 12px 13px;
  border: 1px solid var(--swimwear-line);
  border-left: 3px solid var(--swimwear);
  border-radius: 8px;
  animation: swimwear-notice-glow 4s ease-in-out infinite;
}

.notice-icon {
  width: 44px;
  height: 44px;
  flex: 0 0 auto;
  border-radius: 50%;
  background: #dcebe1;
}

@keyframes swimwear-notice-glow {
  50% { box-shadow: 0 7px 22px rgba(115,151,129,.17), 0 0 0 3px rgba(115,151,129,.07); }
}

html[data-wo-theme="dark"] .notice-icon {
  color: #d9eee0;
  background: #294137;
}

Wat doet dit?De flexindeling reserveert een vaste plaats voor het icoon en geeft de tekst de resterende breedte. De witruimte, fijne linkerrand en beperkte hoekradius creëren een rustige hiërarchie. De gloed ademt gedurende vier seconden tussen twee zachte schaduwen. De laatste regels geven het icoon in nachtmodus eigen contrastkleuren, zodat de watergolven duidelijk blijven.

Resultaat in de appDe melding valt voldoende op, blijft prettig leesbaar en heeft op mobiel een evenwichtige verhouding tussen icoon en tekst.

3 wijzigingen

  • De goedgekeurde teksten ‘Vandaag is het badkledingdag’ en ‘Badkleding is op deze dag verplicht in de wellness.’ blijven exact behouden.
  • Het oude ruiticoon is vervangen door een rustig watergolvenicoon in een ronde wellness-tegel, gelijk aan de interne Opgietplanner.
  • De melding is evenwichtiger en professioneler vormgegeven met een subtielere gloed en duidelijk contrast in licht- en nachtmodus.
v1.1.55 Badkledingdag krijgt een duidelijke titel en rustige gloed
Probleem / foutmelding

De bestaande badkledingmelding was inhoudelijk juist, maar oogde als een gewone informatieregel. Tussen de sessiekaart, smartphonewaarschuwing en eventinformatie kon deze belangrijke praktische regel daardoor te weinig aandacht krijgen.

Oplossing

De gastenapp toont nu een duidelijke hoofdtitel, bijvoorbeeld ‘Vandaag is het badkledingdag’, met daaronder de praktische bevestiging dat badkleding verplicht is. Een zachte groene gloed ademt rustig rond de melding zonder te knipperen. Op een andere gekozen badkledingdag verandert Vandaag automatisch naar Morgen, Overmorgen of de juiste weekdag. Nederlands, Frans en Engels zijn volledig ondersteund.

Technisch

De dagtitel gebruikt dayOffsetFromToday in plaats van de plaats van de dag in de gegevenslijst. Daardoor blijft de formulering ook na een datumwissel of bij herstelde offlinegegevens juist. guest.css v84 bevat de licht-, nacht- en verminderde-bewegingstijlen; guest.js v123 vult titel en uitleg per taal in. thewhiteoak-public-v90 vernieuwt de geïnstalleerde appcache.

Technische stappen
  1. Titel en toelichting zijn visueel gescheiden en lopen netjes om op kleine schermen.
  2. De gloed gebruikt een langzame cyclus van 3,2 seconden en geen felle flitsen.
  3. Nachtmodus gebruikt een lichtere groene gloed en tekst met voldoende contrast.
  4. Bij verminderde beweging wordt de animatie uitgeschakeld.
  5. De titel wordt bij elke taal- of dagwissel opnieuw vanuit de gekozen datum opgebouwd.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 De badkledingtitel per gekozen dag en taal opbouwen
JavaScript + CSS
const copy = {
  nl: {
    swimwearNotice: '{day} is het badkledingdag',
    swimwearNoticeDetail: 'Badkleding is op deze dag verplicht in de wellness.'
  },
  fr: {
    swimwearNotice: '{day} est une journée en maillot'
  },
  en: {
    swimwearNotice: '{day} is a swimwear day'
  }
};

const offset = dayOffsetFromToday(day.iso);
noticeTitle.textContent = replace(text('swimwearNotice'), {
  day: dayLabel(offset, day.iso)
});
noticeDetail.textContent = text('swimwearNoticeDetail');

.day-notice {
  animation: swimwear-notice-glow 3.2s ease-in-out infinite;
}

@media (prefers-reduced-motion: reduce) {
  * { animation: none !important; }
}

Wat doet dit?Regels 1 tot en met 12 bewaren de titel per taal met een plaats voor de juiste dagnaam. Regel 14 berekent hoeveel dagen de selectie van vandaag verwijderd is. Regels 15 tot en met 18 combineren die echte dagaanduiding met de actieve vertaling en vullen de toelichting afzonderlijk in. De CSS voegt de trage gloed toe. De laatste mediaquery verwijdert alle beweging wanneer de bezoeker dat op het toestel heeft ingesteld.

Resultaat in de appIedere gast leest een correcte, duidelijke badkledingmelding in de gekozen taal, ook na een datumwissel of vanuit een geïnstalleerde offline app.

1 wijziging

  • De badkledingmelding toont nu een sterke datumgevoelige titel met een zachte pulserende gloed, praktische uitleg en volledige vertaling in NL, FR en EN.
v1.1.54 Wedstrijddeelnemers worden volledig meertalig weergegeven
Probleem / foutmelding

Bij het omschakelen van de Herbal Cup-pagina naar Frans of Engels veranderden de evenementtitel, beschrijving en onderdelen correct, maar bleef de neutrale tekst Wedstrijddeelnemers in het Nederlands staan. Dat gaf een onprofessionele mix van talen.

Oplossing

De tijdelijke begeleidersvermelding vertaalt nu overal mee. Nederlands toont Wedstrijddeelnemers, Frans toont Participants au concours en Engels toont Competition participants. Dit geldt boven de geselecteerde kalenderdag, in de sessierijen en in Meer info. Zodra echte namen in de planning worden ingevuld, blijven die gewone persoonsnamen onveranderd zichtbaar.

Technisch

localizedHostName controleert uitsluitend of de brontekst exact de vaste placeholder Wedstrijddeelnemers is en gebruikt dan de actieve vertaaltabel. Daghosts, sessiehosts en taalwissels roepen dezelfde helper aan. guest.js v122 en thewhiteoak-public-v89 vervangen de vorige meertalige cache.

Technische stappen
  1. De placeholder heeft een afzonderlijke vertaling in NL, FR en EN.
  2. De dagkop en alle sessieweergaven gebruiken dezelfde vertaalroute.
  3. Een taalwissel werkt onmiddellijk zonder de pagina opnieuw te laden.
  4. Echte namen worden nooit door de vertaalfunctie aangepast.
  5. De service worker is verhoogd zodat ook geïnstalleerde apps de correctie ontvangen.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 De deelnemersplaceholder bij iedere taalwissel opnieuw invullen
JavaScript
function localizedHostName(host) {
  if (String(host || '').trim().toUpperCase() !==
      'WEDSTRIJDDEELNEMERS') {
    return host;
  }
  return text('competitionParticipants');
}

function sessionHost(session) {
  const host = session.isUnassigned
    ? text('unassigned')
    : localizedHostName(session.host);
  return session.liveWith
    ? replace(text('liveWith'), { host, guest: session.liveWith })
    : host;
}

document.querySelectorAll('[data-session-host]').forEach(element => {
  const session = sessions[element.dataset.sessionHost];
  element.textContent = session.isUnassigned
    ? text('unassigned')
    : localizedHostName(session.host);
});

Wat doet dit?Regels 1 tot en met 5 stoppen onmiddellijk voor alle echte namen en andere teksten. Regel 6 haalt alleen voor de vaste placeholder de vertaling van de actieve taal op. Regels 9 tot en met 15 gebruiken diezelfde beslissing wanneer een sessie direct wordt opgebouwd, ook bij een live samenwerking. Regels 18 tot en met 23 lopen bij een taalwissel langs reeds zichtbare sessienamen en vullen ze opnieuw in. Daardoor werkt de correctie zowel bij het openen van een dag als bij omschakelen tussen NL, FR en EN.

Resultaat in de appIedere taal toont één volledig consistente Herbal Cup-pagina, terwijl echte deelnemersnamen exact blijven zoals de manager ze later in de spreadsheet invult.

1 wijziging

  • De vaste Herbal Cup-placeholder wordt nu volledig vertaald als Wedstrijddeelnemers, Participants au concours of Competition participants, zonder echte namen te wijzigen.
v1.1.53 Sauna Herbal Cup is nu het hele weekend herkenbaar
Probleem / foutmelding

De spreadsheet en de affiche duiden het weekend van 26 september aan, maar na de eerste publicatie had alleen zaterdag de volledige speciale evenementkaart. Zondag 27 september stond nog als een gewoon thema in de kalender en kon de tekst HERBAL CUP als begeleider verschijnen.

Oplossing

Ook zondag 27 september heeft nu de gouden evenementster, de officiële affiche, alle wedstrijdonderdelen en de link naar Opgietersvereniging België. Zolang er geen individuele deelnemers in de planning staan, toont ook zondag de neutrale tekst Wedstrijddeelnemers. Zaterdag en zondag vormen zo één samenhangend evenementweekend.

Technisch

Beide ISO-datums verwijzen naar hetzelfde SPECIAL_EVENTS-object. De schedule-builder voegt daarna de concrete geselecteerde datum toe en past dezelfde personenfilter toe. Schedule-cache v26, guest.js v121 en thewhiteoak-public-v88 zorgen dat webapp en geïnstalleerde app de complete weekendmarkering ophalen.

Technische stappen
  1. 26 en 27 september hebben nu hetzelfde speciale-eventtype in de kalender.
  2. Beide geselecteerde dagen tonen dezelfde affiche en betrouwbare uitleg.
  3. De datum boven de kaart blijft per dag correct.
  4. HERBAL CUP verschijnt op geen van beide dagen nog als persoon.
  5. De gastenappcache is opnieuw verhoogd na de live gegevenscontrole.
Voorbeeldcode per wijziging1 voorbeelden
Wijziging 1 Het evenement over beide aangekondigde weekenddagen verdelen
PHP
$CONFIG['SPECIAL_EVENTS'] = [
    '2026-09-26' => [
        'title' => 'Belgian Sauna Herbal Cup 2026',
        'image' => 'events/sauna-herbal-cup-2026.jpg',
    ],
];
$CONFIG['SPECIAL_EVENTS']['2026-09-27'] =
    $CONFIG['SPECIAL_EVENTS']['2026-09-26'];

foreach ($CONFIG['SPECIAL_EVENTS'] as $iso => $event) {
    $planningEventsByDate[$iso] = specialEventForDate($iso);
    unset($themeByDate[$iso], $soundHealingByDate[$iso]);
}

Wat doet dit?Regels 1 tot en met 6 leggen de centrale zaterdagconfiguratie vast; de echte configuratie bevat daarnaast de samenvatting, wedstrijdonderdelen, bronlink en vertalingen. Regels 7 en 8 hergebruiken exact die inhoud voor zondag. Regels 10 tot en met 13 verwerken daarna iedere dag afzonderlijk in de publieke planning. De helper voegt de juiste ISO-datum toe, waarna de kalender de correcte dagnaam kan tonen. De generieke thema- en sound-healerwaarden worden op beide datums verwijderd, zodat alleen de professionele evenementpresentatie overblijft.

Resultaat in de appDe gastenapp markeert zaterdag en zondag als één consistent Herbal Cup-weekend en toont nergens een evenementnaam als begeleider.

1 wijziging

  • Zondag 27 september heeft nu dezelfde Belgian Sauna Herbal Cup-affiche, evenementdetails, kalenderster en neutrale deelnemersweergave als zaterdag 26 september.
v1.1.52 Belgian Sauna Herbal Cup krijgt een eigen evenementbeleving
Probleem / foutmelding

De Belgian Sauna Herbal Cup van 26 september was nog niet als volwaardig evenement herkenbaar in de gastenapp. De bezoeker miste de affiche en uitleg over wat er tijdens de wedstrijd gebeurt. Het spreadsheetlabel HERBAL CUP kon daarnaast als naam van een begeleider verschijnen, terwijl de individuele wedstrijddeelnemers nog niet zijn toegewezen.

Oplossing

Zaterdag 26 september heeft nu een gouden ster en de naam Belgian Sauna Herbal Cup 2026 in de kalender. Na het kiezen van die dag verschijnt een ruime, mobiele evenementkaart met de affiche, een korte introductie, drie onderdelen van de wedstrijd en een rechtstreekse link naar de officiële uitleg. Zodra de dag in Nu & straks staat, komt dezelfde context ook in de dagplanning en bij Meer info. Tot individuele deelnemers bekend zijn, staat er duidelijk Wedstrijddeelnemers in plaats van een fout profiel. De uitleg is voorzien in Nederlands, Frans en Engels.

Technisch

De publieke schedule-builder voegt eventInfo toe aan dagknoppen, kalenderdagen en sessies. De JavaScript-renderer vertaalt titel, samenvatting, onderdelen en resultaat volgens de gekozen taal. Een centrale hostfilter voorkomt dat HERBAL CUP als persoon wordt opgebouwd. Schedule-cache v25, guest.css v83, guest.js v120, worker-query v87 en thewhiteoak-public-v87 vervangen de oude evenement- en offlinegegevens.

Technische stappen
  1. 26 september is met een aparte ster van gewone thema- en extra dagen te onderscheiden.
  2. De geselecteerde kalenderdag toont de volledige affiche en inhoudelijke evenementkaart.
  3. Dezelfde kaart kan later automatisch in Nu & straks en het sessiedetail verschijnen.
  4. De informatie wisselt mee tussen Nederlands, Frans en Engels.
  5. HERBAL CUP wordt niet meer als profielfoto, opgieter of sound healer behandeld.
  6. De mobiele kaart gebruikt één kolom en blijft binnen een schermbreedte van 390 pixels.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 De geselecteerde evenementdag als rijke informatiekaart opbouwen
JavaScript
function renderSpecialEvent(container, eventInfo) {
  container.replaceChildren();
  container.hidden = !eventInfo;
  if (!eventInfo) return;

  const event = localizedEvent(eventInfo, currentLanguage);
  const article = document.createElement('article');
  article.className = 'special-event-feature';
  article.innerHTML = `
    <figure><img src="${eventInfo.imageUrl}" alt="Affiche ${event.title}"></figure>
    <div class="special-event-content">
      <small>★ ${text('eventLabel')} · ${longDate(eventInfo.iso)}</small>
      <h3>${event.title}</h3>
      <strong>${event.tagline}</strong>
      <p>${event.summary}</p>
      <ul>${event.highlights.map(item =>
        `<li><b>${item.title}</b><span>${item.text}</span></li>`
      ).join('')}</ul>
      <a href="${eventInfo.sourceUrl}" target="_blank">
        ${text('officialEventInfo')} ↗
      </a>
    </div>`;
  container.appendChild(article);
}

Wat doet dit?Regels 1 tot en met 3 maken het doelvak leeg en verbergen het op gewone dagen. Regel 5 kiest de Nederlandse, Franse of Engelse inhoud volgens de actieve taal. Regels 6 en 7 maken één semantische evenementkaart. Regels 9 tot en met 12 tonen de echte affiche met een beschrijvende alt-tekst, datum, titel en korte kernboodschap. Regels 13 tot en met 16 voegen de samenvatting en ieder afzonderlijk wedstrijdonderdeel toe. Regels 18 tot en met 20 bieden de officiële bron in een nieuw tabblad. Dezelfde functie wordt gebruikt in de geselecteerde kalenderdag, het actuele dagprogramma en het sessiedetail.

Resultaat in de appDe bezoeker krijgt op elk relevant scherm dezelfde aantrekkelijke en vertaalde uitleg zonder dat de gewone dagplanning voller wordt.

Wijziging 2 Een evenementlabel niet als begeleider publiceren
PHP
$specialEvent = specialEventForDate($iso);
$hosts = array_values(array_filter($hosts, static function ($host) use ($specialEvent) {
    if (!$specialEvent) return true;
    return normalize((string)$host) !== 'HERBAL CUP';
}));

if ($specialEvent && !$hosts) {
    $hosts = ['Wedstrijddeelnemers'];
}

$day = [
    'iso' => $iso,
    'eventInfo' => $specialEvent,
    'hosts' => $hosts,
    'sessions' => $sessions,
];

Wat doet dit?Regel 1 controleert of de dag een centraal gekend speciaal evenement is. Regels 2 tot en met 5 laten alle gewone dagen en echte namen ongemoeid, maar verwijderen op de evenementdag uitsluitend de pseudo-naam HERBAL CUP. Regels 7 tot en met 9 plaatsen een neutrale en eerlijke omschrijving wanneer nog geen individuele deelnemer in de spreadsheet staat. Regels 11 tot en met 16 leveren zowel de evenementinformatie als de opgeschoonde begeleiders aan kalender, dagprogramma en details.

Resultaat in de appDe app stelt geen evenementnaam meer voor als mens en kan echte wedstrijddeelnemers later automatisch overnemen zodra ze in de planning worden ingevuld.

2 wijzigingen

  • 26 september krijgt in de kalender en dagweergave een eigen Belgian Sauna Herbal Cup-presentatie met affiche, wedstrijdonderdelen en officiële informatielink.
  • De gastenapp toont HERBAL CUP niet langer als persoon; zolang de namen nog niet in het rooster staan, verschijnt de duidelijke vermelding Wedstrijddeelnemers.
v1.1.51 Extra sessies van 7 september tijdig aangekondigd
Probleem / foutmelding

7 september was in het maandrooster al als extra planning aangeduid, maar de definitieve extra uren en begeleiders stonden nog niet in het detailtabblad EXTRA OPGIETPLANNING. De gastenapp keek voor de extra-markering alleen naar volledig uitgewerkte detailblokken. Daardoor zag de gast nog niet dat er die dag extra sessies worden verwacht.

Oplossing

De gastenapp onderscheidt nu een aangekondigde extra dag van een volledig ingevulde extra planning. Op de knop van 7 september, in de kalender en boven het dagprogramma staat Extra sessies volgen. Zolang de manager de definitieve extra uren nog niet heeft ingevuld, blijft het gewone programma zichtbaar met een duidelijke melding dat dit voorlopig is. Zodra de detailplanning verschijnt, schakelt de app automatisch over naar de definitieve extra sessies.

Technisch

Schedule-cache v24 combineert markeringen uit het maandtabblad met datums uit EXTRA OPGIETPLANNING. hasExtraSessions geeft beide vormen aan; extraSessionsPending is alleen waar voor een markering zonder detailblok. Twig en de NL-, FR- en EN-vertalingen gebruiken die status in de dagknoppen, kalender en planning. guest.css v82, guest.js v119, worker query v84 en thewhiteoak-public-v86 zorgen dat ook geïnstalleerde apps de melding ophalen.

Technische stappen
  1. Een spreadsheetmarkering is nu voldoende om een extra dag vooraf zichtbaar te maken.
  2. Een afzonderlijke pending-status voorkomt dat gewone uren als definitieve extra uren worden voorgesteld.
  3. De dagknop, kalender en geselecteerde dag gebruiken dezelfde status.
  4. De melding is beschikbaar in Nederlands, Frans en Engels.
  5. De publieke gegevens- en offlinecaches zijn vernieuwd.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Spreadsheetmarkering en detailplanning afzonderlijk verwerken
PHP
$extraMarkedDates = getMainTabExtraMarkers();
$extraDetailedDates = getExtraPlanningDates();

$day['hasExtraSessions'] =
    isset($extraMarkedDates[$iso]) || isset($extraDetailedDates[$iso]);
$day['extraSessionsPending'] =
    isset($extraMarkedDates[$iso]) && !isset($extraDetailedDates[$iso]);

if (isset($extraDetailedDates[$iso])) {
    $day['sessions'] = buildDetailedExtraSessions($iso);
} else {
    $day['sessions'] = buildRegularSessions($iso);
}

Wat doet dit?Regel 1 leest welke dagen in het gewone maandrooster als extra zijn aangekondigd. Regel 2 leest welke dagen al een volledig detailblok hebben. Regels 4 en 5 maken de algemene extra-status waar zodra één van beide bronnen de datum kent. Regels 6 en 7 zetten pending alleen voor een aankondiging zonder details. Regels 9 tot en met 13 kiezen daarna de juiste inhoud: definitieve extra sessies krijgen voorrang, anders blijft de gewone planning beschikbaar.

Resultaat in de app7 september valt onmiddellijk op als extra dag zonder dat nog onbekende uren worden verzonnen of bestaande uren verdwijnen.

Wijziging 2 Voorlopige status duidelijk boven het programma tonen
Twig / JavaScript
{% if day.extraSessionsPending %}
  <small data-i18n="extraSessionsPendingLegend">
    Extra sessies volgen
  </small>
{% endif %}

{% if selectedDay.extraSessionsPending %}
  <aside class="extra-planning-notice" role="note">
    <strong data-i18n="extraSessionsPendingLegend">
      Extra sessies volgen
    </strong>
    <span data-i18n="extraSessionsPendingText">
      De definitieve uren en begeleiders worden nog aangevuld;
      het getoonde gewone programma is voorlopig.
    </span>
  </aside>
{% endif %}

Wat doet dit?Regels 1 tot en met 5 plaatsen de korte status rechtstreeks op de knop van de betreffende dag. Regels 7 tot en met 18 tonen na selectie een grotere toelichting boven het programma. De data-i18n-markeringen laten dezelfde twee teksten omschakelen naar Frans en Engels. De status wordt alleen gerenderd voor pending-dagen en verdwijnt automatisch zodra een definitief detailblok beschikbaar is.

Resultaat in de appDe gast ziet zowel vóór als na het selecteren van 7 september wat al zeker is en welke informatie nog wordt aangevuld.

2 wijzigingen

  • 7 september krijgt in de dagkeuze en kalender de duidelijke status Extra sessies volgen, ook voordat de detailuren zijn ingevuld.
  • Het gewone dagprogramma blijft voorlopig zichtbaar met uitleg; zodra de extra planning is ingevuld, neemt de definitieve planning automatisch over.
v1.1.50 Iedere bevestigde sessie blijft zichtbaar
Probleem / foutmelding

Wanneer een vast scrub- of opgietuur nog geen naam van een opgieter had, ontbrak die reguliere sessie in de gastenapp. Dat kon de indruk geven dat ze niet doorging, terwijl alleen de naam nog niet was bevestigd.

Oplossing

Ook sessies zonder toegewezen naam staan nu in het publieke dagprogramma. De app toont duidelijk Sessie gaat door met daaronder Opgieter wordt nog bevestigd. De vaste ruimte, het juiste sessietype en bij een standaard scrub ook Prijs €10 en Max. 14 gasten blijven zichtbaar. Dezelfde status verschijnt in Nu & straks, het volledige programma, details, de kalender en het tv-scherm.

Technisch

De schedule-builder leest voortaan naast toegewezen namen ook de open uren van de gewone maandtab. Hij voegt alleen ontbrekende combinaties van tijd en ruimte toe en slaat gewone uren over zodra voor die datum extra planning actief is. De presentatielaag gebruikt isUnassigned in Twig en JavaScript. white-oak-modern v26, guest.js v118, screen.js v28, worker query v83 en thewhiteoak-public-v85 leveren de nieuwe weergave ook aan geïnstalleerde apps.

Technische stappen
  1. Open vaste uren uit de gewone maandplanning worden onderdeel van de publieke sessiedata.
  2. Controle op tijd én ruimte voorkomt dubbels en bewaart gelijktijdige sessies.
  3. De hoofdstatus bevestigt dat de sessie doorgaat; de ontbrekende naam staat als tweede regel.
  4. Niet-toegewezen standaardscrubs behouden hun ruimte, prijs en capaciteit.
  5. Nederlands, Frans en Engels gebruiken dezelfde duidelijke betekenis.
  6. De vernieuwde gastenapp- en worker-versies vervangen oude offlinebestanden.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Ontbrekende vaste uren veilig aan het gastenprogramma toevoegen
PHP
foreach (scanUnassignedHoursMain($month) as $iso => $times) {
    $unassigned[$iso] = array_values(array_unique(array_merge(
        $unassigned[$iso] ?? [],
        $times
    )));
}

foreach ($unassigned[$iso] ?? [] as $time) {
    if (isset($extraAssignedDates[$iso])) continue;
    $roomData = getDefaultRoom($time);
    $room = guestRoomLabel($roomData['room'] ?? '');
    $alreadyPresent = array_filter($rawSessions[$iso], fn ($entry) =>
        $entry['time'] === $time && $entry['room'] === $room
    );
    if ($room === '' || $alreadyPresent) continue;
    $rawSessions[$iso][] = [
        'time' => $time,
        'room' => $room,
        'host' => ''
    ];
}

Wat doet dit?Regels 1 tot en met 5 verzamelen per datum alle vaste spreadsheeturen waarvan de naamcel nog leeg is en verwijderen dubbele uren. Regel 8 doorloopt de open uren van de gekozen dag. Regel 9 beschermt extra planning: zodra die actief is, worden gewone standaarduren niet gemengd. Regels 10 en 11 bepalen de vaste ruimte. Regels 12 tot en met 14 zoeken dezelfde tijd-ruimtecombinatie in de reeds opgebouwde sessies. Regel 15 voorkomt een kaart zonder ruimte en voorkomt een echte dubbel. Regels 16 tot en met 20 voegen ten slotte de bevestigde sessie zonder host toe.

Resultaat in de appEen open 16:00-uur in de gewone planning verschijnt als echte sessie in de gastenapp, zonder toegewezen sessies of gelijktijdige belevingen te verdubbelen.

Wijziging 2 Doorgaan en nog te bevestigen duidelijk van elkaar scheiden
Twig / JavaScript
{% if session.isUnassigned %}
  <span class="timeline-confirmation">
    <b data-i18n="sessionConfirmed">Sessie gaat door</b>
    <span data-session-host="{{ session.id }}">
      Opgieter wordt nog bevestigd
    </span>
  </span>
{% else %}
  <span>{{ session.host }}</span>
{% endif %}

function renderUnassignedHost(container, session) {
  container.classList.add('is-unassigned');
  container.append(title(text('sessionConfirmed')));
  container.append(subtitle(text('unassigned')));
  avatar.textContent = '⌛';
}

Wat doet dit?Regel 1 controleert de expliciete isUnassigned-status. Regels 2 tot en met 7 bouwen een tweeregelige boodschap: de zekere informatie staat vet bovenaan en de nog openstaande naam eronder. De data-i18n- en data-session-host-attributen laten beide regels meeschakelen met NL, FR en EN. Regels 9 tot en met 11 behouden de normale hostnaam voor toegewezen sessies. De JavaScriptfunctie gebruikt dezelfde opbouw in dynamische kaarten, kalender en detailvenster en zet een zandloper als neutraal tijdelijk profiel.

Resultaat in de appDe gast leest eerst dat de sessie doorgaat en ziet pas daarna dat de naam nog volgt; de status oogt op alle schermen hetzelfde.

Wijziging 3 Nieuwe gastenappbestanden zonder oude offlinecache laden
JavaScript / configuratie
const release = {
  css: '/opgietplanner/assets/white-oak-modern.css?v=26',
  app: '/opgietplanner/gasten/assets/guest.js?v=118',
  screen: '/opgietplanner/gasten/scherm/assets/screen.js?v=28',
  worker: '/thewhiteoak/sw.js?v=83',
  cache: 'thewhiteoak-public-v85'
};
const names = await caches.keys();
await Promise.all(names
  .filter((name) => name.startsWith('thewhiteoak-public-'))
  .filter((name) => name !== release.cache)
  .map((name) => caches.delete(name))
);
await navigator.serviceWorker.register(release.worker);
await caches.open(release.cache);

Wat doet dit?Regel 1 opent de releaseconfiguratie. Regels 2 tot en met 6 leggen de nieuwe gedeelde CSS, appcode, tv-code, workerquery en cachenaam vast. Regel 7 sluit de configuratie. Regel 8 vraagt alle lokale caches op. Regels 9 tot en met 12 selecteren alleen oudere gastenappcaches en verwijderen die. Regel 13 registreert de nieuwe worker en regel 14 opent de actuele cache waarin de worker de genoemde bestanden bewaart.

Resultaat in de appOok een eerder geïnstalleerde The White Oak-app haalt de nieuwe sessiestatus, planning en tv-weergave op in plaats van oude offlinebestanden te blijven tonen.

3 wijzigingen

  • Vaste sessie-uren zonder toegewezen opgieter worden nu uit de gewone maandplanning overgenomen en verdwijnen niet meer uit het gastenprogramma.
  • Nu & straks, de daglijst, details, kalender en het tv-scherm tonen Sessie gaat door met Opgieter wordt nog bevestigd als aanvullende informatie.
  • white-oak-modern v26, guest.js v118, screen.js v28, worker query v83 en gastenappcache thewhiteoak-public-v85 zijn geactiveerd.
v1.1.49 Prijsweergave gelijk in beide apps
Probleem / foutmelding

De gastenapp herkende lege standaardsessies in het stoombad al correct als scrub en toonde de passende prijsinformatie. De interne planner volgde diezelfde regel nog niet overal. Daarnaast moest de gastenappcache worden vernieuwd zodat deze nieuwe versiehistoriek meteen zichtbaar wordt.

Oplossing

De interne planner gebruikt nu dezelfde scrubherkenning als de reeds correcte gastenapp. De publieke sessies, titels en prijzen zijn inhoudelijk niet gewijzigd. Gedeelde stylesheet v25 en de gastenappcache zijn vernieuwd naar thewhiteoak-public-v84, met guest.js v117 en worker query v82, zodat de nieuwe historiek ook in een eerder geïnstalleerde app verschijnt.

Technisch

De bestaande publieke scrubregels zijn als uitgangspunt voor de interne planner gebruikt; de publieke gegevensverwerking blijft ongewijzigd. Alleen gedeelde stylesheet v25, de versiehistoriek en bijbehorende cacheverwijzingen zijn vernieuwd. Oudere thewhiteoak-public-caches worden verwijderd voordat v84, guest.js v117 en worker query v82 actief worden.

Technische stappen
  1. De interne planner volgt voortaan dezelfde ruimtenamen, standaardprijs en standaardcapaciteit als de gastenapp.
  2. De publieke sessielijst en alle reeds getoonde prijzen blijven inhoudelijk gelijk.
  3. Gedeelde stylesheet v25 en thewhiteoak-public-v84 vervangen de vorige presentatie- en gastenappcache.
  4. guest.js v117 en worker query v82 zorgen dat de nieuwe versiehistoriek meteen wordt gecontroleerd en opgehaald.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 Eén scrubregel delen zonder de publieke inhoud te wijzigen
JavaScript / configuratie
const scrubRules = {
  rooms: ['hamam', 'hammam', 'stoombad'],
  emptyDescriptionIsScrub: true,
  defaultPrice: 10,
  defaultCapacity: 14
};
const appUsage = {
  guestApp: { rules: scrubRules, contentChanged: false },
  internalPlanner: { rules: scrubRules, contentChanged: true }
};
Object.freeze(scrubRules);

Wat doet dit?Regel 1 opent de gedeelde scrubregels. Regel 2 vermeldt de drie ondersteunde ruimtenamen. Regel 3 bepaalt dat een lege standaardomschrijving als scrub telt. Regels 4 en 5 leggen €10 en maximaal 14 gasten als terugval vast. Regel 6 sluit de regels. Regel 7 opent het gebruik per app. Regel 8 bevestigt dat de gastenapp dezelfde regels en ongewijzigde inhoud behoudt. Regel 9 laat de interne planner die regels nu ook gebruiken. Regel 10 sluit de gebruiksconfiguratie en regel 11 voorkomt onbedoelde wijzigingen aan de basisregels.

Resultaat in de appDe interne planner sluit aan op de correcte gastenweergave, terwijl publieke sessies en bestaande prijzen exact hetzelfde blijven.

Wijziging 2 Versiehistoriek direct ophalen via gastenappcache v84
JavaScript / configuratie
const guestAssets = {
  cssUrl: '/opgietplanner/assets/white-oak-modern.css?v=25',
  cacheName: 'thewhiteoak-public-v84',
  scriptUrl: 'assets/guest.js?v=117',
  workerUrl: 'sw.js?v=82'
};
document.querySelector('[data-shared-styles]').href = guestAssets.cssUrl;
const cacheNames = await caches.keys();
const staleCaches = cacheNames.filter(
  (name) => name.startsWith('thewhiteoak-public-') && name !== guestAssets.cacheName
);
await Promise.all(staleCaches.map((name) => caches.delete(name)));
await navigator.serviceWorker.register(guestAssets.workerUrl);
await (await caches.open(guestAssets.cacheName)).add(guestAssets.scriptUrl);

Wat doet dit?Regel 1 opent de assetconfiguratie. Regels 2 tot en met 5 leggen gedeelde stylesheet v25, cache v84, guest.js v117 en worker query v82 vast. Regel 6 sluit de configuratie. Regel 7 koppelt v25 aan de gedeelde stylesheet. Regel 8 vraagt alle caches op. Regels 9 tot en met 11 selecteren alleen verouderde gastenappcaches. Regel 12 verwijdert ze. Regel 13 registreert de worker met query v82 en regel 14 bewaart guest.js v117 in de nieuwe cache.

Resultaat in de appDe geïnstalleerde gastenapp haalt gedeelde stylesheet v25 en de nieuwe releasehistoriek meteen op, zonder de publieke planning of prijsinformatie te wijzigen.

2 wijzigingen

  • De interne planner volgt nu dezelfde scrubherkenning als de reeds correcte gastenapp; publieke sessies en prijzen blijven inhoudelijk ongewijzigd.
  • Gedeelde stylesheet v25 en de gastenappcache zijn ververst naar thewhiteoak-public-v84, guest.js v117 en worker query v82 zodat de nieuwe versiehistoriek meteen verschijnt.
v1.1.48 Gedeelde appstijl opnieuw ververst
Probleem / foutmelding

Na het gelijkzetten van de sessieopmaak moest ook de gedeelde presentatielaag opnieuw worden ververst. Zonder nieuwe cache- en worker-versies kon een geïnstalleerde gastenapp tijdelijk oudere stijlbestanden blijven gebruiken, terwijl de publieke sessie-inhoud zelf niet hoefde te veranderen.

Oplossing

De gedeelde stijllaag is opnieuw gepubliceerd zodat de gastenapp en interne Opgietplanner dezelfde actuele sessieopmaak gebruiken. De publieke sessielijst blijft inhoudelijk en functioneel gelijk. De gastenappcache en service worker zijn vernieuwd naar thewhiteoak-public-v83, guest.js v116 en worker query v81.

Technisch

Alleen de gedeelde presentatiebestanden en hun cacheverwijzingen zijn vernieuwd. De gastenapp ruimt oudere thewhiteoak-public-caches op, registreert de worker met query v81 en laadt guest.js v116 binnen thewhiteoak-public-v83. De gegevensbron, dagselectie, sessiestatus en detailinhoud zijn niet gewijzigd.

Technische stappen
  1. De gedeelde stijllaag levert in beide apps dezelfde actuele sessieopmaak.
  2. De publieke sessielijst en haar inhoud blijven ongewijzigd.
  3. thewhiteoak-public-v83 vervangt oudere gastenappcaches.
  4. guest.js v116 en worker query v81 zorgen dat de geïnstalleerde app de nieuwste bestanden controleert en ophaalt.
Voorbeeldcode per wijziging2 voorbeelden
Wijziging 1 De gedeelde stijl vernieuwen zonder sessiegegevens te wijzigen
CSS
:root {
  --session-gap: 1rem;
  --session-radius: .5rem;
  --session-border: color-mix(in srgb, currentColor 18%, transparent);
}
.session-card {
  display: grid;
  gap: var(--session-gap);
  border: 1px solid var(--session-border);
  border-radius: var(--session-radius);
}
.session-card__content { min-width: 0; }

Wat doet dit?Regel 1 opent de gedeelde stijlvariabelen. Regels 2, 3 en 4 leggen tussenruimte, afronding en een rustige rand vast. Regel 5 sluit de variabelen. Regel 6 opent de sessiekaart. Regel 7 activeert het raster. Regel 8 gebruikt de gedeelde tussenruimte. Regel 9 tekent de rand en regel 10 gebruikt de vaste afronding. Regel 11 sluit de kaart. Regel 12 voorkomt dat lange inhoud de kaart breder maakt. Omdat dit uitsluitend CSS is, veranderen planning en sessiegegevens niet.

Resultaat in de appDe gastenapp en Opgietplanner gebruiken dezelfde actuele kaartstijl, terwijl de publieke sessielijst inhoudelijk exact gelijk blijft.

Wijziging 2 Gastenappcache v83 en worker query v81 activeren
JavaScript / configuratie
const guestAssets = {
  cacheName: 'thewhiteoak-public-v83',
  scriptUrl: 'assets/guest.js?v=116',
  workerUrl: 'sw.js?v=81'
};
const cacheNames = await caches.keys();
const staleCaches = cacheNames.filter(
  (name) => name.startsWith('thewhiteoak-public-') && name !== guestAssets.cacheName
);
await Promise.all(staleCaches.map((name) => caches.delete(name)));
await navigator.serviceWorker.register(guestAssets.workerUrl);
await (await caches.open(guestAssets.cacheName)).add(guestAssets.scriptUrl);

Wat doet dit?Regel 1 opent de assetconfiguratie. Regels 2, 3 en 4 leggen thewhiteoak-public-v83, guest.js v116 en worker query v81 vast. Regel 5 sluit de configuratie. Regel 6 vraagt alle caches op. Regel 7 start de selectie van oude gastenappcaches. Regel 8 sluit de actuele cache uit en regel 9 sluit de selectie. Regel 10 verwijdert de oude versies. Regel 11 registreert de vernieuwde worker. Regel 12 opent cache v83 en bewaart daarin guest.js v116.

Resultaat in de appOok een eerder geïnstalleerde gastenapp controleert de nieuwe worker en haalt de actuele gedeelde stijl en JavaScript-versie op.

2 wijzigingen

  • De gedeelde stijllaag is ververst zodat beide apps de actuele sessieopmaak gebruiken; de publieke sessielijst blijft inhoudelijk gelijk.
  • De gastenappcache en worker zijn ververst naar thewhiteoak-public-v83, guest.js v116 en worker query v81.
v1.1.47 Eén duidelijke sessieopmaak in beide apps
Probleem / foutmelding

De gastenapp had al een bewezen, duidelijke mobiele sessieopbouw, terwijl het interne dagprogramma nog een andere kaartvolgorde gebruikte. Dat maakte de twee apps visueel minder samenhangend en kon na een update tijdelijk een combinatie van oude en nieuwe stijlen opleveren.

Oplossing

De interne Opgietplanner sluit nu visueel aan op de duidelijke sessieweergave van de gastenapp. De gedeelde stylesheet en PWA-cache zijn vernieuwd zodat beide apps dezelfde actuele basisopmaak laden. De publieke sessielijst, planning, filters en detailwerking zijn inhoudelijk niet gewijzigd.

Technisch

De gedeelde responsieve kaartregels worden nu ook door het interne dagprogramma gebruikt. Een vernieuwde stylesheetversie en nieuwe cachenaam zorgen dat browsers en geïnstalleerde apps geen oude presentatiebestanden blijven combineren. De publieke Twig-gegevens en sessielogica zijn ongewijzigd gebleven.

Technische stappen
  1. De interne planner gebruikt voortaan dezelfde bewezen visuele volgorde als de gastenweergave.
  2. De gedeelde stylesheet is als één nieuwe versie gepubliceerd voor beide apps.
  3. De PWA-cache is vernieuwd zodat geïnstalleerde apps de actuele sessieopmaak ophalen.
  4. De publieke sessiegegevens, selectie, statusberekening en detailweergave zijn functioneel niet aangepast.
Voorbeeldcode per wijziging3 voorbeelden
Wijziging 1 Dezelfde responsieve kaartbasis in beide apps
CSS
.session-row {
  display: grid;
  grid-template-columns: 6rem minmax(0, 1fr) 3rem;
  gap: 1rem;
  align-items: center;
}
.session-people {
  display: flex;
  flex-wrap: wrap;
  gap: .75rem;
}
@media (max-width: 640px) {
  .session-row { grid-template-columns: 1fr; }
}

Wat doet dit?Regel 1 opent de gedeelde sessierij. Regel 2 activeert het raster. Regel 3 reserveert ruimte voor tijd, flexibele inhoud en de detailpijl. Regel 4 maakt vaste tussenruimte en regel 5 lijnt alles uit. Regel 6 sluit de kaartregel. Regel 7 opent de begeleidersgroep. Regel 8 zet profielen naast elkaar, regel 9 laat ze veilig omlopen en regel 10 bepaalt de afstand. Regel 11 sluit die groep. Regel 12 start de mobiele regel, regel 13 zet alles onder elkaar en regel 14 sluit de mediaquery.

Resultaat in de appDe interne planner leest nu als de vertrouwde gastenweergave, terwijl de gastenkaart haar bestaande duidelijke opbouw behoudt.

Wijziging 2 De gedeelde stijl en offlineversie tegelijk vernieuwen
JavaScript / configuratie
const sharedAssets = {
  css: '/opgietplanner/assets/white-oak-modern.css?v=23',
  guestCache: 'thewhiteoak-public-v82'
};
const cacheNames = await caches.keys();
await Promise.all(
  cacheNames
    .filter((name) => name.startsWith('thewhiteoak-public-'))
    .filter((name) => name !== sharedAssets.guestCache)
    .map((name) => caches.delete(name))
);
await caches.open(sharedAssets.guestCache);

Wat doet dit?Regel 1 opent de gedeelde assetconfiguratie. Regel 2 verwijst naar de vernieuwde CSS en regel 3 benoemt de nieuwe gastenappcache. Regel 4 sluit de configuratie. Regel 5 vraagt de bestaande caches op. Regel 6 start het opruimen. Regel 7 gebruikt alle cachenamen. Regel 8 selecteert alleen gastenappcaches. Regel 9 bewaart de actuele versie. Regel 10 verwijdert de verouderde versies. Regel 11 sluit de actie en regel 12 opent de nieuwe cache.

Resultaat in de appOok een geïnstalleerde gastenapp haalt de vernieuwde gedeelde stijl op en toont geen oude gemengde layout.

Wijziging 3 De publieke sessiewerking bewust ongewijzigd laten
JSON / configuratie
{
  "publicSessionList": {
    "dataSource": "unchanged",
    "daySelection": "unchanged",
    "statusCalculation": "unchanged",
    "detailView": "unchanged"
  },
  "visualUpdate": {
    "target": "internal-planner",
    "sharedStyles": true
  }
}

Wat doet dit?Regel 1 opent de controleconfiguratie. Regel 2 groepeert de publieke sessielijst. Regels 3 tot en met 6 bevestigen dat gegevensbron, dagkeuze, statusberekening en details niet zijn veranderd. Regel 7 sluit de publieke groep. Regel 8 opent de visuele update. Regel 9 wijst de interne planner als doel aan. Regel 10 bevestigt dat de gedeelde stijl wel wordt gebruikt. Regel 11 sluit die groep en regel 12 het volledige fragment.

Resultaat in de appGasten behouden exact dezelfde planning en bediening; alleen de gedeelde technische presentatielaag is vernieuwd.

3 wijzigingen

  • De interne Opgietplanner sluit nu visueel aan op de bewezen sessieweergave van de gastenapp.
  • De gedeelde stylesheet en PWA-cache zijn vernieuwd voor een consistente actuele opmaak.
  • De publieke sessielijst zelf is functioneel niet gewijzigd.
v1.1.46 Uitgebreide voorbeeldcode bij iedere wijziging
Probleem / foutmelding

Een update kon uit meerdere afzonderlijke verbeteringen bestaan, terwijl Wat is er nieuw en de volledige versiehistoriek maar één gezamenlijk codevoorbeeld toonden. Daardoor was de relatie tussen een wijziging, het technische voorbeeld en het zichtbare resultaat niet altijd duidelijk. Zoeken vond bovendien geen woorden die alleen in de afzonderlijke technische uitleg of code voorkwamen.

Oplossing

Iedere wijziging binnen een nieuwe release krijgt voortaan een eigen uitgebreid codevoorbeeld. Zowel de popup als de volledige versiehistoriek tonen per voorbeeld een wijzigingsnummer, duidelijke titel, programmeertaal, codefragment, begrijpelijke uitleg en zichtbaar resultaat. Zoeken kijkt in al deze velden. Oude releases blijven leesbaar en alle nieuwe labels zijn beschikbaar in het Nederlands, Frans en Engels.

Technisch

De historiek gebruikt nu een codeExamples-lijst die in dezelfde volgorde en met hetzelfde aantal items naast changes staat. Twig maakt per item een volledig voorbeeldblok en schrijft alle doorzoekbare velden naar het data-search-attribuut; JavaScript past daarop de bestaande zoekfilter toe. Voor bestaande releases blijft de oude enkele codeExample/codeExplanation-combinatie als terugval beschikbaar. De aangepaste presentatiestijlen en offlinebestanden hebben een nieuwe cacheversie gekregen.

Technische stappen
  1. Elke afzonderlijke wijziging heeft precies één eigen item in codeExamples.
  2. Popup en volledige historiek gebruiken dezelfde vaste volgorde voor nummer, titel, taal, code, uitleg en resultaat.
  3. De voorbeeldfragmenten zijn uitgebreid zodat ook de samenhang tussen de belangrijkste regels zichtbaar is.
  4. De zoekfunctie neemt de inhoud van alle afzonderlijke voorbeelden mee.
  5. Historische releases met één voorbeeld blijven via de bestaande terugval leesbaar.
  6. De labels voor wijziging, programmeertaal, uitleg en resultaat zijn vertaald in NL, FR en EN.
  7. De vernieuwde CSS en offlinecache zorgen dat de nieuwe weergave ook in een geïnstalleerde app wordt opgehaald.
Voorbeeldcode per wijziging5 voorbeelden
Wijziging 1 Meerdere codevoorbeelden aan één release koppelen
Twig
{% set releaseExamples = rel.codeExamples|default([]) %}
{% if releaseExamples|length %}
  <section class="cl-code-examples">
    {% for example in releaseExamples %}
      <article class="cl-code-card">
        <pre class="cl-code"><code>
          {{ example.code|default('') }}
        </code></pre>
      </article>
    {% endfor %}
  </section>
{% endif %}

Wat doet dit?De echte gedeelde Twig-template leest codeExamples uit de release en maakt alleen wanneer de lijst gevuld is een reeks afzonderlijke codekaarten. loop.index wordt verderop in dezelfde lus gebruikt als wijzigingsnummer. Omdat changes en codeExamples dezelfde volgorde gebruiken, blijft ieder technisch voorbeeld gekoppeld aan precies de juiste gebruikerswijziging.

Resultaat in de appEén release kan nu meerdere duidelijke codeblokken tonen, zonder dat verschillende wijzigingen in één algemeen voorbeeld worden samengeperst.

Wijziging 2 Nummer, taal, uitleg en resultaat duidelijk ordenen
Twig / HTML
<div class="cl-code-head">
  <div class="cl-code-heading">
    <small><em data-i18n="releaseChangeExample">
      Wijziging
    </em> {{ loop.index }}</small>
    <strong>{{ example.title }}</strong>
  </div>
  <span>{{ example.language }}</span>
</div>
<pre class="cl-code"><code>{{ example.code }}</code></pre>
<p class="cl-code-explanation">{{ example.explanation }}</p>
<p class="cl-code-result">{{ example.result }}</p>

Wat doet dit?Dit is dezelfde volgorde die de echte popup gebruikt: eerst wijzigingsnummer, titel en taal, daarna het codevlak, de uitleg en het resultaat. De vertaalmarkering op Wijziging zorgt dat dit vaste label met de taalkeuze meeschakelt. Daardoor kan een bezoeker eerst globaal scannen en daarna alleen het gewenste voorbeeld verder lezen.

Resultaat in de appDe popup en de volledige historiek tonen dezelfde complete en rustig opgebouwde informatie per wijziging.

Wijziging 3 Alle voorbeeldvelden opnemen in de zoekfunctie
Twig / JavaScript
data-search="{% for example in releaseExamples %}
  {{ example.title|default('')|lower }}
  {{ example.language|default('')|lower }}
  {{ example.code|default('')|lower }}
  {{ example.explanation|default('')|lower }}
  {{ example.result|default('')|lower }}
{% endfor %}"

var q = (searchInp.value || '').trim().toLowerCase();
var matchesSearch = !q ||
  (item.dataset.search || '').includes(q);

Wat doet dit?Twig voegt de vijf velden van ieder voorbeeld toe aan het bestaande data-search-attribuut. De al aanwezige JavaScriptfilter hoeft daarna alleen de zoekterm met die volledige, reeds genormaliseerde tekst te vergelijken. Zo gebruikt de zoekfunctie exact dezelfde bron als de zichtbare voorbeeldkaarten en blijft de vergelijking onafhankelijk van hoofdletters.

Resultaat in de appEen zoekopdracht vindt nu ook een release wanneer het gezochte woord alleen in de code, uitleg of het zichtbare resultaat staat.

Wijziging 4 Oude releases met één voorbeeld blijven tonen
Twig
{% set releaseCode = rel.code|default('') %}
{% if not releaseCode %}
  {% set releaseCode = rel.codeExample|default('') %}
{% endif %}
{% set releaseExamples = rel.codeExamples|default([]) %}

{% if releaseExamples|length %}
  {% for example in releaseExamples %}
    <pre><code>{{ example.code }}</code></pre>
  {% endfor %}
{% elseif releaseCode %}
  <pre><code>{{ releaseCode }}</code></pre>
  <p>{{ rel.codeExplanation|default('') }}</p>
{% endif %}

Wat doet dit?De echte template bepaalt eerst het historische releaseCode en controleert daarna of de nieuwe lijst bestaat. De nieuwe lijst krijgt voorrang; alleen wanneer die ontbreekt, leest Twig de vroegere velden code, codeExample en codeExplanation. Zo blijft de volledige historiek robuust zonder oude gegevens kunstmatig om te zetten.

Resultaat in de appAlle eerdere updates blijven openen met hun oorspronkelijke codefragment en uitleg, naast de uitgebreidere nieuwe releases.

Wijziging 5 Nieuwe labels vertalen en de offlinecache vernieuwen
JavaScript / Service worker
nl: { releaseChangeExample: 'Wijziging',
      releaseCodeResult: 'Resultaat in de app' },
fr: { releaseChangeExample: 'Modification',
      releaseCodeResult: "Résultat dans l'app" },
en: { releaseChangeExample: 'Change',
      releaseCodeResult: 'Result in the app' }

const CACHE = 'thewhiteoak-public-v81';
const STATIC = [
  '/opgietplanner/gasten/assets/guest.css?v=81',
  '/opgietplanner/gasten/assets/guest.js?v=114'
];

Wat doet dit?De echte woordenboeken bevatten voor iedere taal dezelfde nieuwe sleutels. De serviceworker gebruikt tegelijk cache v81 en verwijst expliciet naar de nieuwe CSS- en JavaScriptbestanden. Daardoor gebruikt zowel de webversie als de geïnstalleerde app de nieuwe presentatie en de juiste taal.

Resultaat in de appDe voorbeeldblokken hebben begrijpelijke labels in NL, FR en EN en verschijnen ook na een cacheverversing correct in de geïnstalleerde gastenapp.

5 wijzigingen

  • Wat is er nieuw en de volledige versiehistoriek ondersteunen meerdere codevoorbeelden per release.
  • Ieder voorbeeld toont wijzigingsnummer, titel, programmeertaal, uitgebreide code, begrijpelijke uitleg en zichtbaar resultaat.
  • Zoeken doorzoekt nu ook de titel, code, uitleg en het resultaat van alle afzonderlijke voorbeelden.
  • Oudere releases met één codeExample en codeExplanation blijven leesbaar.
  • Nieuwe labels zijn vertaald in NL, FR en EN en de vernieuwde CSS- en offlinecache wordt uitgerold.
v1.1.45 Nu & straks even helder als de interne Opgietplanner
Probleem / foutmelding

De gastenapp bevatte al dezelfde sessiegegevens als de interne Opgietplanner, maar de presentatie vormde nog niet hetzelfde duidelijke geheel. De titel, actuele status, ruimtefoto, tijd, begeleiders en klankbeleving stonden visueel losser van elkaar. Op kleinere schermen en in nachtmodus kostte het daardoor meer moeite om snel te zien wat de volgende sessie is, waar ze doorgaat en wie ze begeleidt.

Oplossing

Nu & straks gebruikt voortaan dezelfde heldere focuslayout als de interne Opgietplanner. Een brede ruimtefoto en een afzonderlijke inhoudskolom brengen tijd, sessietype, begeleiders en timing samen. De status bovenaan verandert automatisch van Later vandaag naar voorbereiding, bijna gestart, live of afkoelen. Iedere begeleider behoudt een eigen avatarcirkel. De klankbeleving van de dag sluit visueel aan op hetzelfde geheel en de mobiele weergave en het contrast in nachtmodus zijn verbeterd.

Technisch

De kop en sessiekaart delen nu één responsieve focusstructuur. JavaScript berekent de zichtbare status uit de geselecteerde dag en de starttijd van de eerstvolgende sessie. CSS gebruikt op breed scherm twee vaste inhoudszones en zet die op mobiel in één verticale leesvolgorde. De deelnemers worden per naam weergegeven, zodat iedere begeleider een afzonderlijke avatarpositie behoudt.

Technische stappen
  1. De aanduiding Nu & straks staat voortaan als vaste bovenkop boven Volgende sessie.
  2. De actuele sessiestatus staat rechtsboven en verandert automatisch volgens het tijdstip.
  3. De brede foto maakt de juiste ruimte meteen herkenbaar.
  4. Tijd, sessietype, volledige namen en startinformatie staan samen in een gescheiden inhoudskolom.
  5. Elke begeleider krijgt een eigen avatarcirkel, ook wanneer meerdere personen samen één sessie verzorgen.
  6. De klankbelevingsband volgt dezelfde rustige hiërarchie en uitlijning als in de interne app.
  7. Op mobiel worden foto en sessie-informatie zonder overlap onder elkaar geplaatst.
  8. Tekst, randen en statuskleuren hebben in nachtmodus meer contrast gekregen.
  9. De inhoud en planning zijn niet gewijzigd; alleen de presentatie en actuele statusweergave zijn gelijkgetrokken.
CodevoorbeeldTwig / JavaScript / CSS
featureState.className = 'moment-feature-state';
if (isSessionLive(primary)) {
  featureState.classList.add('is-live');
  featureLabel = text('liveNow');
}
featureState.querySelector('span').textContent = featureLabel;

Wat doet dit?Bij iedere weergave bepaalt de app opnieuw in welke fase de eerstvolgende sessie zit. De tekst en bijbehorende contrastkleur worden samen aangepast. Daardoor blijft de status bovenaan begrijpelijk zonder dat meerdere losse meldingen nodig zijn.

6 wijzigingen

  • Nu & straks en Volgende sessie volgen nu dezelfde focuslayout als de interne Opgietplanner.
  • Een brede ruimtefoto en afzonderlijke inhoudskolom maken de sessie sneller scanbaar.
  • De status bovenaan verandert automatisch volgens de actuele sessiefase.
  • Iedere begeleider behoudt een eigen avatarcirkel.
  • De klankbelevingsband is visueel gelijkgetrokken met de interne app.
  • Mobiele leesvolgorde en contrast in nachtmodus zijn verbeterd.
v1.1.44 Appversie altijd zichtbaar bij Nu & straks
Probleem / foutmelding

Gasten konden bij het dagprogramma niet meteen zien welke versie van de app actief was. De volledige wijzigingshistoriek bestond wel, maar was niet rechtstreeks gekoppeld aan Nu & straks. Een afzonderlijk ingevuld nummer in een statusvenster kon bovendien achterlopen op de nieuwste gepubliceerde release.

Oplossing

Bij Nu & straks staat nu een rustige, klikbare gastenappversie. De link opent rechtstreeks de volledige publieke versiehistoriek met alle eerdere problemen, oplossingen, technische stappen en codevoorbeelden. De versieaanduiding en de statusvensters lezen voortaan hetzelfde nummer uit de nieuwste changelogentry. De tekst en link worden correct ondersteund in NL, FR en EN.

Technisch

De gastenapp gebruikt de eerste entry van haar eigen changelog als centrale bron voor het versienummer. De zichtbare versieaanduiding en statusvensters krijgen daardoor altijd dezelfde actuele waarde. Gedeelde stijl v21 verzorgt de compacte presentatie, guest.js v112 de NL/FR/EN-bediening en gastenserviceworker v79 de vernieuwing van opgeslagen pagina's en bestanden.

Technische stappen
  1. De actuele gastenappversie staat zichtbaar bij Nu & straks zonder het dagprogramma drukker te maken.
  2. De volledige aanduiding is klikbaar en opent rechtstreeks alle publieke versiehistorieken.
  3. De nieuwste entry van changelog-gasten.json bepaalt automatisch het getoonde nummer.
  4. Het app-statusvenster gebruikt exact dezelfde versiebron.
  5. Een apart hardgecodeerd nummer kan daardoor niet meer achterlopen.
  6. De versieaanduiding, linktekst en toegankelijke omschrijving werken in NL, FR en EN.
  7. Gedeelde stijl v21 geeft de aanduiding een rustige, duidelijke vorm in lichte en donkere modus.
  8. Guest.js v112 koppelt de juiste vertaling en versiehistoriek aan de bediening.
  9. Gastenserviceworker v79 verwijdert verouderde opgeslagen versies van de pagina.
CodevoorbeeldPHP / Twig / JavaScript / CSS / JSON
const actueleVersie = changelog[0]?.version || '';
versionBadge.textContent = `v${actueleVersie}`;
versionBadge.href = `${basePath}/versies.php`;

Wat doet dit?Omdat de nieuwste release altijd bovenaan staat, is de eerste changelogentry de betrouwbare bron voor de actuele versie. Dezelfde waarde voedt de klikbare aanduiding en het statusvenster, waardoor beide onderdelen automatisch gelijk blijven.

7 wijzigingen

  • Gastenapp v1.1.44 staat voortaan zichtbaar bij Nu & straks.
  • De rustige versieaanduiding opent rechtstreeks de volledige publieke historiek.
  • Het dagprogramma en de app-status lezen hetzelfde nummer uit de nieuwste changelogentry.
  • Een ouder handmatig ingevuld versienummer kan niet meer blijven staan.
  • NL, FR en EN worden ondersteund voor de versieaanduiding en historieklink.
  • Gedeelde stijl v21 en guest.js v112 verzorgen de nieuwe presentatie en vertalingen.
  • Gastenserviceworker v79 vernieuwt de opgeslagen gastenapp.
v1.1.43 Duo-opgieters elk zichtbaar in de volgende sessie
Probleem / foutmelding

De volgende-sessiekaart in de gastenapp week visueel nog af van de duidelijkere interne Opgietplanner. Tijd, personen, sessietype en timing vormden daardoor niet dezelfde heldere informatiegroep. Bovendien verwijderde een URL-deduplicatie de tweede avatar wanneer twee verschillende opgieters dezelfde gezamenlijke bronfoto gebruikten, zoals Wim & Yvonne. Daardoor leek slechts één persoon zichtbaar terwijl zij de sessie samen verzorgen.

Oplossing

De gastenapp gebruikt nu dezelfde duidelijke hiërarchie als de interne volgende-sessiekaart: de ruimtefoto staat links op desktop en bovenaan op mobiel, gevolgd door de tijd, afzonderlijke portretten, volledige namen, de rol 2 opgieters samen, het sessietype, de actuele status en de exacte starttiming. Elke naam krijgt een eigen avatarpositie. Wanneer twee personen nog dezelfde gezamenlijke foto gebruiken, toont de app voor elke persoon een eigen links- of rechtsuitsnede. Zodra een persoonlijke profielfoto aanwezig is, wordt die automatisch gebruikt. Ook de detailkaart behoudt beide personen.

Technisch

De deelnemerlijst wordt voortaan op naam opgebouwd en niet meer op een unieke foto-URL. Daardoor blijven twee verschillende personen bestaan wanneer hun bronbestand gelijk is. CSS bepaalt bij een gedeelde duofoto per avatar een afzonderlijke links- of rechtsuitsnede. Schedule cache schema v22, gastenhoofdcode 111, guest.css 79, gedeelde stijlversie 20 en gastenserviceworker v78 vernieuwen gegevens, opmaak en offline cache.

Technische stappen
  1. De server maakt voor iedere afzonderlijke naam precies één profielrecord aan.
  2. Een gelijke foto-URL is geen reden meer om de tweede opgieter te verwijderen.
  3. Wim & Yvonne en andere duo's behouden daardoor altijd twee avatarposities.
  4. Bij een gedeelde bronfoto krijgt de eerste persoon een linkse en de tweede persoon een rechtse uitsnede.
  5. Een beschikbare persoonlijke profielfoto vervangt automatisch de tijdelijke uitsnede voor die persoon.
  6. Tijd, portretten, volledige namen, rol, sessietype, status en exacte timing staan in dezelfde volgorde als intern.
  7. De ruimtefoto blijft op desktop links en verhuist op mobiel boven de sessiegegevens.
  8. De mobiele kaart is op 360 pixels gecontroleerd zonder overlap, afgekorte namen of horizontale overloop.
  9. De sessiedetailkaart neemt dezelfde volledige deelnemerslijst over en behoudt dus beide personen.
  10. Schedule cache schema v22, guest.js 111, guest.css 79, gedeelde stijl 20 en gastenserviceworker v78 verversen de release.
CodevoorbeeldPHP / JavaScript / CSS / Twig / JSON
const hostPhotos = participantParts.map(part => ({
  name: part,
  url: photoByName[part] || null
}));

Wat doet dit?De mapping vertrekt van de namen en levert voor elke persoon een afzonderlijk avatarobject op. Twee namen mogen dus naar hetzelfde tijdelijke bronbestand verwijzen zonder dat één persoon verdwijnt. De presentatie kan daarna per persoon een eigen uitsnede toepassen en schakelt automatisch over op een persoonlijke foto zodra die beschikbaar is.

9 wijzigingen

  • De volgende-sessiekaart volgt voortaan dezelfde duidelijke hiërarchie als de interne Opgietplanner.
  • Elke opgieter krijgt een eigen avatarpositie, ook bij een gedeelde foto-URL.
  • Gedeelde duofoto's worden per persoon links en rechts afzonderlijk uitgesneden.
  • Persoonlijke profielfoto's worden automatisch gebruikt zodra ze beschikbaar zijn.
  • Volledige namen en de rol 2 opgieters samen staan zichtbaar bij de sessie.
  • Sessietype, status en exacte starttiming vormen één overzichtelijk informatieblok.
  • De 360-pixelsweergave blijft vrij van overlap en horizontale overloop.
  • De detailkaart behoudt alle personen van een gezamenlijke sessie.
  • Schedule cache schema v22, guest.js 111, guest.css 79, gedeelde stijl 20 en gastenserviceworker v78 leveren de vernieuwing uit.
v1.1.42 Volledige apphistoriek meteen bij Wat is er nieuw
Probleem / foutmelding

De popup Wat is er nieuw filterde de versiegegevens vooraf op de huidige datum. Oudere publicaties bestonden wel, maar waren vanuit de popup niet doorzoekbaar. Daardoor zag een gast alleen recente wijzigingen en niet het oorspronkelijke probleem, de oplossing, technische stappen of codevoorbeelden van oudere versies.

Oplossing

Wat is er nieuw opent nu als volledige, doorzoekbare historiek. De nieuwste versie staat meteen open met Probleem / foutmelding, Oplossing, Technisch, technische stappen, codevoorbeeld en uitleg. Alle oudere versies worden in hetzelfde venster geladen en kunnen op onderwerp worden gezocht of gefilterd. De aparte volledige pagina blijft beschikbaar voor wie langer wil lezen.

Technisch

Om de gewone gastenapp snel te houden, staan alleen de vijf nieuwste versies in de eerste HTML. Bij het openen haalt de popup een servergerenderd historiekfragment op via versies.php?fragment=changelog. Dat fragment bevat alle publieke releases en wordt daarna door dezelfde zoek-, filter- en pagineringslogica verwerkt. Gastenhoofdcode 110, guest.css 78 en serviceworker v77 vernieuwen deze functie.

Technische stappen
  1. De datumfilter Alleen vandaag is volledig verwijderd.
  2. De popup meldt zichtbaar hoeveel publieke versies beschikbaar zijn.
  3. De nieuwste versie staat automatisch open zodat probleem en oplossing meteen leesbaar zijn.
  4. Zoeken doorloopt versietitel, probleem, oplossing, technische uitleg, technische stappen, code en wijzigingen.
  5. De filters Alles, Verbeteringen, Opgelost en Technisch werken over de volledige historiek.
  6. Per pagina verschijnen tien releases om de mobiele popup overzichtelijk en snel te houden.
  7. De historiek ligt visueel boven andere apppanelen zodat geen profiel- of keuzescherm de tekst kan bedekken.
  8. De volledige versiepagina toont nu ook technische stappen, code-uitleg en het tijdstip van publicatie.
  9. Bij tijdelijk geen verbinding blijven de vijf nieuwste, reeds ingeladen versies beschikbaar.
CodevoorbeeldTwig / PHP / JavaScript
fetch(modal.dataset.historySource)
  .then(response => response.text())
  .then(html => {
    changelogList.innerHTML = html;
    refresh();
  });

Wat doet dit?De app laadt de volledige historiek pas wanneer ze nodig is. Zo opent de gewone dagplanning snel, terwijl Wat is er nieuw toch alle versies in hetzelfde doorzoekbare venster kan tonen.

8 wijzigingen

  • Wat is er nieuw toont voortaan de volledige gastenapphistoriek.
  • De beperking Alleen vandaag is verwijderd.
  • De nieuwste versie opent meteen met probleem, oplossing, techniek en code.
  • Zoeken en filters werken nu over alle publieke versies.
  • Ook code-uitleg en technische stappen verschijnen op de volledige versiepagina.
  • Andere apppanelen kunnen de mobiele historiek niet meer overlappen.
  • De historiek wordt pas bij gebruik geladen zodat de gastenapp snel blijft.
  • Gastenapp v1.1.42, hoofdcode 110, guest.css 78 en serviceworker v77 leveren de vernieuwing uit.
v1.1.41 Volgende sessie even duidelijk als in de Opgietplanner
Probleem / foutmelding

Wanneer de volgende sessie nog meer dan een uur verwijderd was, maakte de gastenapp de ruimtefoto klein terwijl de volledige kaart groot bleef. Daardoor ontstond veel lege ruimte en stonden foto, tijd, opgieters en status te ver uit elkaar. De interne Opgietplanner gaf dezelfde informatie veel duidelijker weer.

Oplossing

De gastenapp gebruikt nu dezelfde heldere beeldverhouding als de interne Opgietplanner. De ruimtefoto blijft altijd groot, ook wanneer een sessie pas later begint. Op desktop staan de foto links en alle kerninformatie compact rechts. Op mobiel volgen foto, opgieters, sessietype en status elkaar rustig onder elkaar op.

Technisch

De aparte compacte opmaak voor verre sessies is verwijderd. Eén responsief raster bepaalt nu de kaart voor alle starttijden: 340 pixels hoge ruimtefoto op desktop en 220 pixels op mobiel. Gastenserviceworker v76, hoofdcodeversie 109 en de nieuwe gedeelde stijlversie 19 verversen de voorstelling; interne serviceworker v373 en HTML-cache v311 houden beide apps technisch gelijk.

Technische stappen
  1. Een sessie die later op de dag begint, behoudt dezelfde grote ruimtefoto als een nabije sessie.
  2. Desktop gebruikt een duidelijke tweedeling met de foto links en de informatie rechts.
  3. Tijd, sessietype, opgieters en startstatus staan opnieuw als één samenhangend geheel bij elkaar.
  4. Mobiel gebruikt één verticale leesvolgorde zonder smalle of zwevende tekstkolommen.
  5. De detailpijl blijft zichtbaar zonder namen of foto's te overlappen.
  6. De kaart is gecontroleerd in lichte modus en nachtmodus.
  7. Gastenserviceworker v76, hoofdcodeversie 109 en gedeelde stijlversie 19 leveren de nieuwe kaart onmiddellijk uit.
  8. Interne serviceworker v373 en HTML-cache v311 voorkomen een verschil tussen oude en nieuwe stijlen.
CodevoorbeeldCSS / Twig / JavaScript / JSON
.moment-session, .moment-session.is-distant { grid-template-columns: minmax(380px, .95fr) minmax(0, 1.05fr) 44px; }

Wat doet dit?De gewone en de verder verwijderde sessie gebruiken bewust hetzelfde raster. Daardoor kan de tijd tot de start de inhoud en foto niet meer verkleinen; alleen de statusmelding verandert nog.

8 wijzigingen

  • De ruimtefoto van de volgende sessie blijft altijd groot.
  • Foto en kerninformatie gebruiken op desktop dezelfde duidelijke verhouding als intern.
  • Tijd, opgieters, sessietype en status staan compacter bij elkaar.
  • Mobiel toont de volledige kaart rustig onder elkaar.
  • Er is geen horizontale overloop of overlap met de detailpijl.
  • De lichte modus en nachtmodus behouden voldoende contrast.
  • Gastenserviceworker v76 en stijlversie 19 verversen de gastenapp.
  • Interne serviceworker v373 en HTML-cache v311 houden beide apps gelijk.
v1.1.40 Rasmus' persoonlijke klankbeeld staat voortaan centraal
Probleem / foutmelding

De gastenapp gebruikte bij Rasmus het algemene klankbeeld als hoofdafbeelding, hoewel zijn eigen terugkerende belevingsfoto al beschikbaar was. Daardoor was zijn klankbeleving minder persoonlijk en aantrekkelijk. Bij sound healers zonder eigen belevingsfoto suggereerde de knop Bekijk foto ten onrechte dat er een persoonlijke foto klaarstond.

Oplossing

Rasmus gebruikt voortaan zijn reeds opgeladen terugkerende persoonlijke belevingsfoto als hoofdbeeld in het publieke dagprogramma en in de sessiedetails. Zijn aparte profielfoto en naam blijven ernaast zichtbaar en de belevingsfoto wordt niet dubbel getoond. Sound healers zonder persoonlijke belevingsfoto krijgen een duidelijk neutraal The White Oak-sfeerbeeld met hun eigen profiel of initiaal, zonder misleidende knop Bekijk foto. Het interne dagprogramma gebruikt dezelfde voorstelling.

Technisch

De gastenapp kiest eerst de eigen terugkerende belevingsfoto van de ingeplande sound healer en gebruikt alleen bij ontbreken daarvan het neutrale The White Oak-sfeerbeeld. Een unieke mediacontrole verwijdert een tweede vermelding van hetzelfde beeld. Gastenserviceworker v75 en guest schedule cache v21 vernieuwen de publieke app; interne serviceworker v372 en HTML-cache v310 houden de Opgietplanner gelijk.

Technische stappen
  1. Rasmus' bestaande terugkerende belevingsfoto wordt het hoofdbeeld van zijn klankbeleving.
  2. Het beeld verschijnt in het publieke dagprogramma en in de sessiedetails.
  3. Zijn aparte profielfoto en naam blijven naast het belevingsbeeld staan.
  4. Dezelfde foto wordt niet opnieuw als extra detailbeeld toegevoegd.
  5. Zonder persoonlijke belevingsfoto verschijnt een neutraal The White Oak-sfeerbeeld.
  6. De juiste profielfoto of initiaal blijft ook bij het neutrale beeld zichtbaar.
  7. De neutrale terugval toont geen misleidende knop Bekijk foto.
  8. De vaste keuzevolgorde is eigen belevingsfoto en daarna het neutrale sfeerbeeld.
  9. Gastenserviceworker v75 en guest schedule cache v21 vernieuwen de gastenapp.
  10. Interne serviceworker v372 en HTML-cache v310 houden beide dagprogramma's gelijk.
CodevoorbeeldPHP / Twig / JavaScript / JSON
const hoofdbeeld = eigenBelevingsfoto || neutraalTheWhiteOakSfeerbeeld;
const detailMedia = verwijderDubbelBeeld(media, hoofdbeeld);

Wat doet dit?De gastenapp gebruikt de meest persoonlijke geldige bron: eerst de eigen terugkerende belevingsfoto en anders het neutrale The White Oak-sfeerbeeld. Een controle op hetzelfde mediabestand voorkomt dat het gekozen hoofdbeeld nogmaals onder de details verschijnt.

9 wijzigingen

  • Rasmus krijgt zijn reeds opgeladen terugkerende belevingsfoto als hoofdbeeld.
  • Het persoonlijke beeld staat in het dagprogramma en in de sessiedetails.
  • Zijn aparte profielfoto en naam blijven zichtbaar.
  • Dezelfde belevingsfoto verschijnt niet dubbel.
  • Zonder eigen belevingsfoto verschijnt een neutraal The White Oak-sfeerbeeld met profiel of initiaal.
  • De neutrale terugval heeft geen misleidende knop Bekijk foto.
  • De keuzevolgorde is eigen belevingsfoto, gevolgd door het neutrale sfeerbeeld.
  • Gastenserviceworker v75 en guest schedule cache v21 verversen de gastenapp.
  • Interne serviceworker v372 en HTML-cache v310 houden beide apps gelijk.
v1.1.39 Vaste klankkaart met eigen profiel
Probleem / foutmelding

Het hoofdbeeld bij een klankbeleving kon per sound healer verschillen en soms volledig door een profielfoto worden vervangen. Daardoor was het echte klankbeeld van The White Oak niet altijd herkenbaar en stond de begeleider niet duidelijk als afzonderlijke persoon naast de beleving.

Oplossing

Iedere werkelijk ingeplande sound healer krijgt voortaan dezelfde herkenbare klankkaart met het echte The White Oak-klankbeeld als hoofdbeeld. Daarnaast verschijnen de eigen ronde profielfoto en naam. Wanneer nog geen profielfoto beschikbaar is, toont de gastenapp een duidelijke initiaal. In de sessiedetails staat deze vaste klankkaart eerst en volgen eventuele persoonlijke belevingsfoto's daarna.

Technisch

Het profiel en het klankbeeld zijn gescheiden gegevens: het vaste beeld bepaalt de klankkaart en profielnaam plus profielfoto of initiaal bepalen wie de sessie begeleidt. Guest schedule cache v20, guest.css v76, guest.js v107 en gastenserviceworker v74 vernieuwen de publieke app. Interne serviceworker v371 en HTML-cache v309 houden de gekoppelde Opgietplanner gelijk.

Technische stappen
  1. Het echte The White Oak-klankbeeld blijft bij iedere sound healer de vaste hoofdafbeelding.
  2. De ronde profielfoto en naam tonen afzonderlijk wie de klankbeleving begeleidt.
  3. Ontbreekt een profielfoto, dan verschijnt een duidelijke initiaal van de juiste persoon.
  4. Een foto van een andere sound healer wordt nooit gebruikt.
  5. De vaste klankkaart staat als eerste beeld in de sessiedetails.
  6. Eventuele persoonlijke belevingsfoto's blijven daarna als extra sfeerbeeld beschikbaar.
  7. Guest schedule cache v20 vernieuwt de gescheiden profiel- en klankbeeldgegevens.
  8. Guest.css v76, guest.js v107 en gastenserviceworker v74 vernieuwen de publieke weergave.
  9. Interne serviceworker v371 en HTML-cache v309 houden beide dagprogramma's gelijk.
CodevoorbeeldPHP / Twig / JavaScript / CSS / JSON
const klankkaart = { image: theWhiteOakKlankbeeld, profile: profielfoto || initiaal };

Wat doet dit?Het klankbeeld blijft de vaste visuele basis, terwijl de persoonlijke profielgegevens ernaast worden geplaatst. Zo blijft de beleving herkenbaar en is tegelijk duidelijk wie de sessie begeleidt.

7 wijzigingen

  • Iedere sound healer gebruikt hetzelfde echte The White Oak-klankbeeld als hoofdbeeld.
  • De eigen ronde profielfoto en naam staan zichtbaar naast de klankkaart.
  • Zonder profielfoto verschijnt een duidelijke initiaal.
  • De vaste klankkaart staat eerst in de sessiedetails.
  • Eventuele persoonlijke belevingsfoto's volgen daarna als extra sfeerbeeld.
  • Guest schedule cache v20, guest.css v76, guest.js v107 en gastenserviceworker v74 verversen de gastenapp.
  • Interne serviceworker v371 en HTML-cache v309 houden de weergave met de Opgietplanner gelijk.
v1.1.38 Elke sound healer herkenbaar in de klankbeleving
Probleem / foutmelding

Niet iedere sound healer heeft al een vaste belevingsfoto. Daardoor kon bij een klankbeleving een passend beeld ontbreken. Een foto van een andere begeleider als tijdelijke oplossing zou verwarrend en onjuist zijn.

Oplossing

De gastenapp toont voortaan automatisch een passend beeld bij iedere werkelijk ingeplande sound-healing- of live sessie. De eigen vaste belevingsfoto heeft voorrang. Als die nog ontbreekt, verschijnt de bestaande profielfoto van de sound healer. Is ook die niet beschikbaar, dan gebruikt de app een neutraal echt klankbeeld van The White Oak. De foto van een andere persoon wordt nooit gebruikt. Het beeld staat in de dagmedia en de sessiedetails en verschijnt niet bij gewone opgietsessies. Zodra later via Dagmedia beheren een eigen belevingsfoto wordt opgeladen, vervangt die de tijdelijke terugval automatisch.

Technisch

De planning bepaalt eerst of het werkelijk om een ingeplande sound-healing- of live sessie gaat en kiest daarna de eerste beschikbare bron in de volgorde belevingsfoto, eigen profielfoto en neutraal klankbeeld. Gasten cache v73 en schedule cache v19 verversen de beeldgegevens en weergave.

Technische stappen
  1. Een eigen vaste belevingsfoto heeft altijd voorrang.
  2. Als die ontbreekt, gebruikt de gastenapp de bestaande profielfoto van dezelfde sound healer.
  3. Zonder persoonlijke foto verschijnt een neutraal echt klankbeeld van The White Oak.
  4. De foto van een andere persoon wordt nooit als terugval gebruikt.
  5. Het beeld verschijnt alleen bij werkelijk ingeplande sound-healing- en live sessies.
  6. Dagmedia en sessiedetails gebruiken dezelfde betrouwbare beeldkeuze.
  7. Gewone opgietsessies krijgen geen sound-healerbeeld toegevoegd.
  8. Een latere upload via Dagmedia beheren vervangt de tijdelijke terugval automatisch.
  9. Gasten cache v73 en schedule cache v19 zorgen dat de actuele beeldkeuze wordt geladen.
CodevoorbeeldPHP / JSON
$beeld = $belevingsfoto ?? $eigenProfielfoto ?? $klankbeeldVanTheWhiteOak;

Wat doet dit?De gastenapp gebruikt altijd de meest persoonlijke beschikbare bron, maar alleen van de juiste begeleider. Als er nog geen persoonlijke foto is, blijft het neutrale klankbeeld van The White Oak een correcte en herkenbare laatste keuze.

8 wijzigingen

  • Elke werkelijk ingeplande sound healer krijgt automatisch een passend beeld.
  • De eigen vaste belevingsfoto heeft altijd voorrang.
  • Daarna volgen de eigen profielfoto en een neutraal echt klankbeeld van The White Oak.
  • De foto van een andere persoon wordt nooit getoond.
  • Het beeld staat alleen bij sound-healing- en live sessies, in dagmedia en details.
  • Gewone opgietsessies blijven ongewijzigd.
  • Een latere upload via Dagmedia beheren vervangt de tijdelijke terugval automatisch.
  • Gasten cache v73 en schedule cache v19 verversen de wijziging.
v1.1.37 Belevingsfoto's keren automatisch terug bij de juiste begeleider
Probleem / foutmelding

Een extra belevingsfoto was tot nu toe aan één datum gekoppeld. Daardoor zagen gasten de klankbelevingsfoto van Rasmus alleen op de oorspronkelijk gekozen dag, ook wanneer hij later opnieuw een live sessie verzorgde. Een vaste foto mocht tegelijk niet verschijnen op dagen waarop de gekoppelde begeleider niet aanwezig is.

Oplossing

Belevingsfoto's kunnen voortaan voor Elke sessiedag worden bewaard. De gastenapp toont zo'n foto automatisch op iedere dag waarop de gekoppelde opgieter of sound healer werkelijk in het programma staat, zowel in het dagblok als in de sessiedetails. Rasmus' bestaande klankbelevingsfoto wordt na publicatie terugkerend. Anouschka's foto van 10 augustus en eventmedia blijven uitsluitend zichtbaar op hun gekozen datum. Andere sound healers kunnen later via dezelfde uploader een vaste foto krijgen.

Technisch

De gastenapp ontvangt alleen terugkerende media waarvan de gekoppelde persoon in de actuele dagplanning voorkomt. Een invoer met scope date blijft beperkt tot één gekozen datum; scope recurring volgt passende sessiedagen. Gastenserviceworker v72, guest.js v105 en schema-cache guest-schedule-v18 verversen zowel de weergave als de nieuwe mediametadata.

Technische stappen
  1. Een terugkerende belevingsfoto wordt gekoppeld aan de naam van een opgieter of sound healer.
  2. De foto verschijnt alleen op een dag waarop die persoon werkelijk een sessie verzorgt.
  3. Bij een live sessie wordt ook de gekoppelde sound healer meegenomen.
  4. Het passende beeld staat in het dagblok en bij Meer info in de sessiedetails.
  5. Rasmus' bestaande klankbelevingsfoto wordt na publicatie op recurring gezet.
  6. Anouschka's belevingsfoto van 10 augustus blijft alleen op die datum zichtbaar.
  7. Eventfoto's, flyers en video's blijven datumgebonden.
  8. Andere sound healers kunnen later via dezelfde uploader een eigen vast sfeerbeeld krijgen.
  9. Gastenserviceworker v72 en guest.js v105 laden de nieuwe werking.
  10. Schema-cache guest-schedule-v18 voorkomt dat oudere datumgebonden beeldgegevens blijven hangen.
CodevoorbeeldPHP / JavaScript / JSON
const zichtbaar = media.scope === 'recurring'
  ? geplandePersonen.includes(media.person)
  : media.date === geselecteerdeDatum;

Wat doet dit?De gastenapp toont een terugkerende foto alleen wanneer de gekoppelde naam in het programma van de gekozen dag voorkomt. Datumgebonden media blijven via de exacte datum gecontroleerd, zodat tijdelijke foto's en events niet per ongeluk terugkeren.

7 wijzigingen

  • Belevingsfoto's kunnen automatisch terugkeren op iedere passende sessiedag.
  • De gekoppelde opgieter of sound healer moet die dag werkelijk in de planning staan.
  • Rasmus' klankbelevingsfoto wordt na publicatie bij zijn toekomstige sessiedagen getoond.
  • Anouschka's foto van 10 augustus en eventmedia blijven datumgebonden.
  • De foto staat zowel in het dagblok als in de sessiedetails.
  • Andere sound healers kunnen later via dezelfde uploader een vaste foto krijgen.
  • Gastenserviceworker v72, guest.js v105 en schema-cache guest-schedule-v18 verversen de wijziging.
v1.1.36 Live sessie om 19:00 nu correct vrij toegankelijk
Probleem / foutmelding

Bij de live opgietsessie met sound healing om 19:00 verscheen onterecht een groot blok met de boodschap dat gasten aan de receptie een deelnamekaartje moesten vragen. Iedereen mag aan deze gewone live sessie deelnemen. Het woord avondbeleving in de uitleg activeerde per ongeluk de te ruime automatische controle.

Oplossing

De live sessie om 19:00 wordt nu correct als vrij toegankelijk weergegeven. Het deelnamekaartje en Inschrijven verplicht zijn verwijderd bij gewone live opgietsessies en standaard sound healing zonder prijs of maximumaantal. Alleen sessies met een concrete inschrijfreden behouden de receptie-informatie.

Technisch

De controle baseert zich voortaan op prijs, maximumcapaciteit, scrub of een expliciet bijzonder sessietype. Algemene woorden uit de sfeer- en verwachtingsomschrijving tellen niet meer mee. Gastenserviceworker v71 en guest.js v104 zorgen dat ook de geïnstalleerde app de correctie ophaalt.

Technische stappen
  1. De 19:00 live opgietsessie met sound healing toont geen kaartjesblok meer.
  2. Een gewone sound-healingsessie zonder beperking blijft vrij toegankelijk.
  3. Prijs, maximumaantal of scrub blijft altijd zichtbaar als inschrijfreden.
  4. Ceremonies, rituelen, banja, cacao en expliciet speciale sessies behouden hun receptie-instructies.
  5. De tekst Wat kun je verwachten? kan de kaartjesmelding niet meer per ongeluk activeren.
  6. Gastenserviceworker v71 en guest.js v104 verversen de publieke app.
CodevoorbeeldJavaScript
const beperkt = session.price || session.capacity || session.type === 'scrub';
const kaartje = beperkt || isExplicietBijzonder(session.title);

Wat doet dit?Een deelnamekaartje verschijnt alleen wanneer concrete sessiegegevens dat aangeven. De algemene sfeeromschrijving wordt niet langer als inschrijfregel gelezen.

5 wijzigingen

  • De live sessie om 19:00 is correct vrij toegankelijk.
  • Het deelnamekaartje en Inschrijven verplicht zijn daar verwijderd.
  • Ook gewone sound healing zonder beperking vraagt geen kaartje.
  • Scrubs, betalende en begrensde sessies behouden hun receptie-informatie.
  • Gastenserviceworker v71 en guest.js v104 verversen de correctie.
v1.1.35 Extra sfeerbeelden bij de juiste sessie
Probleem / foutmelding

In de details van een sessie zagen gasten de foto van de ruimte, maar een extra sfeerbeeld van de betreffende opgieter of sound healer stond alleen los bij de dagmedia. Daardoor ontbrak een visuele indruk van de begeleider en diens beleving op het moment dat iemand meer informatie opende.

Oplossing

Sessiedetails kunnen nu een compacte galerij met extra sfeerbeelden tonen. De app koppelt ieder beeld aan de begeleider en de dag waarop de sessie plaatsvindt. De foto van de sauna of wellnessruimte blijft bovenaan staan, zodat locatie en sfeer elk hun eigen duidelijke plaats houden. De nieuwe foto van Rasmus verschijnt bij zijn sessies van donderdag 20 augustus en verandert zijn profielfoto niet.

Technisch

De publieke planning ontvangt per sessie alleen de passende beeldmetadata. Ook live sessies herkennen de gekoppelde sound healer. Maximaal vier foto's worden geladen en een niet-beschikbaar beeld verdwijnt automatisch. Gastenserviceworker v70, guest.js v103, guest.css v74 en theme-switcher.css v8 zorgen dat de nieuwe galerij meteen en met voldoende contrast beschikbaar is.

Technische stappen
  1. De vaste ruimtefoto blijft bovenaan iedere detailweergave staan.
  2. Extra beelden worden gekoppeld op begeleidersnaam en sessiedatum.
  3. Opgieters en sound healers in een live sessie worden allebei meegenomen.
  4. Maximaal vier beelden worden in een rustige galerij getoond.
  5. Foto's kunnen afzonderlijk groter worden geopend.
  6. Een foto die niet kan worden geladen verdwijnt zonder een leeg vlak achter te laten.
  7. De galerij werkt op mobiel en desktop en in lichte en donkere weergave.
  8. Gastenserviceworker v70, guest.js v103 en guest.css v74 verversen de publieke app.
CodevoorbeeldPHP / JavaScript / CSS
const photos = session.experiencePhotos || [];
renderGallery(photos.slice(0, 4));

Wat doet dit?De sessie ontvangt alleen de beelden die voor dezelfde begeleider en datum zijn geregistreerd. De gastenapp maakt daar een compacte galerij van en toont niets wanneer er geen passend beeld is.

5 wijzigingen

  • Extra sfeerbeelden staan nu bij de details van de juiste sessie.
  • De ruimtefoto blijft als eerste en grootste beeld zichtbaar.
  • De foto van Rasmus wordt gekoppeld aan zijn sessies van 20 augustus.
  • De profielfoto van Rasmus blijft ongewijzigd.
  • De nieuwe galerij werkt op mobiel, desktop en in nachtmodus.
v1.1.34 Badkledingdagen en opgietsessies meteen herkenbaar
Probleem / foutmelding

Gasten konden in de dagknoppen niet altijd meteen zien op welke dagen badkleding geldt. Ook werd de benaming Opgieting nog in verschillende programma-, live-, detail- en planningsteksten gebruikt, terwijl Opgietsessie duidelijker beschrijft wat de gast kan verwachten.

Oplossing

Badkleding staat nu compact in de dagknoppen van de betreffende dagen. Gasten zien deze praktische informatie daardoor al bij het kiezen van een dag. Opgieting is in het dagprogramma, de live- en detailweergaven en de relevante planningsonderdelen consequent vervangen door Opgietsessie. De aanpassing is afgestemd op licht en nachtmodus en op mobiele en desktopschermen.

Technisch

De gedeelde white-oak-modern.css v18 en theme-switcher.css v7 regelen de compacte markering en het juiste contrast. Gastenserviceworker/cache v69 en guest.js v102 verversen de gastenapp. Interne serviceworker v363 en HTML-cache v301 leveren dezelfde gedeelde verbetering aan de Opgietplanner.

Technische stappen
  1. Badkleding verschijnt alleen op de betreffende dagen als compacte extra regel in de dagknop.
  2. De volledige dagnaam en datum blijven ook op een smalle telefoon duidelijk leesbaar.
  3. Opgieting is vervangen door Opgietsessie in dagprogramma, livekaart, details en relevante planningsweergaven.
  4. Licht en nachtmodus gebruiken elk een contrastrijke, rustige kleur voor de badkledingmarkering.
  5. De dagknoppen behouden op mobiel en desktop dezelfde duidelijke hiërarchie.
  6. white-oak-modern.css v18 bevat de gedeelde indeling en typografie.
  7. theme-switcher.css v7 verzorgt de leesbaarheid in de lichte en donkere weergave.
  8. Gastenserviceworker/cache v69 zorgt dat eerder opgeslagen app-pagina's worden vernieuwd.
  9. guest.js v102 gebruikt de nieuwe daginformatie en consequente sessiebenaming.
  10. Interne serviceworker v363 en HTML-cache v301 verversen dezelfde gedeelde onderdelen in de Opgietplanner.
CodevoorbeeldTwig / JavaScript / CSS
{% if day.badkleding %}
  <span class="day-clothing">Badkleding</span>
{% endif %}

const sessionLabel = 'Opgietsessie';

Wat doet dit?De dagknop toont de praktische badkledinginformatie alleen wanneer die voor de gekozen datum geldt. Eén vaste sessiebenaming voorkomt dat gasten in verschillende onderdelen afwisselend Opgieting en Opgietsessie lezen.

7 wijzigingen

  • Badkleding staat nu compact in de dagknoppen van de gastenapp.
  • Opgieting is vervangen door Opgietsessie in dagprogramma, live- en detailweergaven en relevante planningsonderdelen.
  • De dagmarkering is duidelijk in licht en nachtmodus.
  • Mobiel en desktop behouden dezelfde rustige, leesbare indeling.
  • white-oak-modern.css v18 en theme-switcher.css v7 verzorgen vormgeving en contrast.
  • Gastenserviceworker/cache v69 en guest.js v102 verversen de publieke app.
  • Interne serviceworker v363 en HTML-cache v301 verversen dezelfde gedeelde verbetering in de Opgietplanner.
v1.1.33 Nachtmodus met helder en consequent contrast
Probleem / foutmelding

In de donkere avondweergave namen sommige teksten onbedoeld dezelfde donkere kleur over als panelen en andere oppervlakken. Daardoor waren tijden, statussen, live- en sound-healinglabels, tekst op ruimtefoto's en onderdelen van het ontwikkelaars- en contactblok moeilijker te lezen. Gedeelde onderdelen zoals de badkledingmelding, dagknoppen en profielwisselaar hadden niet overal dezelfde duidelijke contrastverhouding.

Oplossing

De gastenapp gebruikt nu overal een heldere en consequente nachtmodus. De volgende-sessietijd en statussen zijn beter afgetekend, live- en sound-healinglabels blijven zichtbaar en teksten over ruimtefoto's behouden een heldere witte kleur. Ook de badkledingbanner, dagknoppen, foto-overlays, profielwisselaar en het ontwikkelaars- en contactblok volgen dezelfde rustige kleurhiërarchie. De verbetering is afgestemd op zowel desktop als mobiel.

Technisch

De gedeelde theme-switcher.css v6 houdt semantische oppervlaktekleuren en tekstkleuren uit elkaar. Een kleur die een donker paneel voorstelt wordt hierdoor niet langer als tekstkleur toegepast op donkere of fotografische vlakken. Gastenserviceworker v68 haalt de nieuwe gastenweergave op; interne serviceworker v362 en HTML-cache v300 vernieuwen dezelfde gedeelde contrastregels in de Opgietplanner.

Technische stappen
  1. De tijd op de grote volgende-sessiekaart gebruikt een lichte tekstkleur op een donkergroen tijdvlak.
  2. De naam van de ruimte en andere tekst over foto's blijven wit en duidelijk zichtbaar.
  3. Live-, binnenkort-, bezig- en herstelstatussen hebben ieder een leesbare combinatie van tekst, achtergrond en accent.
  4. Sound-healinglabels behouden voldoende contrast op gewone en gemarkeerde sessies.
  5. Badkledingmeldingen en dagknoppen sluiten aan op de rustige donkere huisstijl.
  6. De profielwisselaar gebruikt ook 's avonds duidelijke titels, secties en acties.
  7. Het ontwikkelaars- en contactblok heeft leesbare hoofdtekst, secundaire tekst en iconen.
  8. De contrastregels zijn gedeeld tussen desktop en mobiel, zodat de inhoud op beide schermformaten herkenbaar blijft.
  9. theme-switcher.css v6 gebruikt semantische donkere kleuren uitsluitend als oppervlak en kiest afzonderlijke lichte tekstkleuren voor donkere en fotografische vlakken.
  10. Gastenserviceworker v68 ververst de publieke app; interne serviceworker v362 en HTML-cache v300 verversen de Opgietplanner.
CodevoorbeeldCSS
html[data-wo-theme="dark"] .moment-room-media time {
  color: #f7faf8;
  background: rgba(28, 76, 53, 0.96);
}

html[data-wo-theme="dark"] .moment-room-caption,
html[data-wo-theme="dark"] .featured-session {
  color: #ffffff;
}

Wat doet dit?De tijd en teksten op foto's krijgen in nachtmodus een eigen lichte voorgrondkleur. Donkere semantische kleuren blijven de onderliggende panelen aanduiden en worden niet meer hergebruikt voor tekst. Daardoor blijft dezelfde informatie leesbaar, ongeacht of ze op een kaart of rechtstreeks op een foto staat.

7 wijzigingen

  • De volledige gastenapp heeft in nachtmodus een sterk en consequent kleurcontrast.
  • Volgende-sessietijd, statussen en live- en sound-healinglabels zijn duidelijker leesbaar.
  • Tekst op ruimtefoto's en andere foto-overlays blijft helder wit.
  • Badkledingbanner, dagknoppen en profielwisselaar volgen dezelfde rustige avondstijl.
  • Het ontwikkelaars- en contactblok blijft duidelijk op desktop en mobiel.
  • theme-switcher.css v6 voorkomt dat semantische oppervlaktekleuren als tekstkleur op donkere of fotografische vlakken worden gebruikt.
  • Gastenserviceworker v68 ververst de gastenapp; interne serviceworker v362 en HTML-cache v300 verversen dezelfde gedeelde regels in de Opgietplanner.
v1.1.32 Grotere inhoud in compactere dagkaarten
Probleem / foutmelding

De grotere mobiele dagkaarten waren goed leesbaar, maar namen door hun volledig verticale opbouw te veel hoogte in. Hierdoor waren minder sessies tegelijk zichtbaar en voelde het programma minder compact dan nodig.

Oplossing

Tijden, sessietitels en namen van opgieters blijven groot en de profielfoto's zijn iets vergroot naar 52 pixels. De dagkaart zelf is professioneler en veel compacter opgebouwd: tijd en status staan logisch naast elkaar, lege ruimte is verminderd en namen, ruimte en Meer info blijven duidelijk zichtbaar. Alleen sessies die bijna beginnen, live zijn of extra aandacht vragen krijgen een kader; gewone sessies blijven rustige, gescheiden regels. De mobiele weergave is in licht en nachtmodus gecontroleerd op 360 en 390 pixels, zonder horizontale overloop.

Technisch

De gedeelde stylesheet white-oak-modern.css v16 verzorgt de compacte mobiele indeling. Gasten-serviceworker v67 haalt deze nieuwste vormgeving op. De interne Opgietplanner gebruikt dezelfde aanpak via serviceworker v359 en HTML-cache v297.

Technische stappen
  1. Tijden, sessietitels en namen behouden hun grote, goed leesbare tekstmaat.
  2. Profielfoto's in het mobiele dagprogramma zijn vergroot naar 52 pixels.
  3. Tijd en sessiestatus staan logisch naast elkaar, zodat iedere dagkaart minder verticale ruimte gebruikt.
  4. Onnodige witruimte en tussenafstanden zijn verkleind zonder informatie samen te drukken.
  5. Namen van opgieters, de ruimte en de knop Meer info blijven duidelijk zichtbaar.
  6. Alleen bijna startende, live of extra belangrijke sessies krijgen een opvallend kader.
  7. Gewone sessies worden als rustige, duidelijk gescheiden regels weergegeven.
  8. De indeling is getest op mobiele schermbreedtes van 360 en 390 pixels in lichte en donkere weergave.
  9. Op de gecontroleerde schermformaten ontstaat geen horizontale overloop.
  10. white-oak-modern.css v16 en gasten-serviceworker v67 leveren de nieuwste gastenweergave; interne serviceworker v359 en HTML-cache v297 doen dit voor de Opgietplanner.
CodevoorbeeldCSS
@media (max-width: 719px) {
  .public-oak-app .timeline-row {
    grid-template-columns: auto minmax(0, 1fr);
  }

  .public-oak-app .timeline-row time {
    font-size: 2.1rem;
  }

  .public-oak-app .session-avatars-small img {
    width: 52px;
    height: 52px;
  }

  .public-oak-app .timeline-row.is-featured-session,
  .public-oak-app .timeline-row.is-live-special {
    border: 1px solid #d4c28f;
  }
}

Wat doet dit?Op mobiele schermen gebruikt iedere sessie een compacte indeling met het grote uur en de status naast elkaar. De profielfoto blijft ruim zichtbaar, terwijl kleinere tussenafstanden de totale kaarthoogte beperken. Een opvallend kader wordt alleen gebruikt wanneer een sessie bijna start, live is of extra aandacht nodig heeft.

7 wijzigingen

  • Tijden, sessietitels en namen blijven groot en profielfoto's zijn vergroot naar 52 pixels.
  • Tijd en status staan logisch naast elkaar, waardoor de dagkaarten veel compacter zijn.
  • Lege ruimte is verminderd zonder namen, ruimte of Meer info minder duidelijk te maken.
  • Alleen bijna startende, live of extra belangrijke sessies krijgen een kader.
  • Gewone sessies blijven rustige, duidelijk gescheiden regels.
  • Licht en nachtmodus zijn getest op 360 en 390 pixels zonder horizontale overloop.
  • white-oak-modern.css v16 en gasten-serviceworker v67 leveren de wijziging; interne serviceworker v359 en HTML-cache v297 verversen dezelfde opbouw in de Opgietplanner.
v1.1.31 Dagprogramma op mobiel groter en volledig verticaal
Probleem / foutmelding

Op kleinere telefoons stond nog te veel informatie binnen een sessie naast elkaar. Hierdoor waren het uur, het sessietype, namen en ruimtes kleiner dan gewenst en werd een sessie met meerdere begeleiders, prijsinformatie of capaciteit minder snel begrepen.

Oplossing

Het mobiele dagprogramma gebruikt nu volledig verticale sessiekaarten. Het uur staat bovenaan in 32 pixels, de belangrijkste sessie-informatie is ongeveer 19 pixels groot en namen en ruimtes verschijnen in 16 pixels. Tijd, sessietype, begeleiders, ruimte, prijs en capaciteit, detailknop en voortgang krijgen elk een vaste plaats onder elkaar. Ook bij meerdere begeleiders blijven alle namen volledig zichtbaar. De lichte en donkere weergave zijn gecontroleerd op schermbreedtes van 360 en 390 pixels, zonder horizontale overloop.

Technisch

white-oak-modern.css v15 bevat de gedeelde verticale mobiele kaartopbouw. Gasten-serviceworker v66 haalt deze vernieuwde stijl op in de publieke app. De interne Opgietplanner gebruikt dezelfde aanpak via serviceworker v358 en HTML-cache v296.

Technische stappen
  1. Iedere mobiele sessiekaart volgt één duidelijke verticale leesrichting.
  2. Het sessie-uur staat bovenaan en is 32 pixels groot.
  3. De belangrijkste sessie-informatie gebruikt een tekstmaat van ongeveer 19 pixels.
  4. Namen van begeleiders en ruimtes worden in 16 pixels weergegeven.
  5. Sessietype, begeleiders, ruimte, prijs en capaciteit staan elk op een eigen vaste plaats.
  6. De detailknop en voortgang staan onder de praktische sessie-informatie.
  7. Meerdere begeleiders blijven volledig zichtbaar zonder samengedrukte of afgekorte namen.
  8. Lichte en donkere weergave zijn gecontroleerd bij 360 en 390 pixels schermbreedte.
  9. De dagplanning heeft op deze mobiele formaten geen horizontale overloop.
  10. white-oak-modern.css v15 en gasten-serviceworker v66 activeren de nieuwe gastenweergave; interne serviceworker v358 en HTML-cache v296 doen dit voor de Opgietplanner.
CodevoorbeeldCSS
@media (max-width: 719px) {
  .public-oak-app .timeline-row {
    grid-template-columns: minmax(0, 1fr);
  }

  .public-oak-app .timeline-row > time {
    font-size: 32px;
  }

  .public-oak-app .timeline-copy strong {
    font-size: 19px;
  }

  .public-oak-app .timeline-copy > span,
  .public-oak-app .timeline-mobile-room {
    font-size: 16px;
  }
}

Wat doet dit?De mobiele sessiekaart gebruikt voortaan de volledige beschikbare breedte als één kolom. De vaste tekstmaten maken het uur, de sessie en de begeleiders direct herkenbaar, terwijl alle aanvullende informatie rustig onder elkaar blijft staan.

7 wijzigingen

  • Het mobiele dagprogramma bestaat nu uit volledig verticale sessiekaarten.
  • Het uur is 32 pixels en de belangrijkste sessie-informatie ongeveer 19 pixels groot.
  • Namen en ruimtes worden duidelijk in 16 pixels weergegeven.
  • Sessietype, begeleiders, ruimte, prijs, capaciteit, details en voortgang staan elk op een vaste plaats onder elkaar.
  • Meerdere begeleiders blijven volledig zichtbaar.
  • Licht en nachtmodus zijn gecontroleerd op 360 en 390 pixels zonder horizontale overloop.
  • white-oak-modern.css v15 en gasten-serviceworker v66 leveren de wijziging; interne serviceworker v358 en HTML-cache v296 verversen dezelfde opbouw in de Opgietplanner.
v1.1.30 Initialen blijven leesbaar in nachtmodus
Probleem / foutmelding

In de mobiele dagplanning waren initialen in fallback-profielfoto's van begeleiders zonder echte foto, zoals Adelaïde en Jos, lichtgroen op een bijna witte cirkel. Vooral in nachtmodus was daardoor nauwelijks te zien wie een sessie begeleidt.

Oplossing

De initialen staan nu in donker donkergroen op een rustige lichtgroene cirkel met een duidelijke groene rand. Hierdoor blijven namen en initialen ook in nachtmodus goed herkenbaar. De wijziging geldt uitsluitend voor fallback-cirkels; alle echte profielfoto's blijven ongewijzigd.

Technisch

theme-switcher.css v4 geeft de fallback-profielfoto's afzonderlijke kleuren voor nachtmodus. Gasten-serviceworker v65 haalt de nieuwe stijl op in de geïnstalleerde gastenapp. De gedeelde weergave wordt ook vernieuwd via interne serviceworker v356 en HTML-cache v294.

Technische stappen
  1. De correctie is zichtbaar bij begeleiders zonder echte profielfoto in de mobiele dagplanning.
  2. De initialen gebruiken #173c2e voor voldoende contrast.
  3. De fallback-cirkel gebruikt de rustige lichtgroene achtergrond #dce7df.
  4. De rand #83a08f maakt de cirkel duidelijk zichtbaar op donkere sessiekaarten.
  5. Alleen fallback-cirkels worden aangepast; echte foto's krijgen geen kleurfilter of andere achtergrond.
  6. theme-switcher.css v4 bevat de nieuwe nachtmodusregel.
  7. Gasten-serviceworker v65 ververst de publieke app; interne serviceworker v356 en HTML-cache v294 verversen de gedeelde weergave.
CodevoorbeeldCSS
html[data-wo-theme="dark"] body.public-oak-app .timeline-row .session-avatar-fallback {
  color: #173c2e;
  background: #dce7df;
  border-color: #83a08f;
}

Wat doet dit?Deze gerichte CSS-regel wordt alleen toegepast op initialencirkels in de donkere gastenweergave. Daardoor krijgen ze voldoende tekstcontrast en een duidelijke rand, zonder echte profielfoto's te veranderen.

4 wijzigingen

  • Initialen in fallback-profielfoto's zijn duidelijker in nachtmodus.
  • Donker donkergroene tekst staat op een rustige lichtgroene cirkel met een duidelijke rand.
  • Echte profielfoto's blijven ongewijzigd.
  • theme-switcher.css v4 en gasten-serviceworker v65 activeren de correctie; interne serviceworker v356 en HTML-cache v294 verversen de gedeelde weergave.
v1.1.29 Groter en duidelijker mobiel dagprogramma
Probleem / foutmelding

Op een kleinere telefoon stond het dagprogramma te dicht op elkaar. Uren, sessietitels, namen en ruimtes waren te klein, lange namen kregen onvoldoende plaats en meerdere profielfoto's konden elkaar overlappen. Prijs en maximumcapaciteit stonden tussen de overige informatie, waardoor betalende belevingen minder snel te begrijpen waren. De lichte gemarkeerde of live sessiekaart had in nachtmodus bovendien te weinig contrast, waardoor belangrijke tekst bijna wegviel.

Oplossing

Iedere mobiele sessierij heeft nu een duidelijke vaste volgorde met een groter uur en een grotere titel. Volledige namen krijgen ruimte om netjes om te slaan en de profielfoto's zijn 44 pixels groot. Ook bij drie begeleiders blijven alle foto's afzonderlijk zichtbaar zonder overlap. De ruimte staat op een eigen regel, prijs en maximumaantal gasten staan samen in een rustige informatierij en de detailknop heeft een ruimer aanraakvlak. De gemarkeerde en live sessiekaart gebruikt in nachtmodus voortaan een contrastrijke combinatie van achtergrond, tekst en statusaccenten, zodat de actuele sessie meteen opvalt én volledig leesbaar blijft.

Technisch

De gastenapp gebruikt gedeelde responsive CSS voor de mobiele informatievolgorde, vaste profielfotoformaten en aanraakvlakken van minimaal 44 pixels. Afzonderlijke dark-mode statuskleuren voorkomen dat lichte tekst op de gemarkeerde live kaart verdwijnt. white-oak-modern.css v14, theme-switcher.css v3 en guest.css v73 bevatten de nieuwe weergaveregels; gasten-serviceworker v64 haalt deze versies ook op in een geïnstalleerde app. De interne Opgietplanner gebruikt dezelfde aanpak via serviceworker v355 en HTML-cache v293.

Technische stappen
  1. Uur en sessietitel zijn op mobiele schermen groter en hebben een duidelijke visuele hiërarchie.
  2. Volledige namen worden niet afgekapt en mogen netjes over meerdere regels lopen.
  3. Elke profielfoto is 44 bij 44 pixels groot.
  4. Bij drie begeleiders blijven alle drie de foto's zichtbaar zonder over elkaar te schuiven.
  5. De ruimte verschijnt op een eigen regel onder de begeleiders.
  6. Prijs en maximumcapaciteit vormen samen een rustige informatierij.
  7. De sessierij en detailknop bieden ruimere aanraakvlakken voor mobiel gebruik.
  8. De live of gemarkeerde kaart heeft afzonderlijke tekst-, achtergrond- en statuskleuren voor nachtmodus.
  9. Dezelfde responsive basis wordt gedeeld met de interne Opgietplanner, zodat beide apps vertrouwd aanvoelen.
  10. white-oak-modern.css v14, theme-switcher.css v3 en guest.css v73 bevatten de aangepaste mobiele regels.
  11. Gasten-serviceworker v64 ververst de publieke app; interne serviceworker v355 en HTML-cache v293 verversen de Opgietplanner.
CodevoorbeeldCSS
@media (max-width: 719px) {
  .public-oak-app .timeline-row {
    grid-template-columns: minmax(0, 1fr) 44px;
  }
  .public-oak-app .timeline-details .session-avatars-small > * {
    width: 44px;
    height: 44px;
  }
}

html[data-wo-theme="dark"] body.public-oak-app .timeline-row.is-featured-session {
  color: #f2f4f1;
  background: #202b25;
}

Wat doet dit?Op mobiele schermen gebruikt de sessierij vrijwel de volledige breedte voor uur, titel, begeleiders en ruimte; alleen de detailknop behoudt een vaste kolom. Alle profielfoto's blijven 44 pixels groot. De gemarkeerde sessie krijgt in nachtmodus een eigen donkere achtergrond met lichte tekst, zodat ook live informatie duidelijk zichtbaar blijft.

7 wijzigingen

  • Het mobiele dagprogramma gebruikt grotere uren en sessietitels.
  • Volledige namen en de ruimte blijven duidelijk zichtbaar.
  • Profielfoto's zijn 44 pixels en drie foto's overlappen elkaar niet meer.
  • Prijs en maximumcapaciteit staan netjes bij elkaar.
  • Sessies en detailknoppen hebben ruimere aanraakvlakken.
  • De gemarkeerde en live kaart is in nachtmodus opnieuw volledig leesbaar.
  • white-oak-modern.css v14, theme-switcher.css v3, guest.css v73 en gasten-serviceworker v64 activeren de vernieuwde mobiele weergave.
v1.1.28 Rustige nachtmodus met keuze per toestel
Probleem / foutmelding

De gastenapp kon alleen in een lichte weergave worden gebruikt. In een donkere ontvangstruimte of 's avonds kon dat fel aanvoelen. Zonder een volledige thema-aanpak konden losse donkere onderdelen bovendien zorgen voor te weinig contrast in de planning, kalender, formulieren of navigatie.

Oplossing

Onder Praktisch staat nu een duidelijke keuze voor Licht, Nacht en Systeem. Nacht gebruikt rustige donkergroene kleuren en bewaakt het contrast op de dagplanning, kalender, teampagina, formulieren, modals en onderste navigatie. De voorkeur blijft op dit toestel bewaard en geldt ook voor de interne Opgietplanner. Met Systeem volgt de gastenapp automatisch de scherminstelling van het toestel.

Technisch

De gedeelde voorkeur wordt opgeslagen in localStorage. De optie Systeem gebruikt prefers-color-scheme en schakelt mee wanneer de lichte of donkere toestelinstelling verandert. Het actieve thema wordt al vóór de eerste zichtbare pagina toegepast, waardoor bij het openen in nachtmodus geen witte flits verschijnt. De gedeelde kleurlaag en bediening staan in theme-switcher.css en theme-switcher.js; de gastenapp gebruikt daarnaast guest.css v72, guest.js v101 en serviceworker v63.

Technische stappen
  1. Praktisch bevat een vaste keuze voor Licht, Nacht en Systeem.
  2. De gekozen weergave blijft via localStorage op het huidige toestel bewaard.
  3. De voorkeur wordt gedeeld met de interne Opgietplanner op hetzelfde toestel.
  4. Systeem gebruikt prefers-color-scheme om de toestelinstelling automatisch te volgen.
  5. Een vroege themacontrole voorkomt een witte flits bij het openen in nachtmodus.
  6. Dagplanning, kalender, team, formulieren, modals en navigatie gebruiken leesbare contrastkleuren.
  7. Rustige donkergroene tinten behouden de warme uitstraling van The White Oak.
  8. theme-switcher.css v1 bevat de volledige lichte en donkere kleurlaag.
  9. theme-switcher.js v1 bewaart, synchroniseert en actualiseert de keuze.
  10. guest.css v72 en guest.js v101 laden de bediening en de Nederlandse, Franse en Engelse teksten.
  11. Serviceworker v63 levert de nieuwe bestanden ook aan geïnstalleerde gastenapps.
CodevoorbeeldJavaScript
const voorkeur = localStorage.getItem('white_oak_color_mode') || 'light';
const media = matchMedia('(prefers-color-scheme: dark)');
const thema = voorkeur === 'system' ? (media.matches ? 'dark' : 'light') : voorkeur;

Wat doet dit?De gastenapp gebruikt de lokaal bewaarde keuze. Alleen bij Systeem wordt de actuele toestelinstelling gelezen, zodat de app automatisch kan wisselen zonder de handmatige voorkeur Licht of Nacht te overschrijven.

7 wijzigingen

  • Kies onder Praktisch tussen Licht, Nacht en Systeem.
  • De nachtmodus gebruikt rustige donkergroene kleuren met duidelijk contrast.
  • Dagplanning, kalender, team, formulieren, modals en navigatie schakelen volledig mee.
  • De voorkeur blijft op dit toestel bewaard en geldt ook voor de Opgietplanner.
  • Systeem volgt automatisch de lichte of donkere toestelinstelling.
  • De app opent in nachtmodus zonder storende witte flits.
  • De gedeelde themabestanden, guest.css v72, guest.js v101 en serviceworker v63 activeren de nieuwe weergave.
v1.1.27 Belevingsfoto bij Anouschka’s sessies
Probleem / foutmelding

De Moments of Calm-afbeelding werd eerst als persoonlijke profielfoto van Anouschka getoond. Het beeld gaat juist over de sfeer van haar sessies van vandaag en moet losstaan van haar profiel.

Oplossing

De gastenapp toont de afbeelding nu als extra Belevingsfoto bij het programma van maandag 10 augustus. Het grotere fotovlak vermeldt duidelijk dat het om de beleving van Anouschka gaat. Haar profiel gebruikt deze afbeelding niet meer.

Technisch

De dagmedia heeft het afzonderlijke type experience en is gekoppeld aan Anouschka en de gekozen datum. Daardoor verschijnt de foto alleen op de bedoelde dag en wordt zij niet als speciaal event verwerkt. De gastenapp gebruikt guest.css v71, guest.js v100 en serviceworker v62.

Technische stappen
  1. De belevingsfoto verschijnt uitsluitend op de gekoppelde dag.
  2. Naam en context van Anouschka staan duidelijk bij het beeld.
  3. De foto wordt groter weergegeven dan een gewone flyerpreview.
  4. Een belevingsfoto veroorzaakt geen speciaal eventicoon in de kalender.
  5. Het tv-scherm blijft uitsluitend echte thema’s en events aankondigen.
  6. guest.css v71, guest.js v100 en serviceworker v62 activeren de aangepaste weergave.
CodevoorbeeldJavaScript
var isExperience = (flyer.kind || 'event') === 'experience';
card.classList.toggle('is-experience', isExperience);

Wat doet dit?De gastenapp herkent een belevingsfoto afzonderlijk en geeft die een grotere foto-opmaak en aangepaste teksten, terwijl eventflyers hun bestaande presentatie behouden.

5 wijzigingen

  • De Moments of Calm-afbeelding staat als belevingsfoto bij Anouschka’s sessies van vandaag.
  • De afbeelding vervangt haar profielfoto niet meer.
  • Het sfeerbeeld krijgt een grotere en rustigere presentatie.
  • De kalender en het tv-scherm markeren dit niet als speciaal event.
  • guest.css v71, guest.js v100 en serviceworker v62 verversen de gastenapp.
v1.1.26 Nieuwe afbeelding voor Anouschka
Probleem / foutmelding

Anouschka verscheen in de gastenapp nog met alleen een letter, waardoor haar sessies en teamprofiel minder herkenbaar waren.

Oplossing

De aangeleverde Moments of Calm-afbeelding is ingesteld als foto voor Anouschka. Dezelfde afbeelding verschijnt bij haar sessies, in de actuele sessieweergave en op de teampagina zodra zij in de planning staat.

Technisch

De gastenapp leest dezelfde centrale profielfoto als de interne opgietplanner. De foto-URL krijgt automatisch de wijzigingstijd mee, zodat toestellen niet de oude letterweergave uit hun cache blijven tonen.

Technische stappen
  1. Anouschka gebruikt voortaan data/photos/anouschka.jpg.
  2. De foto wordt hergebruikt in sessies, actuele momenten en Team.
  3. De centrale gastenplanning-cache is na publicatie vernieuwd.
CodevoorbeeldPHP
$photo = guestPhotoUrl($photosByName[mb_strtolower($hostName)] ?? null);

Wat doet dit?De gastenapp zoekt de foto op dezelfde genormaliseerde naam als de planner en gebruikt daardoor automatisch het nieuwe centrale bestand.

3 wijzigingen

  • Anouschka heeft nu de aangeleverde afbeelding in de gastenapp.
  • De foto verschijnt bij haar sessies en op de teampagina.
  • De ververste foto-URL voorkomt dat een oude letteravatar zichtbaar blijft.
v1.1.25 Rustig contactpunt onder Ontwikkeld door
Probleem / foutmelding

De zwevende contactballon met profielfoto bleef voortdurend boven de gastenapp staan. Daardoor bedekte ze delen van het dagprogramma en de onderste navigatie en vroeg ze ook aandacht wanneer een gast helemaal geen contact wilde opnemen. Vooral op een kleiner mobiel scherm voelde de permanente laag storend en kon ze belangrijke informatie over een sessie overlappen.

Oplossing

De zwevende contact- en profielfotoballon is volledig verwijderd. In Praktisch staat contact voortaan uitsluitend als een rustige, vaste knop onder Koen en Coonweb bij Ontwikkeld door. Het formulier verschijnt pas nadat een gast bewust op die knop tikt. De bestaande mogelijkheden blijven behouden: een vraag, suggestie of probleem melden, een e-mailkopie ontvangen, bij een probleem een afbeelding toevoegen en desgewenst WhatsApp gebruiken. Zo blijft het dagprogramma vrij en is contact toch gemakkelijk terug te vinden.

Technisch

De globale, vaste feedbacktrigger wordt niet langer op elke pagina opgebouwd. De nieuwe knop staat in de bestaande ontwikkelaarsfooter van Praktisch en opent dezelfde contactdialoog op aanvraag. Daardoor blijft alle formulierverwerking behouden zonder permanente overlay boven inhoud of navigatie. De gastenapp gebruikt guest.css v70, guest.js v99 en serviceworker v61.

Technische stappen
  1. De zwevende contactballon en permanente profielfoto-overlay zijn volledig uit de gastenapp verwijderd.
  2. Er staat geen contactlaag meer boven het dagprogramma, sessiedetails of de onderste navigatie.
  3. De vaste contactknop staat onder Koen en Coonweb bij Ontwikkeld door in Praktisch.
  4. Het contactformulier opent alleen na een bewuste tik op de vaste knop.
  5. Vraag, suggestie en probleem blijven als afzonderlijke onderwerpen beschikbaar.
  6. De gast kan nog steeds automatisch een e-mailkopie van de melding ontvangen.
  7. Bij een probleem kan optioneel één afbeelding of schermafbeelding worden toegevoegd.
  8. WhatsApp blijft beschikbaar als aanvullende, snelle contactmogelijkheid.
  9. De bestaande meertalige formulierteksten, invoercontrole en spambeperking blijven behouden.
  10. De gastenapp gebruikt guest.css v70, guest.js v99 en serviceworker v61.
CodevoorbeeldJavaScript
const contactButton = document.getElementById('guestContactOpen');

contactButton?.addEventListener('click', () => {
    guestContactDialog.showModal();
});

// De knop staat uitsluitend onder Ontwikkeld door in Praktisch.

Wat doet dit?De vaste knop onder Ontwikkeld door opent pas na een bewuste klik hetzelfde contactformulier. De eerdere zwevende trigger wordt niet meer weergegeven, waardoor de planning en navigatie volledig vrij blijven. Alleen de plaats en het openingsmoment veranderen; categorieën, e-mailkopie, probleemafbeelding en WhatsApp blijven beschikbaar.

7 wijzigingen

  • De storende zwevende contact- en profielfotoballon is volledig verwijderd.
  • Het dagprogramma en de onderste navigatie blijven voortaan volledig vrij.
  • Contact staat nu rustig onder Koen en Coonweb bij Ontwikkeld door in Praktisch.
  • Het formulier opent alleen wanneer een gast bewust op de vaste knop tikt.
  • Vraag, suggestie, probleem, e-mailkopie en optionele probleemafbeelding blijven behouden.
  • WhatsApp blijft beschikbaar als snelle aanvullende contactmogelijkheid.
  • guest.css v70, guest.js v99 en serviceworker v61 activeren de rustigere contactweergave.
v1.1.24 Feedbackformulier naast WhatsApp
Probleem / foutmelding

Een vraag, suggestie of probleem melden kon in de gastenapp alleen via WhatsApp. Dat is snel voor gasten die WhatsApp gebruiken, maar niet iedereen wil of kan via die dienst contact opnemen. Er was ook geen vaste manier om contactgegevens, een duidelijke omschrijving en bij een technisch probleem een schermafbeelding samen door te geven. Daardoor kon belangrijke informatie ontbreken en was gericht antwoorden moeilijker.

Oplossing

De bestaande feedbackknop opent voortaan een volledig formulier in dezelfde verzorgde stijl als de opgietplanner. Gasten kiezen eerst of het om een vraag, suggestie of probleem gaat en vullen vervolgens hun naam, e-mailadres en bericht in. Bij een probleem kan optioneel één afbeelding worden toegevoegd om te tonen wat er op het scherm gebeurt. Na verzending ontvangt de gast automatisch een kopie via e-mail en kan Koen rechtstreeks antwoorden op het opgegeven adres. Alle teksten en meldingen volgen automatisch de gekozen taal van de gastenapp. WhatsApp blijft daarnaast beschikbaar als snelle contactmogelijkheid.

Technisch

Het formulier valideert de verplichte velden en het e-mailadres voordat het bericht wordt verzonden. Een onzichtbaar honeypotveld helpt geautomatiseerde spam tegen te houden zonder gasten een extra controle te laten uitvoeren. De gekozen categorie, taal en antwoordgegevens worden samen met het bericht verwerkt; een afbeelding wordt alleen meegestuurd wanneer de gast die zelf toevoegt. De gastenapp gebruikt guest.js v98, white-oak-modern.css v13 en serviceworker v60.

Technische stappen
  1. De feedbackknop biedt nu zowel een ingebouwd formulier als de bestaande WhatsApp-route.
  2. Gasten kunnen kiezen tussen vraag, suggestie en probleem, zodat het bericht meteen de juiste context heeft.
  3. Naam, e-mailadres en bericht worden duidelijk en toegankelijk in afzonderlijke velden gevraagd.
  4. Bij problemen kan optioneel één afbeelding of schermafbeelding worden toegevoegd.
  5. Na verzending ontvangt de gast automatisch een e-mailkopie van de melding.
  6. Het opgegeven e-mailadres maakt een rechtstreeks antwoord op de feedback mogelijk.
  7. Veldnamen, uitleg, foutmeldingen en bevestigingen volgen de actieve taal van de gastenapp.
  8. Verplichte velden en het e-mailadres worden gecontroleerd voordat verzending mogelijk is.
  9. Een verborgen honeypotveld houdt veel automatische spam tegen zonder zichtbare captcha.
  10. De afbeelding blijft optioneel en wordt alleen verwerkt wanneer de gast ze bewust toevoegt.
  11. WhatsApp blijft beschikbaar voor wie liever meteen een kort bericht stuurt.
  12. De gastenapp gebruikt guest.js v98, white-oak-modern.css v13 en serviceworker v60.
CodevoorbeeldJavaScript
const formulier = new FormData(feedbackForm);
formulier.set('source', 'guest');
formulier.set('language', currentLanguage);
formulier.set('type', gekozenOnderwerp);
formulier.set('user', naam);

await fetch('/opgietplanner/feedback.php', {
    method: 'POST',
    body: formulier
});

Wat doet dit?Het formulier bundelt de gekozen categorie, contactgegevens, tekst en actieve taal in één beveiligde aanvraag naar de bestaande feedbackafhandeling. Het onzichtbare websiteveld is een honeypot: wanneer een automatische robot dit invult, wordt het bericht genegeerd. Een afbeelding wordt alleen bij een probleem en alleen na een bewuste keuze toegevoegd. Na geslaagde verzending stuurt de server automatisch een kopie naar de gast.

9 wijzigingen

  • Naast WhatsApp is nu een volledig feedbackformulier beschikbaar.
  • Gasten kunnen een vraag, suggestie of probleem gericht doorgeven.
  • Naam, e-mailadres en bericht worden overzichtelijk in de app ingevuld.
  • Bij een probleem kan optioneel een afbeelding of schermafbeelding worden toegevoegd.
  • De gast ontvangt automatisch een e-mailkopie en Koen kan rechtstreeks antwoorden.
  • Het volledige formulier volgt automatisch de gekozen taal.
  • Een onzichtbare honeypot beperkt spam zonder gasten lastig te vallen.
  • WhatsApp blijft behouden als snelle contactmogelijkheid.
  • guest.js v98, white-oak-modern.css v13 en serviceworker v60 activeren de vernieuwing.
v1.1.23 Toegankelijke App-status en krachtige tv-eventmodus
Probleem / foutmelding

Gasten konden bij een zwakke of ontbrekende verbinding nog niet op één plaats zien hoe actueel de app en offline gegevens waren. Een gerichte herstelactie ontbrak. De bediening mocht daarnaast beter leesbaar zijn met grotere tekst, duidelijkere toetsenbordfocus en schermlezerondersteuning. Ontbrekende foto’s konden de presentatie verstoren en speciale events vielen op het tv-scherm nog niet genoeg op zonder het dagprogramma te verkleinen.

Oplossing

De gastenapp heeft voortaan een duidelijke App-status met verbinding, actualiteit, geselecteerde datum, planningstijd en cacheversie. Als offline gegevens vastlopen, kan de app deze veilig herstellen en daarna opnieuw de actuele versie ophalen. Gasten kunnen grotere tekst inschakelen; de keuze blijft op hun toestel bewaard. Toetsenbordfocus, schermlezerteksten en contrast zijn verbeterd. Ontbrekende profiel- en ruimtefoto’s krijgen een neutrale The White Oak-vervanging, zodat nooit de foto van een andere persoon verschijnt. Op eventdagen krijgt het tv-scherm een professionele eventmodus met het officiële ROTS-logo en beschikbare afbeelding of video. Alle sessies blijven tegelijk groot en leesbaar zichtbaar. Intern zien opgieters nu ook per sessie de bron en controleert de planner automatisch alle zeven dagen na laden of synchroniseren.

Technisch

De App-status leest de online toestand, planningstijd en cacheversie uit de actieve app. De herstelactie verwijdert alleen toepasselijke caches, controleert de serviceworker en laadt daarna opnieuw. De gastenapp gebruikt CSS v69, JavaScript v97 en serviceworker v59. Het tv-scherm gebruikt CSS v20 en JavaScript v26. De interne app gebruikt serviceworker v330 en HTML-cache v268.

Technische stappen
  1. App-status toont verbinding, actualiteit, geselecteerde datum, planningstijd en cacheversie.
  2. Offline gegevens herstellen verwijdert alleen toepasselijke appcaches en controleert daarna opnieuw op updates.
  3. De grotere-tekstmodus blijft lokaal op het toestel bewaard.
  4. Skiplink, toetsenbordfocus en schermlezerteksten maken navigeren zonder aanraakscherm duidelijker.
  5. Contrast en minimale aanraakvlakken zijn verbeterd voor leesbaarheid en bediening.
  6. Ontbrekende profielfoto’s krijgen een neutrale The White Oak-fallback en nooit de foto van een andere opgieter.
  7. Ontbrekende ruimtebeelden vallen terug op een neutraal beeld van The White Oak.
  8. De tv-eventmodus wordt alleen actief wanneer de gekozen dag een event, thema, flyer of video bevat.
  9. ROTS toont automatisch het officiële Rituals of the Soul-logo.
  10. Beschikbare eventafbeeldingen of gedempte video ondersteunen de eventweergave.
  11. Het volledige tv-programma blijft groot en zichtbaar, ook tijdens een event.
  12. De interne app toont bronlabels per sessie en controleert na laden of synchroniseren alle zeven dagen.
  13. De gastenapp gebruikt CSS v69, JavaScript v97 en serviceworker v59; het tv-scherm gebruikt CSS v20 en JavaScript v26; de interne app gebruikt serviceworker v330 en HTML-cache v268.
CodevoorbeeldJavaScript
const appStatus = {
    online: navigator.onLine,
    bijgewerktOp: planning.generatedAt,
    cache: 'v59'
};

if (eventDag.isROTS) {
    toonEventMedia(eventDag.media, 'rots-logo.jpg');
}
toonVolledigProgramma(eventDag.sessions);

Wat doet dit?De status combineert de actuele verbinding met de tijd en cacheversie van de planning. Op een ROTS-eventdag wordt het officiële logo met beschikbare media getoond, waarna het volledige programma gewoon zichtbaar blijft.

8 wijzigingen

  • Nieuwe App-status toont hoe actueel de gastenapp en haar offline gegevens zijn.
  • Offline gegevens kunnen veilig worden hersteld zonder andere websitegegevens te wissen.
  • Een bewaarde grotere-tekstmodus verbetert de leesbaarheid.
  • Toetsenbordfocus, schermlezerondersteuning, contrast en aanraakvlakken zijn toegankelijker.
  • Ontbrekende foto’s krijgen een neutrale The White Oak-vervanging en nooit de foto van iemand anders.
  • Het tv-scherm toont op eventdagen het officiële ROTS-logo en beschikbare eventmedia.
  • Alle sessies blijven op het tv-scherm groot en volledig zichtbaar.
  • De interne opgietplanner kreeg tegelijk bronlabels per sessie en een automatische zevendaagse kwaliteitscontrole.
v1.1.22 Rustiger dagprogramma met slimme focus en directe offline start
Probleem / foutmelding

Alle komende sessies vroegen in het dagprogramma ongeveer evenveel aandacht, ook wanneer de eerstvolgende sessie pas uren later begon. Daardoor was minder snel zichtbaar wat nu belangrijk was. Bij een zwakke of ontbrekende internetverbinding mocht de bewaarde planning bovendien sneller openen en duidelijker aangeven hoe actueel de getoonde informatie is.

Oplossing

De gastenapp stemt de aandacht nu af op het moment. Meer dan 60 minuten vooraf blijft de volgende sessie compact, vanaf 30 minuten verschijnt de voorbereiding, vanaf 10 minuten telt de app duidelijk af en tijdens de sessie staat een warme live-status centraal. Na afloop volgt advies om voldoende af te koelen, te drinken, te eten en te rusten. Alle sessies blijven zichtbaar en aanklikbaar, maar alleen de volgende of gelijktijdige volgende sessies worden uitgebreid getoond; afgelopen sessies van vandaag zijn standaard verborgen. Zonder internet opent de laatst bewaarde planning direct uit de cache. Online wordt op de achtergrond vernieuwd en een tijdstatus laat zien of het programma actueel, offline of mogelijk verouderd is. De interne opgietplanner kreeg daarnaast een persoonlijke focus en dagcontrole voor ontbrekende gegevens, echte dubbels en wijzigingen; gelijktijdige sessies in verschillende ruimtes gelden daar niet als conflict.

Technisch

De programmalijst berekent per sessie een tijdsfase en houdt alleen de eerstvolgende groep uitgebreid. De serviceworker kiest bij een offline toestel direct de opgeslagen pagina en vernieuwt bij een online verbinding op de achtergrond. De gastenapp gebruikt CSS v68, JavaScript v96 en serviceworker v58; de interne app gebruikt serviceworker-cache v329 en HTML-cache v267.

Technische stappen
  1. Meer dan 60 minuten vooraf blijft de volgende sessie compact.
  2. Vanaf 30 minuten verschijnt voorbereiding en vanaf 10 minuten een duidelijke countdown.
  3. Tijdens een sessie krijgt de live-status warme, opvallende aandacht.
  4. Na afloop verschijnt hersteladvies over afkoelen, drinken, eten en rust.
  5. Alle sessies blijven zichtbaar en aanklikbaar.
  6. Alleen de volgende of gelijktijdige volgende sessies worden uitgebreid getoond.
  7. Afgelopen sessies van vandaag zijn standaard verborgen.
  8. Offline opent de laatst bewaarde planning direct uit de cache.
  9. Online vernieuwt de app de planning op de achtergrond.
  10. De actualiteitsstatus toont met tijd of de planning actueel, offline of mogelijk verouderd is.
  11. De interne app kreeg ook een onthouden persoonlijke modus en een dagcontrole voor ontbrekende opgieter, foto, ruimte, prijs of capaciteit, echte dubbels en wijzigingen sinds de vorige controle.
  12. Gelijktijdige sessies in verschillende ruimtes blijven correct naast elkaar staan en zijn geen conflict.
  13. De gastenapp gebruikt CSS v68, JavaScript v96 en serviceworker v58; de interne app gebruikt serviceworker-cache v329 en HTML-cache v267.
CodevoorbeeldJavaScript
if (!navigator.onLine) {
    toonDirectUitCache();
} else {
    toonBewaardePlanning();
    vernieuwOpAchtergrond();
}

toonStatus({ bijgewerktOp, offline, mogelijkVerouderd });

Wat doet dit?Zonder verbinding hoeft de app niet eerst op een mislukte netwerkoproep te wachten. Met internet blijft de bewaarde planning meteen zichtbaar terwijl een achtergrondvernieuwing de nieuwste gegevens ophaalt; de tijdstatus maakt duidelijk welke informatie wordt getoond.

8 wijzigingen

  • De volgende sessie blijft compact wanneer ze nog meer dan een uur verwijderd is.
  • Voorbereiding vanaf 30 minuten en een duidelijke countdown vanaf 10 minuten.
  • Live sessies vallen warm en duidelijk op; na afloop verschijnt praktisch hersteladvies.
  • Alle sessies blijven aanklikbaar, maar alleen de relevante volgende sessies worden uitgebreid.
  • Afgelopen sessies van vandaag zijn standaard verborgen.
  • Offline opent de bewaarde planning direct en online vernieuwt de app op de achtergrond.
  • Een status met tijd toont of het programma actueel, offline of mogelijk verouderd is.
  • De interne opgietplanner kreeg tegelijk een persoonlijke focus en een gerichte dagcontrole.
v1.1.21 Beide apps herstellen Vandaag automatisch na een offline dagwissel
Probleem / foutmelding

Als de gastenapp tijdens de nacht zonder internet open bleef, kon de planning van gisteren na middernacht nog als Vandaag worden getoond. Vernieuwen wachtte zonder verbinding bovendien te lang op nieuwe gegevens, terwijl er al een bruikbare planning in de cache beschikbaar kon zijn.

Oplossing

De gastenapp controleert bij openen, terugkeren en opnieuw zichtbaar worden automatisch de echte dag in Brussel en selecteert die meteen als Vandaag. Zonder internet gebruikt Vernieuwen onmiddellijk de beschikbare gecachete planning voor de juiste dag, zodat gasten niet naar een wachtende pagina of de planning van gisteren blijven kijken. Zodra internet terug beschikbaar is, kunnen de nieuwste gegevens weer worden opgehaald. De interne opgietplanner kreeg dezelfde verbetering.

Technisch

De app berekent Vandaag met de Brusselse clientdatum. Als online laden mislukt, hergebruikt een snelle cachefallback de beschikbare gecachete dag in plaats van te blijven wachten op het netwerk.

Technische stappen
  1. Vandaag wordt opnieuw bepaald bij openen en wanneer de app na een nacht opnieuw zichtbaar wordt.
  2. De kalenderdag volgt Europe/Brussels, ook rond middernacht en tijdens zomertijd.
  3. Een oude selectie van gisteren wordt automatisch vervangen door de echte dag van vandaag.
  4. Vernieuwen zonder internet toont meteen de beschikbare gecachete planning voor de juiste dag.
  5. De snelle cachefallback voorkomt een langdurig wachtende planning.
  6. Dezelfde correctie is ook toegepast op de interne opgietplanner.
CodevoorbeeldJavaScript
const vandaag = datumInBrussel(new Date());
selecteerDag(vandaag);

try {
    await vernieuwPlanning();
} catch {
    toonGecacheteDag(vandaag);
}

Wat doet dit?De gastenapp kiest eerst de echte datum in Brussel. Kan de planning niet online worden vernieuwd, dan verschijnt direct de beschikbare gecachete planning van die dag.

4 wijzigingen

  • Vandaag toont automatisch de echte Brusselse kalenderdag.
  • Na een offline nacht blijft de gastenapp niet meer op gisteren staan.
  • Vernieuwen zonder internet gebruikt snel de beschikbare gecachete planning.
  • Ook de interne opgietplanner gebruikt dezelfde dagcorrectie en offline fallback.
v1.1.20 Stoombadduur en smoothie gecorrigeerd
Probleem / foutmelding

De vorige algemene regel van 45 minuten voor scrubsessies was te breed. Daardoor kregen gewone scrub- en verzorgingssessies in het Stoombad een te lange timing en zagen gasten niet de juiste nazorg. De afwijkende duur hoort alleen bij een Stoombad-scrub tijdens een Rituals of the Soul-eventdag.

Oplossing

Een gewone scrub- of verzorgingssessie in het Stoombad duurt 20-30 minuten. De gastenapp gebruikt 30 minuten als technische eindgrens voor live- en afgerond-status, kalender en timing; na afloop staat een smoothie klaar. Alleen een Stoombad-scrub op een Rituals of the Soul (ROTS)-eventdag blijft 45 minuten en neemt de gewone smoothie-regel niet automatisch over. Het aparte ROTS-rookritueel blijft 45 minuten duren, vindt plaats rond ± 65 °C en sluit af met thee. De correctie is zichtbaar in de planning, details en timing, op het tv-scherm en in de interne app. Alle gastteksten zijn afgestemd in het Nederlands, Frans en Engels.

Technisch

De afwijkende informatie wordt uitsluitend geactiveerd door een expliciete combinatie van event en sessietype. De gastenplanning gebruikt schedule-cache versie 17, guest.js versie 94, screen.js versie 25 en publieke offline-cache versie 56. De interne offline-cache gebruikt versie 327. De bedrijfsregel is lokaal vastgelegd in AGENTS.md voor toekomstige wijzigingen; dit bestand wordt niet live gedeployed.

Technische stappen
  1. Een gewone scrub- of verzorgingssessie in het Stoombad toont 20-30 minuten.
  2. Voor live- en afgerond-status, kalender en technische timing geldt 30 minuten als eindgrens.
  3. Na een gewone Stoombadsessie staat een smoothie klaar.
  4. Alleen een Stoombad-scrub tijdens een ROTS-eventdag blijft 45 minuten en krijgt niet automatisch de gewone smoothievermelding.
  5. Het aparte ROTS-rookritueel blijft 45 minuten, rond ± 65 °C en met thee als nazorg.
  6. Planning, details, kalender en timing, tv-scherm en interne app gebruiken dezelfde scheiding.
  7. De gastteksten zijn beschikbaar in het Nederlands, Frans en Engels.
  8. De regel combineert expliciet het event met het sessietype.
  9. De gastenapp gebruikt schedule-cache versie 17, guest.js versie 94, screen.js versie 25 en publieke offline-cache versie 56; de interne offline-cache gebruikt versie 327.
  10. De bedrijfsregel staat lokaal in AGENTS.md voor toekomstige wijzigingen; AGENTS.md wordt niet live gedeployed.
CodevoorbeeldPHP
if ($isRotsEvent && $isSteamBathScrub) {
    $durationMinutes = 45;
} elseif ($isRegularSteamBathCare) {
    $durationMinutes = 30;
    $durationLabel = '20-30 min';
    $aftercare = 'smoothie';
}

Wat doet dit?Door het event en het sessietype samen te controleren, krijgen gewone Stoombadsessies en de verschillende ROTS-sessies elk hun correcte duur en nazorg.

6 wijzigingen

  • Een gewone scrub of verzorging in het Stoombad duurt 20-30 minuten.
  • Live- en afgerond-status gebruiken 30 minuten als technische eindgrens.
  • Na een gewone Stoombadsessie staat een smoothie klaar.
  • Alleen een Stoombad-scrub op een ROTS-eventdag blijft 45 minuten, zonder automatische smoothievermelding.
  • Het aparte ROTS-rookritueel blijft 45 minuten, rond ± 65 °C en met thee als nazorg.
  • Planning, details en tv-scherm tonen de correctie in het Nederlands, Frans en Engels.
v1.1.19 ROTS-rookritueel volledig uitgewerkt
Probleem / foutmelding

Gasten kregen bij een rookritueel tijdens een Rituals of the Soul-event nog niet overal de volledige verwachting te zien. De alternatieve spreadsheetspelling Marrakesch kon daarnaast zorgen voor een ontbrekende correcte ruimtenaam of foto.

Oplossing

Uitsluitend een rookritueel op een Rituals of the Soul (ROTS)-event toont voortaan een verwachte duur van 45 minuten, een temperatuur van ongeveer 65 °C en thee als rustige nazorg. Andere rituelen en gewone ROTS-sessies blijven ongewijzigd. Op zondag 9 augustus 2026 om 16:30 zien gasten dit bij het rookritueel van Sammy in Marrakesh Sauna, zowel in de sessieregel en details als in de live- en tv-timing. De ROTS-uitleg is ook correct beschikbaar in het Frans en Engels. Tijdens de visuele controle is Marrakesch als spreadsheetalias toegevoegd, zodat steeds de juiste naam en foto van Marrakesh Sauna verschijnen in de gastenapp en de interne app.

Technisch

De nieuwe verwachting wordt uitsluitend geactiveerd door de combinatie ROTS-event en rookritueel. De gastenplanning gebruikt schedule-cache versie 16, guest.js versie 93, screen.js versie 25 en publieke offline-cache versie 55. De interne offline-cache gebruikt versie 326.

Technische stappen
  1. Alleen een rookritueel binnen een ROTS-event krijgt de nieuwe verwachtingen.
  2. De verwachte duur is 45 minuten en de temperatuur is ongeveer 65 °C.
  3. Thee wordt als rustige nazorg vermeld.
  4. Andere rituelen en gewone ROTS-sessies blijven ongewijzigd.
  5. De wijziging is op zondag 9 augustus 2026 om 16:30 zichtbaar bij Sammy in Marrakesh Sauna.
  6. Sessieregel, details en live- en tv-timing tonen dezelfde correcte informatie.
  7. De volledige uitleg is beschikbaar in het Nederlands, Frans en Engels.
  8. De alias Marrakesch zorgt dat de correcte naam en foto van Marrakesh Sauna in beide apps verschijnen.
  9. De gastenapp gebruikt schedule-cache versie 16, guest.js versie 93, screen.js versie 25 en publieke offline-cache versie 55; de interne offline-cache gebruikt versie 326.
CodevoorbeeldPHP
if ($isRotsEvent && $isSmokeRitual) {
    $durationMinutes = 45;
    $temperature = '± 65 °C';
    $aftercare = 'thee';
}

Wat doet dit?De app combineert de herkenning van het ROTS-event met die van het rookritueel. Alleen wanneer beide gelden, worden de aangepaste duur, temperatuur en nazorg getoond.

6 wijzigingen

  • Een rookritueel tijdens ROTS duurt naar verwachting 45 minuten.
  • Gasten zien ongeveer 65 °C en thee als rustige nazorg.
  • Andere rituelen en gewone ROTS-sessies veranderen niet.
  • Sammy’s sessie op zondag om 16:30 toont dit in de sessieregel, details en live- en tv-timing.
  • De uitleg is correct in het Nederlands, Frans en Engels.
  • Marrakesch verschijnt correct als Marrakesh Sauna met de juiste foto.
v1.1.18 Stoombad en correcte duurtijd
Probleem / foutmelding

De gastenapp gebruikte nog de benaming Hamam, terwijl Stoombad de technisch correcte en professionelere naam voor deze ruimte is. Scrubsessies werden bovendien te kort ingeschat, waardoor een sessie in de app te vroeg als afgerond kon verschijnen.

Oplossing

In het dagprogramma, de maandweergave, de sessiedetails, de ruimtegids en op het tv-scherm zien gasten voortaan Stoombad. De verwachte duur van een scrubsessie is aangepast naar 45 minuten. Daardoor blijven de aanduidingen bijna begonnen, live en afgerond gedurende de juiste periode zichtbaar. De bijbehorende uitleg is ook in het Frans en Engels professioneel aangepast.

Technisch

Alleen de zichtbare naam en tijdsberekening zijn aangepast. De spreadsheet- en scanner-identifiers, bestaande CSS-klassen en het afbeeldingsbestand hamam.jpg blijven intern behouden, zodat de gegevenskoppeling en ruimtefoto blijven werken. De gastenplanning gebruikt schedule-cache versie 15, guest.js versie 92 en publieke offline-cache versie 54. De interne offline-cache gebruikt versie 325.

Technische stappen
  1. De zichtbare ruimtenaam is in de gastenapp en op het tv-scherm gewijzigd naar Stoombad.
  2. Dagprogramma, maandweergave, details en ruimtegids gebruiken dezelfde benaming.
  3. De verwachte duur van een scrubsessie is 45 minuten.
  4. Aftellen, live-status en afgerond-status volgen de volledige duur van 45 minuten.
  5. De Nederlandse, Franse en Engelse teksten zijn op Stoombad afgestemd.
  6. De technische bronidentifier en scannerkoppeling blijven ongewijzigd.
  7. CSS-klassen en hamam.jpg blijven behouden, zodat bestaande vormgeving en de juiste ruimtefoto blijven werken.
  8. De gastenplanning gebruikt schedule-cache versie 15, guest.js versie 92 en publieke offline-cache versie 54; de interne offline-cache gebruikt versie 325.
CodevoorbeeldPHP
$displayRoom = $sourceRoom === 'HAMAM' ? 'Stoombad' : $sourceRoom;
$durationMinutes = $isScrubSession ? 45 : $durationMinutes;

Wat doet dit?De technische naam uit de planning wordt pas bij het tonen vertaald naar Stoombad. De scrubherkenning stelt daarnaast de verwachte duur op 45 minuten in, zodat alle tijdsgebonden statussen op hetzelfde correcte eindmoment steunen.

6 wijzigingen

  • Hamam heet in de gastenapp voortaan Stoombad.
  • Dagprogramma, maandweergave, details en ruimtegids zijn bijgewerkt.
  • Het tv-scherm toont eveneens de professionele benaming Stoombad.
  • Scrubsessies hebben een verwachte duur van 45 minuten.
  • Live- en afgerond-status blijven nu gedurende de juiste periode zichtbaar.
  • De uitleg is aangepast in het Nederlands, Frans en Engels.
v1.1.17 Vuurshow als openluchtafsluiter
Probleem / foutmelding

De vuurshow van zaterdag 8 augustus om 22:00 werd ten onrechte aan de Hamam gekoppeld, terwijl ze buiten in de open ruimte doorgaat. Daardoor zagen gasten een verkeerde locatie en uitleg in de details. Ook verscheen onterecht informatie over een deelnamekaartje aan de receptie.

Oplossing

De vuurshow staat nu om 22:00 als ‘Vuurshow · afsluiter in openlucht’ in de Buitenruimte, met Marin en een passende buitenfoto. Na aanklikken zien gasten dat deze sfeervolle afsluiter ongeveer 15 minuten duurt. De app vraagt om tijdig naar de aangeduide buitenruimte te gaan, voldoende afstand te bewaren en de aanwijzingen van het team te volgen. De verkeerde verwijzingen naar Hamam en een receptiekaartje zijn verwijderd. De volledige uitleg is beschikbaar in het Nederlands, Frans en Engels en dezelfde correctie verschijnt in de interne opgietplanner.

Technisch

Een centrale datum- en tijdcorrectie in schedule-overrides.json vervangt uitsluitend deze vuurshow, zodat de Google Spreadsheet niet hoeft te worden aangepast. Buitenruimte krijgt via guestRoomLabel en guestRoomImage de juiste naam en buitenfoto. De vuurshow heeft eigen gegevens voor titel, duur, sfeer en veiligheid en gebruikt geen boekings- of kaartjesinformatie. De gastenplanning gebruikt cacheversie 14, guest.js versie 91 en publieke offline-cache versie 53. Guest.css blijft op versie 67; de interne app gebruikt white-oak-modern.css versie 12 en offline-cache versie 324.

Technische stappen
  1. De vuurshow van zaterdag 8 augustus om 22:00 staat correct in de Buitenruimte.
  2. De titel luidt ‘Vuurshow · afsluiter in openlucht’ en Marin wordt vermeld.
  3. Een passende buitenfoto toont waar de afsluiter plaatsvindt.
  4. De verwachte duur is 15 minuten.
  5. De details beschrijven de sfeer en geven duidelijke veiligheidsinformatie.
  6. Hamam en het deelnamekaartje aan de receptie worden niet meer getoond.
  7. De tijdelijke correctie staat in schedule-overrides.json en wijzigt de Google Spreadsheet niet.
  8. Titel, verwachting en veiligheidstips zijn beschikbaar in het Nederlands, Frans en Engels.
  9. De gastenplanning gebruikt cacheversie 14, guest.js versie 91 en publieke offline-cache versie 53.
  10. Guest.css blijft op versie 67; white-oak-modern.css blijft op versie 12 en de interne offline-cache gebruikt versie 324.
CodevoorbeeldJSON
{
  "date": "2026-08-08",
  "time": "22u00",
  "room": "Buitenruimte",
  "description": "Vuurshow · afsluiter in openlucht"
}

Wat doet dit?Deze bestaande correctie is gekoppeld aan één datum en één uur. Daardoor tonen beide apps voor deze vuurshow Buitenruimte en de juiste titel, terwijl de gewone planning in de Google Spreadsheet ongewijzigd blijft.

6 wijzigingen

  • De vuurshow van 22:00 staat correct als openluchtafsluiter vermeld.
  • Buitenruimte vervangt de foutieve locatie Hamam.
  • Marin, een buitenfoto en de verwachte duur van 15 minuten zijn zichtbaar.
  • De details geven sfeer- en veiligheidsinformatie zonder receptiekaartje.
  • Alle informatie is beschikbaar in het Nederlands, Frans en Engels.
  • Dezelfde correctie staat in de interne opgietplanner.
v1.1.16 Juiste ruimtefoto bij iedere sessie
Probleem / foutmelding

De foto bij een sessie werd soms gekozen op basis van het soort beleving en niet op basis van de werkelijke ruimte. Daardoor kon een verkeerde of ontbrekende foto verschijnen, vooral bij Marrakesh. De kleine pijlen maakten bovendien niet overal voldoende duidelijk dat gasten een sessie konden aanklikken voor meer details.

Oplossing

Elk detailscherm toont nu bovenaan een foto van de werkelijke ruimte met het label ‘Hier gaat de beleving door’ en de ruimtenaam. Hamam, Shou Sugi Ban, Panorama, The Barn, Marrakesh en Forest krijgen voortaan hun correcte ruimtefoto; Marrakesh en Forest gebruiken officiële foto’s van The White Oak. Duidelijkere pijlen in het dagprogramma en de tijdlijn laten sneller zien dat een sessieregel aanklikbaar is. Zo herkennen gasten meteen waar ze naartoe moeten en vinden ze eenvoudiger de aanvullende informatie.

Technisch

De ruimte bepaalt voortaan centraal welke foto wordt getoond, onafhankelijk van het sessietype. Het label bij de ruimtefoto is beschikbaar in het Nederlands, Frans en Engels. De gastenapp gebruikt guestschedule-cache versie 13, guest.css versie 67, guest.js versie 90 en publieke offline-cache versie 52. De interne app gebruikt white-oak-modern.css versie 12 en offline-cache versie 323.

Technische stappen
  1. De werkelijke ruimtefoto staat bovenaan ieder sessiedetail.
  2. De foto vermeldt ‘Hier gaat de beleving door’ en toont de ruimtenaam.
  3. Hamam, Shou Sugi Ban, Panorama, The Barn, Marrakesh en Forest worden afzonderlijk herkend.
  4. Voor Marrakesh en Forest worden officiële foto’s van The White Oak gebruikt.
  5. Duidelijkere pijlen in het dagprogramma en de tijdlijn tonen dat sessieregels aanklikbaar zijn.
  6. Het ruimtelabel is beschikbaar in het Nederlands, Frans en Engels.
  7. De gastenapp gebruikt guestschedule-cache versie 13, guest.css versie 67 en guest.js versie 90.
  8. De publieke gasten-cache gebruikt versie 52; de interne app gebruikt white-oak-modern.css versie 12 en offline-cache versie 323.
CodevoorbeeldPHP
function guestRoomImage(string $room): string {
    $roomUpper = mb_strtoupper(trim($room));
    if (str_contains($roomUpper, 'MARRAKESH')) {
        return '/opgietplanner/assets/photos/marrakesh.jpg';
    }
    // De overige bekende ruimtes krijgen op dezelfde manier hun eigen foto.
}

Wat doet dit?De app maakt de ruimtenaam eerst uniform en controleert daarna welke bekende locatie erin staat. Daardoor kiest Marrakesh altijd de officiële Marrakesh-foto en gebeurt dezelfde vaste koppeling voor Forest, Hamam, Shou Sugi Ban, Panorama en The Barn.

5 wijzigingen

  • Iedere sessie toont in de details de foto en naam van de juiste ruimte.
  • Marrakesh en Forest hebben nu officiële foto’s van The White Oak.
  • Het ruimtelabel is beschikbaar in het Nederlands, Frans en Engels.
  • Duidelijkere pijlen maken aanklikbare sessies beter herkenbaar.
  • Gasten zien sneller waar hun beleving doorgaat.
v1.1.15 Correctie: deelnamekaartje zonder betaalinstructie
Probleem / foutmelding

De vorige uitleg beweerde onterecht dat de vermelde prijs aan de receptie betaald wordt wanneer het deelnamekaartje wordt klaargemaakt. Daardoor kon de praktische uitleg over deelnemen verkeerd worden begrepen.

Oplossing

De gastenapp toont voortaan de juiste uitleg. De prijs blijft zichtbaar en de beleving blijft als betalend aangeduid, maar de app doet geen uitspraak meer over waar of hoe er wordt afgerekend. De receptie legt enkel het deelnamekaartje klaar, zodat de gast meteen aan de beleving kan deelnemen. Deze correctie is doorgevoerd in het Nederlands, Frans en Engels en wordt ook in de interne opgietplanner vermeld.

Technisch

De eerdere betaalstap is vervangen door een neutrale stap over het klaargelegde deelnamekaartje. De gastenapp gebruikt guest.js versie 89 en publieke offline-cache versie 51; guest.css blijft ongewijzigd op versie 66. De interne offline-cache gebruikt versie 322.

Technische stappen
  1. De onjuiste melding over betalen aan de receptie is verwijderd.
  2. De sessieprijs blijft zichtbaar en de beleving blijft als betalend aangeduid.
  3. De gastenapp vermeldt geen betaalwijze of betaalplaats meer.
  4. De receptie legt het deelnamekaartje klaar zodat de gast meteen kan deelnemen.
  5. De aangepaste uitleg is beschikbaar in het Nederlands, Frans en Engels.
  6. Dezelfde correctie wordt ook in de interne opgietplanner vermeld.
  7. De gastenapp gebruikt guest.js versie 89 en publieke offline-cache versie 51.
  8. Guest.css blijft op versie 66 en de interne offline-cache gebruikt versie 322.
CodevoorbeeldJavaScript
if (session.price) keys.push('bookingStepTicketReady');

Wat doet dit?Bij een betalende beleving kiest de app nu de tekst over het klaargelegde deelnamekaartje. De code voegt geen instructie meer toe over betalen aan de receptie.

5 wijzigingen

  • De verkeerde betaalinstructie aan de receptie is verwijderd.
  • De prijs en aanduiding als betalende beleving blijven zichtbaar.
  • De receptie legt het deelnamekaartje klaar zodat de gast meteen kan deelnemen.
  • De uitleg is gecorrigeerd in het Nederlands, Frans en Engels.
  • De correctie geldt ook voor de interne opgietplanner.
v1.1.14 Betalende beleving stap voor stap uitgelegd
Probleem / foutmelding

Bij het aanklikken van een betalende beleving was nog niet volledig duidelijk dat een online wellnessreservatie geen plaats voor die specifieke sessie reserveert. Daardoor kon een gast denken dat de sessie al vastlag, terwijl het deelnamekaartje en de betaling nog aan de receptie moesten worden geregeld.

Oplossing

De detailweergave van een betalende beleving legt nu stap voor stap uit hoe deelnemen werkt. De gast reserveert online alleen het wellnessbezoek, vraagt op de eventdag aan de receptie een deelnamekaartje voor het vermelde uur, betaalt daar de getoonde prijs en ontvangt pas daarna een bevestigde plaats zolang er beschikbaarheid is. Tot slot vraagt de app om tijdig naar de juiste ruimte te gaan. Deze uitleg is beschikbaar in het Nederlands, Frans en Engels.

Technisch

De extra betaal- en reservatiestappen worden dynamisch uitsluitend getoond wanneer de sessie een echte prijs bevat. Gratis sessies behouden hun korte praktische uitleg en krijgen geen onnodige betaalmelding. De gastenapp gebruikt guest.css versie 66, guest.js versie 88 en publieke offline-cache versie 50.

Technische stappen
  1. De online wellnessreservatie wordt expliciet losgekoppeld van een plaats in de gekozen beleving.
  2. Op de eventdag vraagt de gast aan de receptie een deelnamekaartje met het juiste sessie-uur.
  3. De vermelde prijs wordt aan de receptie betaald.
  4. Een plaats is pas bevestigd na ontvangst van het deelnamekaartje en zolang er beschikbaarheid is.
  5. De laatste stap vraagt de gast om tijdig naar de vermelde ruimte te gaan.
  6. De volledige stap-voor-stapuitleg is beschikbaar in het Nederlands, Frans en Engels.
  7. De betaalstappen verschijnen alleen wanneer de sessiegegevens werkelijk een prijs bevatten.
  8. De gastenapp gebruikt guest.css versie 66 en guest.js versie 88.
  9. De publieke offline-cache gebruikt versie 50; de interne offline-cache gebruikt versie 321.
CodevoorbeeldJavaScript
const isPaidExperience = Boolean(session.price);
paidSteps.hidden = !isPaidExperience;

Wat doet dit?De detailweergave controleert of bij de gekozen sessie werkelijk een prijs is opgeslagen. Alleen dan verschijnen de betaalstappen over het receptiekaartje, betalen, plaatsbevestiging en tijdig naar de ruimte gaan.

7 wijzigingen

  • Betalende belevingen leggen na aanklikken de deelname stap voor stap uit.
  • Een online wellnessreservatie reserveert geen plaats in de gekozen sessie.
  • Op de eventdag vraagt de gast aan de receptie een kaartje voor het vermelde uur.
  • De getoonde prijs wordt aan de receptie betaald.
  • De plaats is pas bevestigd na ontvangst van het kaartje en zolang er beschikbaarheid is.
  • De gast krijgt de raad om tijdig naar de juiste ruimte te gaan.
  • De uitleg is beschikbaar in het Nederlands, Frans en Engels.
v1.1.13 Prijs en uitgebreide belevingsinfo in het dagprogramma
Probleem / foutmelding

Prijs, maximumaantal en praktische voorwaarden van een beleving waren niet meteen zichtbaar in het dagprogramma. Gasten moesten daardoor zoeken naar belangrijke informatie en konden bij een betaald ritueel nog denken dat dit online te boeken was. Bovendien mocht de standaardprijs van een scrub niet per ongeluk aan elk item in de Hamam worden toegekend.

Oplossing

Bij een beleving staan prijs en maximumaantal nu rechtstreeks in het dagprogramma, zowel in de gastenapp als in de interne opgietplanner. Na aanklikken opent een uitgebreide detailweergave met wat de gast mag verwachten, praktische tips, prijs, maximumaantal en de inschrijfwijze. Voor scrubs, ceremonies en andere bijzondere belevingen staat duidelijk dat deze niet online boekbaar zijn en dat een deelnamekaartje aan de receptie verkrijgbaar is.

Technisch

De twee apps gebruiken dezelfde herkenbare belevingsinformatie, maar tonen alleen gegevens die werkelijk bij de sessie horen. De standaard scrubprijs wordt uitsluitend aangevuld wanneer de sessie als echte scrub is herkend; de ruimte ‘Hamam’ alleen is daarvoor niet voldoende. Zo krijgt een gewone Hamam-sessie nooit automatisch een scrubprijs.

Technische stappen
  1. Prijs en maximumaantal verschijnen als compacte gegevens in het dagprogramma.
  2. Aanklikken opent uitgebreide informatie met verwachting en praktische tips.
  3. Bij belevingen met inschrijving wordt het deelnamekaartje aan de receptie vermeld.
  4. De detailweergave zegt expliciet dat deze belevingen niet online boekbaar zijn.
  5. Dezelfde verduidelijking is beschikbaar in de gastenapp en de interne opgietplanner.
  6. Een standaard scrubprijs wordt alleen gebruikt bij een echte scrubsessie, niet bij elk Hamam-item.
  7. De gastenapp gebruikt guest.css versie 65 en guest.js versie 87.
  8. De publieke offline-cache gebruikt versie 49; de interne offline-cache gebruikt versie 320.
CodevoorbeeldPHP
if ($isScrub && !$price) {
    $price = '€10';
}

Wat doet dit?De voorwaarde controleert eerst of het werkelijk om een scrubsessie gaat. Alleen dan mag een ontbrekende standaardprijs worden aangevuld; de locatie Hamam activeert dit niet op zichzelf.

6 wijzigingen

  • Prijs en maximumaantal staan nu zichtbaar in het dagprogramma.
  • Een tik op de beleving opent uitgebreide details.
  • Verwachting en praktische tips worden per beleving uitgelegd.
  • Deelnamekaartje aan de receptie en ‘niet online boekbaar’ staan duidelijk vermeld.
  • De standaard scrubprijs geldt alleen voor echte scrubsessies.
  • De verbetering geldt voor de gastenapp en de interne opgietplanner.
v1.1.12 Online reservatie en receptiekaartje duidelijk gescheiden
Probleem / foutmelding

De reservatiepagina vermeldde al dat sessies niet afzonderlijk online boekbaar zijn, maar het verschil tussen een gewone wellnessreservatie en inschrijven voor een bijzondere beleving kon nog concreter. Vooral bij scrubsessies, ceremonies en speciale opgietbelevingen moest onmiddellijk duidelijk zijn waar een gast zijn plaats verkrijgt.

Oplossing

De pagina verdeelt de mogelijkheden nu zichtbaar in ‘Online’ en ‘Aan de receptie’. Online reserveert een gast het wellnessbezoek, een arrangement of een behandeling. Voor een scrubsessie, ceremonie of speciale opgietbeleving kan niet online worden geboekt: de gast vraagt op de dag zelf uitsluitend aan de receptie een deelnamekaartje. Een extra regel legt uit dat het kaartje de plaats bevestigt zolang er nog beschikbaarheid is.

Technisch

De reservatie-informatie gebruikt drie vaste stappen met afzonderlijke labels en kleuren. De primaire knop blijft gekoppeld aan de officiële wellnessreservatie, terwijl de belevingsregel bewust geen online knop bevat. Hierdoor kan een beleving niet per ongeluk als online product worden geïnterpreteerd.

Technische stappen
  1. ‘Online’ staat uitsluitend bij wellness-toegang, arrangementen en behandelingen.
  2. ‘Aan de receptie’ staat bij scrubsessies, ceremonies en speciale opgietbelevingen.
  3. Een ticketicoon maakt het deelnamekaartje visueel herkenbaar.
  4. De tekst zegt letterlijk dat deze belevingen niet online kunnen worden geboekt.
  5. Prijs, maximumaantal en verplichte inschrijving blijven bij de sessiedetails staan.
  6. Dezelfde verduidelijking is vertaald naar Nederlands, Frans en Engels.
  7. guest.css gebruikt versie 64 en guest.js versie 86.
  8. De publieke offline-cache gebruikt versie 48.
CodevoorbeeldHTML
<small>Aan de receptie</small>
<strong>Kaartje voor een bijzondere beleving</strong>

Wat doet dit?Het vaste receptielabel staat direct boven de titel van de beleving. Daardoor ziet een gast vóór het lezen van de details dat het deelnamekaartje niet via de online reservatie wordt verkregen.

5 wijzigingen

  • Online reservatie en receptiekaartje staan nu als twee verschillende routes weergegeven.
  • Scrubsessies, ceremonies en speciale opgietbelevingen zijn expliciet niet online boekbaar.
  • Het deelnamekaartje wordt uitsluitend aan de receptie uitgereikt.
  • Het kaartje bevestigt de plaats zolang er beschikbaarheid is.
  • Een ticketicoon maakt het onderscheid sneller herkenbaar.
v1.1.11 Duidelijke reservatie zonder verkeerde verwachting
Probleem / foutmelding

De officiële reservatiepagina van The White Oak biedt geen afzonderlijke online boeking voor de opgietingen en rituelen uit het dagprogramma. Zonder uitleg kon een gast verwachten daar een gekozen sessie te boeken en vervolgens niet begrijpen waarom die optie ontbrak.

Oplossing

De gastenapp heeft nu een afzonderlijke tab ‘Reserveren’. Voor de officiële knop staat duidelijk wat online boekbaar is: een wellnessbezoek, arrangement of behandeling. De app vermeldt ook dat opgietingen en rituelen niet afzonderlijk via de online reservatie worden geboekt. Staat bij een sessie ‘Inschrijven verplicht’, dan meldt de gast zich op de dag zelf bij de receptie; prijs, beschikbaarheid en maximumaantal blijven bij de sessiedetails zichtbaar.

Technisch

De reservatieknop verwijst rechtstreeks naar de officiële XPlan-omgeving die ook door thewhiteoak.be wordt gebruikt. De uitleg blijft in de gastenapp staan, zodat de externe reservatiepagina niet hoeft te worden aangepast en gasten vooraf weten welke actie daar mogelijk is. De nieuwe pagina is volledig vertaald naar Nederlands, Frans en Engels.

Technische stappen
  1. Een vijfde navigatietab ‘Reserveren’ opent een rustige, afzonderlijke informatiepagina.
  2. De primaire knop gebruikt exact dezelfde officiële XPlan-reservatielink als thewhiteoak.be.
  3. De pagina onderscheidt wellness-toegang, arrangementen en behandelingen van het dagelijkse sessieprogramma.
  4. Bij ‘Inschrijven verplicht’ wordt de receptie als juiste aanmeldplaats genoemd.
  5. De knop naar de algemene officiële website blijft als tweede, minder opvallende actie beschikbaar.
  6. Alle teksten zijn vertaald naar Nederlands, Frans en Engels.
  7. guest.css gebruikt versie 63, white-oak-modern.css versie 11 en guest.js versie 85.
  8. De publieke offline-cache gebruikt versie 47, zodat de nieuwe tab ook in de geïnstalleerde app beschikbaar wordt.
CodevoorbeeldHTML
<a href="https://whiteoak.xplanonline.com/reserveren/">Reserveer je wellnessdag</a>

Wat doet dit?De knop opent dezelfde officiële reservatieomgeving als de website van The White Oak. De begeleidende uitleg in de app voorkomt dat deze link wordt geïnterpreteerd als een afzonderlijke boeking van een opgieting of ritueel.

5 wijzigingen

  • Nieuwe tab ‘Reserveren’ in de gastenapp.
  • Duidelijk verschil tussen een wellnessreservatie en het sessieprogramma.
  • Opgietingen en rituelen worden niet langer voorgesteld als apart online boekbaar.
  • Sessies met verplichte inschrijving verwijzen naar de receptie.
  • Rechtstreekse link naar de officiële reservatieomgeving van The White Oak.
v1.1.10 Foto blijft volledig stil bij scrollen
Probleem / foutmelding

Een live browsercontrole na de vorige verbetering vond nog een oude hoverregel. Als een stilstaande muisaanwijzer tijdens het scrollen boven een sessiekaart kwam, werd de ruimtefoto nog 3,5 procent groter. Sessierijen schoven op desktop bij hover ook 4 pixels opzij. Op touchscreens gebeurde dit meestal niet, maar de dagplanning was daardoor nog niet overal volledig statisch.

Oplossing

Beide resterende hoverbewegingen zijn verwijderd. Ruimtefoto’s, sessiekaarten en sessierijen blijven nu ook met een muisaanwijzer volledig stil tijdens het scrollen. Na de correctie geeft de browser voor de berekende transform exact ‘none’ terug. Alleen de belangrijke kleine knipperindicator bij ‘Begint zo’ en ‘Live’ blijft bewegen.

Technisch

De CSS laat hover de ruimtefoto en sessierij niet langer schalen of verschuiven. Er wordt expliciet transform: none toegepast, zodat scrollen en een stilstaande muisaanwijzer geen beeldbeweging meer veroorzaken. De statusindicator verandert alleen van doorzichtigheid en verplaatst geen inhoud.

Technische stappen
  1. De ruimtefoto schaalt niet langer 3,5 procent bij hover.
  2. Sessierijen verschuiven op desktop niet langer 4 pixels naar de zijkant.
  3. De berekende transform blijft na scrollen exact ‘none’.
  4. De correctie maakt muisbediening even statisch als de bestaande touchscreenweergave.
  5. De kleine knipperindicator bij ‘Begint zo’ en ‘Live’ blijft behouden.
  6. De gedeelde opmaak gebruikt white-oak-modern.css versie 10.
  7. guest.js versie 84 is alleen aangepast voor serviceworkerregistratie versie 46; de publieke offline-cache is versie 46.
CodevoorbeeldCSS
.public-oak-app .moment-session:hover .moment-room-media img { transform: none; }

Wat doet dit?Deze regel schakelt de laatste hoververgroting van de ruimtefoto uit. De foto blijft daardoor ook met een muisaanwijzer boven de sessiekaart volledig stil.

5 wijzigingen

  • Ruimtefoto’s blijven tijdens scrollen volledig stil.
  • Hover vergroot de foto niet meer.
  • Sessierijen schuiven op desktop niet langer opzij.
  • De browser meet na scrollen exact transform ‘none’.
  • Alleen de kleine statusindicator bij ‘Begint zo’ en ‘Live’ blijft knipperen.
v1.1.9 Rustiger en vlotter scrollen
Probleem / foutmelding

Het oude gedeelde bewegingsscript volgde tijdens het scrollen 87 onderdelen via IntersectionObserver. Het verplaatste ruimtefoto’s met parallax en startte invlieg- en tilteffecten. Extra beeld-, stoom- en kaartanimaties konden daardoor op mobiele toestellen haperingen geven.

Oplossing

Het bewegingsscript en alle verwijzingen zijn verwijderd. Sessies, kaarten en ruimtefoto’s blijven voortaan statisch wanneer gasten door de dagplanning scrollen. Decoratieve stoom, shimmer en bewegingen van beelden en kaarten zijn eveneens verwijderd. Alleen kleine indicatoren bij ‘Begint zo’, ‘Binnenkort’, ‘Bezig’ en ‘Live’ knipperen nog rustig om belangrijke status zichtbaar te houden.

Technisch

De gastenapp gebruikt geen scrolllistener, IntersectionObserver of parallaxberekening meer. De browser hoeft daardoor tijdens het scrollen geen 87 onderdelen te volgen of telkens beeldposities aan te passen. Alleen de doorzichtigheid van een klein statuspunt verandert via CSS; de kaart en foto zelf bewegen niet.

Technische stappen
  1. Het oude bewegingsscript en alle verwijzingen ernaar zijn volledig verwijderd.
  2. Er is geen scrolllistener, IntersectionObserver of parallax meer actief.
  3. Ruimtefoto’s en sessiekaarten blijven op hun vaste plaats tijdens het scrollen.
  4. Decoratieve stoom-, shimmer-, invlieg-, tilt-, beeld- en kaartanimaties zijn verwijderd.
  5. ‘Begint zo’, ‘Binnenkort’, ‘Bezig’ en ‘Live’ behouden een kleine knipperende statusindicator.
  6. De statusindicator verplaatst geen tekst, kaart of foto.
  7. De gedeelde opmaak gebruikt white-oak-modern.css versie 9.
  8. guest.js versie 83 is alleen aangepast voor serviceworker versie 45; de publieke offline-cache is versie 45.
CodevoorbeeldCSS
@keyframes oakStatusBlink { 0%, 54% { opacity: 1; } 55%, 100% { opacity: .22; } }

Wat doet dit?Deze animatie wisselt alleen de zichtbaarheid van het kleine statuspunt. De dagplanning, sessiekaart en ruimtefoto blijven stil en kunnen daardoor vlotter scrollen.

5 wijzigingen

  • De dagplanning scrollt rustiger zonder parallax.
  • Foto’s en kaarten blijven statisch op hun plaats.
  • Decoratieve bewegingen die mobiel konden haperen zijn verwijderd.
  • Belangrijke start- en live-statussen blijven duidelijk herkenbaar.
  • Alleen kleine statusindicatoren knipperen nog rustig.
v1.1.8 Sauna direct zichtbaar in de mobiele dagplanning
Probleem / foutmelding

Op mobiele schermen van maximaal 390 pixels verborg een oude CSS-regel het bestaande ruimteveld in de Programma-lijst. Daardoor zagen gasten wel het uur, de sessie en de opgieter, maar niet of de sessie in The Barn, Panorama Sauna, Hamam of Shou Sugi Ban plaatsvond.

Oplossing

Iedere mobiele sessierij toont de locatie nu compact onder de opgieter, met een groene locatiemarkering. Ook lange ruimtenamen blijven volledig leesbaar. De locatie en statussen zoals ‘Begint zo’ en ‘Bezig’ hebben ieder voldoende plaats en overlappen elkaar niet meer.

Technisch

Binnen het CSS-breakpoint voor schermen tot 390 pixels staat nu een mobiel locatie-element in de sessiekopie. De desktopweergave blijft ongewijzigd. guest.js versie 82 wijzigt alleen de registratie van de serviceworker, zodat de vernieuwde bestanden via offline-cache versie 44 worden geladen.

Technische stappen
  1. De locatie verschijnt op schermen tot 390 pixels direct onder de naam van de opgieter.
  2. The Barn, Panorama Sauna, Hamam en Shou Sugi Ban blijven ook op smalle toestellen zichtbaar.
  3. Een groene stip en groene tekst onderscheiden de locatie van de overige sessie-informatie.
  4. Lange ruimtenamen kunnen over meerdere regels lopen zonder de status te raken.
  5. ‘Begint zo’ en ‘Bezig’ behouden hun eigen compacte plaats aan de rechterkant.
  6. De app gebruikt guest.css versie 62.
  7. guest.js versie 82 bevat alleen de aangepaste serviceworkerregistratie.
  8. De publieke offline-cache is vernieuwd naar versie 44.
CodevoorbeeldCSS
.timeline-mobile-room { display: flex; align-items: center; gap: 6px; margin-top: 7px; color: var(--green); font-size: .68rem; font-weight: 750; line-height: 1.25; }

Wat doet dit?Deze letterlijke CSS-regel staat binnen het mobiele breakpoint en plaatst de sauna als een compacte, goed uitgelijnde regel onder de opgieter.

5 wijzigingen

  • Iedere mobiele sessierij toont nu duidelijk de juiste sauna.
  • De locatie staat direct onder de naam van de opgieter.
  • Een groene locatiemarkering maakt de ruimte snel herkenbaar.
  • Lange ruimtenamen blijven volledig leesbaar.
  • Locatie en sessiestatus overlappen niet meer.
v1.1.7 Persoonlijk contact ook in de gastenapp
Probleem / foutmelding

De uitleg naast Koens profielfoto verdween na enkele seconden en onder Praktisch stond daarnaast nog een tweede contactkaart. Dat maakte dezelfde contactmogelijkheid dubbel en minder duidelijk.

Oplossing

Naast Koens profielfoto blijft nu permanent ‘Vraag of suggestie? Stuur me gerust een bericht.’ zichtbaar. Een klik opent hetzelfde persoonlijke chatvenster als in de opgietplanner, maar met onderwerpen en antwoorden voor gasten. Het venster werkt in Nederlands, Frans en Engels. De dubbele contactkaart onder Praktisch is verwijderd zodat de pagina rustiger en overzichtelijker blijft.

Technisch

De timer en tijdelijke sessionStorage-opslag voor het automatisch verbergen van de contacthint zijn verwijderd. De WhatsApp-keuzes bouwen per taal en gekozen onderwerp een vooraf ingevuld bericht op. De vernieuwde offline cache zorgt dat de nieuwe contactingang na de update meteen beschikbaar is.

Technische stappen
  1. De contacttekst blijft permanent naast Koens profielfoto staan en verdwijnt niet meer.
  2. De eerdere timer van 6,5 seconden en de tijdelijke sessionStorage-status zijn verwijderd.
  3. Het persoonlijke contactvenster volgt dezelfde rustige opbouw als dat van de planner.
  4. Onderwerpen en antwoorden zijn aangepast aan vragen van wellnessgasten.
  5. Nederlands, Frans en Engels hebben elk passende teksten en WhatsApp-berichten.
  6. WhatsApp vult het bericht automatisch in volgens de gekozen taal en het gekozen onderwerp.
  7. De dubbele contactkaart onder Praktisch is verwijderd.
  8. De app gebruikt gedeeld ontwerpbestand versie 8, JavaScript-versie 81 en publieke offline-cache 43.
CodevoorbeeldTwig + JavaScript + CSS
var topic = whatsapp.dataset.contactTopic || 'question';
whatsapp.href = 'https://wa.me/32473692486?text=' + encodeURIComponent(whatsappMessages[currentLanguage][topic]);

Wat doet dit?De taal en het gekozen onderwerp bepalen samen welk bericht klaarstaat wanneer een gast WhatsApp opent. De vaste contacttekst heeft geen timer of tijdelijke opslag meer nodig.

5 wijzigingen

  • De contacttekst naast Koens profielfoto blijft permanent zichtbaar.
  • De gastenapp kreeg hetzelfde persoonlijke chatvenster als de planner.
  • Contactonderwerpen zijn aangepast aan gasten en wellnessvragen.
  • WhatsApp werkt met passende berichten in Nederlands, Frans en Engels.
  • De dubbele contactkaart onder Praktisch is verwijderd.
v1.1.6 Een rustige persoonlijke contactingang
Probleem / foutmelding

De WhatsApp-contactstrook onder Praktisch werkte goed, maar gasten moesten eerst verder door de pagina bladeren om te ontdekken dat zij Koen rechtstreeks een vraag of suggestie konden sturen.

Oplossing

Naast Koens profielfoto verschijnt nu kort de melding ‘Vraag of suggestie? Stuur me gerust een bericht.’ Na 6,5 seconden klapt de tekst in en blijft alleen de compacte profielfoto staan. De melding verschijnt opnieuw bij hover of toetsenbordfocus. Een klik opent een rustig contactvenster met WhatsApp als duidelijke hoofdactie.

Technisch

sessionStorage onthoudt alleen tijdens de huidige browsersessie dat de introductie al werd getoond; er worden geen persoonlijke gegevens bewaard. Het contactvenster, de knoppen en het vooraf ingevulde WhatsApp-bericht volgen automatisch de gekozen taal: Nederlands, Frans of Engels. De aangepaste offline cache levert de nieuwe contactbediening ook na een app-update correct uit.

Technische stappen
  1. De korte contactmelding blijft 6,5 seconden zichtbaar en klapt daarna automatisch in.
  2. Hover en toetsenbordfocus maken de uitleg opnieuw zichtbaar.
  3. Een klik op de profielfoto opent een rustig contactvenster zonder de dagplanning permanent drukker te maken.
  4. WhatsApp is de duidelijke hoofdactie en opent met een passend vooraf ingevuld bericht.
  5. sessionStorage werkt alleen binnen de huidige browsersessie en bewaart geen contactgegevens.
  6. Alle teksten en WhatsApp-berichten zijn beschikbaar in Nederlands, Frans en Engels.
  7. De app gebruikt gedeeld ontwerpbestand versie 7, JavaScript-versie 80 en publieke offline-cache 42.
CodevoorbeeldTwig + JavaScript + CSS
if (sessionStorage.getItem('wo_guest_contact_hint_seen') !== '1') {
  guestContactOpen.classList.add('show-hint');
  setTimeout(function () {
    guestContactOpen.classList.remove('show-hint');
  }, 6500);
}

Wat doet dit?De melding vraagt kort aandacht bij het openen van de app en wordt daarna vanzelf compact. Met muis of toetsenbord kan een gast de uitleg altijd opnieuw oproepen.

5 wijzigingen

  • Koens profielfoto toont kort ‘Vraag of suggestie? Stuur me gerust een bericht.’
  • Na 6,5 seconden blijft alleen de compacte profielfoto zichtbaar.
  • Hover en toetsenbordfocus tonen de uitleg opnieuw.
  • De profielfoto opent een rustig contactvenster met WhatsApp.
  • De volledige contactbeleving werkt in Nederlands, Frans en Engels.
v1.1.5 Een rechtstreekse WhatsApp-lijn naar Koen
Probleem / foutmelding

Gasten konden in de app zien wie ze ontwikkelde, maar er was nog geen duidelijke manier om rechtstreeks een vraag of opmerking over het programma of de app te sturen.

Oplossing

Onder Praktisch staat nu een persoonlijke contactstrook met de profielfoto van Koen Van den Bossche, zijn rol en een duidelijke WhatsApp-knop. De tekst herinnert gasten eraan dat smartphonegebruik alleen thuis, in de ontvangstruimte of bij de receptie is toegestaan.

Technisch

De WhatsApp-link vult automatisch een korte vraag over het wellnessprogramma in. Bij Frans of Engels verandert zowel de zichtbare tekst als het vooraf ingevulde bericht mee.

Technische stappen
  1. Dezelfde actuele profielfoto als in de opgietplanner wordt gebruikt.
  2. De contactstrook staat direct onder de smartphonevrije wellnessmelding.
  3. De knop opent WhatsApp zonder dat het telefoonnummer eerst opgeslagen moet worden.
  4. Nederlands, Frans en Engels hebben elk hun eigen berichttekst.
  5. De kaart schaalt zonder overloop op kleine telefoons en desktop.
  6. De app gebruikt gedeeld ontwerpbestand versie 6, JavaScript-versie 79 en publieke offline-cache 41.
CodevoorbeeldTwig + JavaScript + CSS
var message = whatsappMessages[currentLanguage];
whatsapp.href = 'https://wa.me/...' + encodeURIComponent(message);

Wat doet dit?De gekozen app-taal bepaalt automatisch welk bericht klaarstaat wanneer WhatsApp opent.

5 wijzigingen

  • Onder Praktisch staat nu rechtstreeks contact met Koen.
  • Koens echte profielfoto maakt duidelijk wie het bericht ontvangt.
  • De WhatsApp-knop opent met een vooraf ingevuld bericht.
  • De contactmogelijkheid werkt in Nederlands, Frans en Engels.
  • De smartphonevrije wellnessregels blijven duidelijk vermeld.
v1.1.4 Een duidelijke opbouw naar de sessiestart
Probleem / foutmelding

De volgende sessie was goed zichtbaar, maar gasten moesten verschillende badges, teksten en de tijdlijn samen lezen om te begrijpen hoe dichtbij de start was en wat zij best deden.

Oplossing

Binnen dertig minuten verschijnt nu één duidelijke startstrook in de sessiekaart. Ze toont een groot minutengetal, benoemt de fase en vertelt rustig wanneer gasten naar de juiste ruimte kunnen gaan. In de laatste vijf minuten wordt het signaal warmer en tijdens de sessie verandert het naar een duidelijke live-status.

Technisch

De startstrook wordt automatisch opgebouwd uit dezelfde actuele starttijd en verwachte duur als de rest van de planning. Er is geen extra invoer nodig. De beweging stopt automatisch wanneer Minder beweging op het toestel is ingeschakeld.

Technische stappen
  1. Van dertig tot vijftien minuten voor de start verschijnt Voorbereiding.
  2. Vanaf vijftien minuten wordt de aftelling duidelijker en warmer van kleur.
  3. Tijdens de laatste vijf minuten staat de route naar de juiste ruimte centraal.
  4. Tijdens de sessie toont de strook LIVE en de geschatte resterende tijd.
  5. Het wellnessmotto staat nu na de volgende sessie zodat de planning eerst komt.
  6. De app gebruikt gedeeld ontwerpbestand versie 5, JavaScript-versie 78 en publieke offline-cache 40.
CodevoorbeeldJavaScript + CSS
var cue = createRitualCue(session, stage);
facts.appendChild(cue || status);

.ritual-cue.is-live {
  background: var(--oak-forest-deep);
}

Wat doet dit?De app kiest op basis van het resterende aantal minuten automatisch de juiste startfase. De gewone status blijft zichtbaar zolang de sessie nog verder weg is.

5 wijzigingen

  • Een groot minutengetal maakt de naderende start meteen duidelijk.
  • Gasten zien tijdig naar welke ruimte zij kunnen gaan.
  • Nu verzamelen en LIVE krijgen ieder een duidelijke eigen uitstraling.
  • De ruimtefoto en aftelling vormen samen het middelpunt.
  • De volledige kaart blijft rustig en stabiel op haar plaats.
v1.1.3 Meer diepte in de volgende beleving
Probleem / foutmelding

De grote ruimtefoto was duidelijk zichtbaar, maar beeld, tijd, locatie en sfeer stonden nog op één vlak. Daardoor kon de aankondiging van de volgende sessie nog meer diepte en verwondering gebruiken.

Oplossing

De ruimtefoto beweegt nu subtiel mee wanneer gasten scrollen. Tijd en ruimtenaam bewegen heel licht in de tegenovergestelde richting, terwijl stoom, licht of klank als een aparte sfeerlaag door het beeld loopt. De dagknoppen en sessiekaart blijven ondertussen stabiel.

Technisch

Het parallaxeffect wordt alleen berekend voor foto's die in beeld staan en gebruikt een kleinere afstand op telefoons. De instelling Minder beweging schakelt zowel parallax als kanteling automatisch uit.

Technische stappen
  1. De foto beweegt rustig binnen haar eigen vaste kader.
  2. Tijd, locatie en fasebadge vormen een aparte voorgrondlaag.
  3. Stoom of klank beweegt als een derde dieptelaag.
  4. De kaart zelf verplaatst niet en behoudt de rustige knopstijl.
  5. De app gebruikt gedeeld ontwerpbestand versie 4, bewegingsbestand versie 3, JavaScript-versie 77 en publieke offline-cache 39.
CodevoorbeeldJavaScript + CSS
var position = distance / range;
element.style.setProperty('--oak-parallax-image', (-position * depth) + 'px');

Wat doet dit?De afstand tussen foto en midden van het scherm bepaalt een kleine beeldverschuiving. Daardoor ontstaat diepte zonder dat de planning of tekst verspringt.

4 wijzigingen

  • De volgende ruimtefoto krijgt een subtiel parallaxeffect.
  • Tijd, locatie en sfeer bewegen in aparte dieptelagen.
  • Het effect blijft rustig op kleine telefoons.
  • De vaste dagknoppen en sessiekaart blijven onveranderd stabiel.
v1.1.2 Een rustigere en duidelijkere dagkeuze
Probleem / foutmelding

De afzonderlijke dagknoppen en bewegende aanklikbare kaarten konden te los aanvoelen, alsof ze boven de pagina zweefden.

Oplossing

De volledige dagkeuze is nu één vaste, gesegmenteerde balk. Dunne scheidingslijnen houden alle dagen bij elkaar en de gekozen dag gebruikt een rustige groene achtergrond. De volgende sessie blijft op haar plaats, terwijl de betekenisvolle beweging in foto en tijdlijn behouden blijft.

Technisch

Knoppen nemen niet langer deel aan de scrollanimatie en sessiekaarten gebruiken geen opwaartse hoververplaatsing meer. Hierdoor blijft de bediening stabiel op touchscreens en desktop.

Technische stappen
  1. Vandaag tot en met Vrijdag staan in twee vaste, omlijnde rijen.
  2. De actieve dag gebruikt een groene interne onderlijn zonder buitenschaduw.
  3. De sessiekaart blijft vast staan wanneer ze wordt aangewezen.
  4. Beeldbeweging, energiespoor en sessievoortgang blijven actief.
  5. De app gebruikt gedeeld ontwerpbestand versie 3, bewegingsbestand versie 2, JavaScript-versie 76 en publieke offline-cache 38.
CodevoorbeeldCSS
.day-row {
  border: 1px solid var(--oak-line);
  background: #f7f9f7;
}
.day-button { box-shadow: none; }

Wat doet dit?De buitenrand hoort nu bij de volledige dagkeuze in plaats van bij iedere knop afzonderlijk. Zo voelt de bediening als één vast onderdeel van de app.

4 wijzigingen

  • De dagkeuze voelt niet langer zwevend aan.
  • Alle dagen zijn gegroepeerd in één stabiele bedieningsbalk.
  • De actieve dag blijft meteen herkenbaar.
  • Sessiekaarten blijven vast terwijl de inhoud levendig blijft.
v1.1.1 Meer beleving terwijl een sessie nadert
Probleem / foutmelding

De vernieuwde gastenapp was overzichtelijk, maar de volgende sessie en het programma voelden nog vrij stil wanneer gasten door de pagina bladerden. De visuele spanning mocht sterker toenemen richting voorbereiding, bijna starten en live.

Oplossing

De app komt nu rustig tot leven. Onderdelen verschijnen vloeiend tijdens het scrollen, over de volgende sessie beweegt een subtiel energiespoor en de ruimtefoto krijgt zachte beweging en licht. Profielfoto's verschijnen na elkaar en de tijdlijn stroomt duidelijker mee naar de start, de live beleving en het herstel.

Technisch

De animaties starten alleen voor zichtbare onderdelen en gebruiken dezelfde actuele sessiefase als de countdown. Op toestellen waarop Minder beweging is ingesteld, blijft de volledige app automatisch stil.

Technische stappen
  1. Dagknoppen, sessiekaarten en programmaregels bouwen vloeiend op wanneer ze in beeld komen.
  2. Een rustig energiespoor verandert van goud naar koraal en groen naarmate de sessie nadert.
  3. De ruimtefoto reageert op desktop subtiel op de aanwijzer en blijft op mobiel stabiel.
  4. De voortgang in Nu & straks en het dagprogramma krijgt een vloeiende bewegingsrichting.
  5. De app gebruikt gedeeld ontwerpbestand versie 2, bewegingsbestand versie 1, JavaScript-versie 75 en publieke offline-cache 37.
CodevoorbeeldJavaScript + CSS
element.classList.add('is-motion-visible');

.moment-journey::after {
  animation: oakJourneyFlow 4s linear infinite;
}

Wat doet dit?Alleen een onderdeel dat in beeld komt, wordt geanimeerd. De bewegende voortgang gebruikt de bestaande tijdlijn en verandert niets aan de planning of de sessiegegevens.

5 wijzigingen

  • Nu & straks voelt levendiger en bouwt meer nieuwsgierigheid op.
  • Ruimtefoto, opgieters en tijdlijn bewegen als één geheel.
  • Bijna starten en live vallen duidelijker op zonder onrustige drukte.
  • Dagwissels en scrollen verlopen vloeiender.
  • De toegankelijkheidsinstelling Minder beweging blijft volledig gerespecteerd.
v1.1.0 Een nieuwe moderne The White Oak-uitstraling
Probleem / foutmelding

De gastenapp bevatte alle informatie, maar de grote welkomstfoto nam op mobiele schermen veel plaats in en de dagkeuze verscheen pas na Nu & straks. Daardoor duurde het langer voordat gasten bij de gewenste datum en volgende sessie kwamen.

Oplossing

De app opent nu met een compacte witte merkkop, direct gevolgd door de volledige dagkeuze en een ruimer Nu & straks-overzicht. De ruimtefoto, tijd, opgieters, status, boodschap en belevingstijdlijn vormen één rustige compositie. Dezelfde visuele stijl wordt voortaan ook in de interne opgietplanner gebruikt.

Technisch

De bestaande gegevens, taalkeuze en navigatie blijven ongewijzigd. Alleen de volgorde van de zichtbare hoofdonderdelen en hun gedeelde responsive stijllaag zijn vernieuwd. De layout schaalt zonder aparte mobiele code naar grote en kleine schermen.

Technische stappen
  1. De dagkeuze staat voortaan vóór Nu & straks.
  2. De hoge welkomsthero is vervangen door een compacte witte kop met het bestaande juiste logo.
  3. De desktopkaart verdeelt ruimtefoto, opgieters en sessiestatus in drie duidelijke zones.
  4. Op mobiel staat de ruimtefoto breed boven de namen en blijft iedere dagknop zichtbaar.
  5. De app gebruikt gedeeld ontwerpbestand versie 1, JavaScript-versie 74 en publieke offline-cache 36.
CodevoorbeeldCSS
.day-button.is-active {
  color: var(--oak-forest);
  border-bottom-color: var(--oak-forest);
}

.moment-room-media {
  height: 300px;
}

Wat doet dit?De geselecteerde dag wordt als rustig tabblad aangeduid. De grote vaste ruimtefoto geeft de volgende sessie op ieder scherm een herkenbaar middelpunt zonder andere gegevens weg te drukken.

5 wijzigingen

  • Een compactere kop brengt gasten sneller naar de planning.
  • De volledige dagkeuze staat nu boven Nu & straks.
  • Ruimtefoto, tijd, opgieters en status zijn duidelijker gegroepeerd.
  • Mobiel en desktop gebruiken hetzelfde rustige ontwerp.
  • Kalender, team, praktisch, talen en sessiedetails blijven volledig beschikbaar.

Versiereeks

1.0.x

44 versies
v1.0.43 Duidelijk aftellen naar de volgende beleving
Probleem / foutmelding

Gasten konden de resterende tijd wel lezen, maar aan de grote ruimtefoto was niet meteen te zien wanneer ze zich moesten klaarmaken, naar de ruimte mochten gaan of wanneer een sessie al bezig was.

Oplossing

De foto in Nu & straks krijgt nu een fasebadge die automatisch verandert. Voorbereiding blijft rustig goud, binnen vijftien minuten verschijnt het aftellen, in de laatste vijf minuten staat Neem rustig plaats duidelijk op de foto en tijdens de sessie verschijnt Nu live in groen.

Technisch

De app controleert om de dertig seconden de actuele tijd. Op basis daarvan worden tekst, kleur, tijdlijn en beweging samen aangepast. De animaties veranderen de indeling niet en worden uitgeschakeld wanneer een toestel minder beweging verkiest.

Technische stappen
  1. De statusbadge staat rechtstreeks op de ruimtefoto en blijft ook op kleine telefoons leesbaar.
  2. Een subtiele lichtbeweging en sfeeranimatie bouwen de nieuwsgierigheid rustig op.
  3. Opgietingen gebruiken zachte stoomlijnen, sound healing gebruikt uitdeinende klankcirkels en scrubrituelen een lichte rituele beweging.
  4. De live-status gebruikt groen; bijna starten gebruikt een warme koraaltint.
  5. De gastenapp gebruikt stylesheet-versie 61, JavaScript-versie 73 en publieke offline-cache 35.
CodevoorbeeldJavaScript
phaseText = stage === 'live'
  ? text('liveNow')
  : stage === 'imminent'
    ? text('takeYourPlace') + ' · ' + relativeStatus(session)
    : relativeStatus(session);

Wat doet dit?De badge gebruikt dezelfde actuele sessiefase als de tijdlijn. Daardoor spreken foto, countdown en programma elkaar altijd tegen dezelfde tijd aan.

4 wijzigingen

  • Een nieuwe badge op de ruimtefoto telt zichtbaar af naar de start.
  • De laatste vijf minuten nodigen gasten duidelijk uit om rustig plaats te nemen.
  • Een groene Nu live-status maakt een lopende sessie onmiddellijk herkenbaar.
  • Passende bewegingen maken warmte, klank en verzorging voelbaar zonder onrustig te worden.
v1.0.42 Grotere ruimtefoto bij één volgende sessie
Probleem / foutmelding

Een ruimtefoto viel vooral op wanneer twee sessies gelijktijdig werden aangekondigd. Bij één volgende sessie was het beeld kleiner, terwijl de ruimte voor gasten juist een belangrijk herkenningspunt is.

Oplossing

In Nu & straks krijgt ook één sessie voortaan een grote ruimtefoto. Het beeld staat prominent boven de namen en details en is op een kleine telefoon ongeveer 200 pixels hoog, zonder dat tekst of profielfoto's elkaar overlappen.

Technisch

De bestaande beeldkaart gebruikt grotere vaste hoogtes per schermformaat. De foto blijft automatisch passend uitgesneden en de kaart behoudt dezelfde animaties bij voorbereiding, bijna starten en live.

Technische stappen
  1. De ruimtefoto is 190 pixels hoog op desktop.
  2. Op mobiele schermen gebruikt de foto 200 tot 210 pixels hoogte.
  3. De tijd, ruimtenaam en live-aanduiding blijven als goed leesbare lagen op het beeld staan.
  4. De gastenapp gebruikt stylesheet-versie 60, JavaScript-versie 72 en publieke offline-cache 34.
CodevoorbeeldCSS
.moment-room-media { height: 190px; }
@media (max-width: 600px) {
  .moment-room-media { height: 210px; }
}

Wat doet dit?De beeldhoogte groeit mee met het beschikbare schermformaat. Daardoor is de ruimte direct herkenbaar, terwijl de rest van de sessiekaart stabiel onder het beeld blijft staan.

4 wijzigingen

  • Ook één volgende sessie krijgt nu een grote ruimtefoto.
  • De foto valt duidelijker op op kleine smartphones.
  • De sessiegegevens blijven rustig en volledig leesbaar.
  • Voorbereidings- en live-animaties blijven behouden.
v1.0.41 Een wellnessmotto voor iedere gast
Probleem / foutmelding

Het dagmotto bevatte ook boodschappen over het team. Voor gasten was daardoor niet altijd duidelijk dat deze rustige boodschap ook voor hun eigen wellnessbeleving bedoeld was.

Oplossing

Boven Nu & straks staat nu Wellnessmotto van de dag. Twaalf nieuwe levensmotto's begeleiden gasten met korte gedachten over vertragen, ademhalen, luisteren naar het lichaam, warmte, stilte, afkoelen en herstel.

Technisch

Iedere datum kiest vast één motto uit de wellnessreeks. Opnieuw laden of de app opnieuw openen toont op dezelfde dag dus dezelfde boodschap. Een andere dag krijgt automatisch een ander motto.

Technische stappen
  1. De reeks is bewust losgemaakt van de persoonlijke teamcomplimenten.
  2. Nederlands, Frans en Engels hebben ieder een volledige eigen vertaling.
  3. Interne planner en gastenapp kiezen op dezelfde datum hetzelfde Nederlandse motto.
  4. De gastenapp gebruikt JavaScript-versie 71 en publieke offline-cache 33.
CodevoorbeeldJavaScript
var list = currentInspiration().mottos;
var motto = list[stableIndex(day.iso, list.length)];

Wat doet dit?De datum wordt omgezet in een vaste positie in de lijst met motto's. Zo ontstaat dagelijkse afwisseling zonder dat de tekst tijdens dezelfde dag verspringt.

4 wijzigingen

  • De gastenapp toont voortaan een Wellnessmotto van de dag.
  • Twaalf levensmotto's sluiten rechtstreeks aan bij rust en wellness.
  • De boodschap blijft de hele gekozen dag hetzelfde.
  • Alle motto's zijn beschikbaar in het Nederlands, Frans en Engels.
v1.0.40 Van voorbereiding tot herstel met een persoonlijke boodschap
Probleem / foutmelding

Gasten konden de voortgang van een sessie volgen, maar de tekst vertelde nog onvoldoende wat er achter de schermen gebeurde. De boodschap voor het team was algemeen en na afloop verscheen steeds dezelfde danktekst.

Oplossing

Nu & straks toont voortaan een rustig motto dat voor de volledige gekozen dag gelijk blijft. Bij de volgende sessie bedanken we de genoemde opgieter of het team voor de voorbereiding. De boodschap verandert vanzelf naarmate de sessie dichterbij komt en sluit vlak na afloop af met een persoonlijk bedankje en duidelijk hersteladvies.

Technisch

De tekstkeuze is niet willekeurig bij ieder bezoek. Datum, sessietijd en namen vormen samen een vaste sleutel, zodat een sessie op iedere telefoon dezelfde boodschap krijgt en de app toch voldoende afwisseling over verschillende dagen biedt.

Technische stappen
  1. Het dagmotto is identiek aan het motto in de interne opgietplanner.
  2. De tijdlijn gebruikt vijf herkenbare momenten: voorbereiding, begint zo, live, afgerond en herstel.
  3. Voor Nederlandse, Franse en Engelse bezoekers zijn aparte motto's, complimenten en bedankjes voorzien.
  4. Het bedankje verschijnt gedurende de vijf minuten na het verwachte einde van een sessie.
  5. De gastenapp gebruikt CSS-versie 59, JavaScript-versie 70 en publieke offline-cache 32.
CodevoorbeeldJavaScript
var key = session.startsAt + '|' + sessionCredits(session);
return messages[stableIndex(key, messages.length)];

Wat doet dit?De begintijd en namen worden omgezet in een vaste positie in de tekstenlijst. Daardoor blijft de boodschap herkenbaar bij verversen en verandert ze wel bij een andere sessie.

5 wijzigingen

  • Nu & straks toont een rustig motto van de dag.
  • De volgende sessie krijgt een persoonlijk compliment voor het team.
  • De tekst beweegt logisch mee van voorbereiding naar live en herstel.
  • Na de sessie volgt een persoonlijk bedankje met advies over afkoelen, water, voeding en rust.
  • Alle nieuwe boodschappen werken in het Nederlands, Frans en Engels.
v1.0.39 Officieel ROTS-logo herkenbaar op iedere eventdag
Probleem / foutmelding

Rituals of the Soul werd wel als speciaal event aangeduid, maar gebruikte alleen de algemene gouden eventster. Het eigen ROTS-beeldmerk ontbrak, waardoor de eventdag visueel te weinig herkenbaar was.

Oplossing

Iedere ROTS-dag toont nu het officiële groene Rituals of the Soul-logo in een opvallende zwarte merkkaart. De kaart verschijnt zowel in de gekozen dagplanning als in de details van de maandkalender.

Technisch

Het logo is als vaste ROTS-merkidentiteit opgeslagen. Elke huidige of toekomstige eventnaam met ROTS of Rituals of the Soul krijgt automatisch dezelfde kaart; er is geen aparte datuminstelling nodig.

Technische stappen
  1. Het aangeleverde logo wordt ongewijzigd gebruikt als officieel ROTS-beeldmerk.
  2. De merkkaart gebruikt de officiële groene kleur in plaats van de vroegere generieke paarse themakleur.
  3. Een rustige lichtpassage laat het logo opvallen zonder de planning onrustig te maken.
  4. De kalenderster blijft als compacte markering staan en opent de grote logokaart in het dagdetail.
  5. De gastenapp gebruikt CSS-versie 58, JavaScript-versie 69 en publieke offline-cache 31.
CodevoorbeeldPHP
if (str_contains($eventName, 'ROTS') || str_contains($eventName, 'RITUALS OF THE SOUL')) {
    return resolveTheme('ROTS');
}

Wat doet dit?De app herkent ROTS aan de eventnaam en haalt vervolgens automatisch het vaste logo, de officiële kleur en de volledige naam uit één centrale merkdefinitie.

4 wijzigingen

  • Het officiële ROTS-logo valt nu duidelijk op in de dagplanning.
  • Ook het gekozen kalenderdetail toont dezelfde merkkaart.
  • Toekomstige ROTS-dagen krijgen het logo automatisch.
  • De algemene kalenderster blijft beschikbaar als rustige compacte aanduiding.
v1.0.38 Ruimtefoto trekt de aandacht bij Nu & straks
Probleem / foutmelding

Bij Nu & straks was de foto van de ruimte op een kleine telefoon slechts 108 pixels hoog. De ruimte en sfeer waren daardoor minder herkenbaar dan in de interne opgietplanner.

Oplossing

De ruimtefoto is nu aanzienlijk groter en vormt het visuele begin van de volgende of live sessie. De kaart vermeldt in het beeld of dit de volgende sessie, een sessie die bijna start of een live sessie is, met daaronder de volledige ruimtenaam.

Technisch

De foto beweegt heel langzaam voor een levendiger beeld. Bij een naderende sessie glijdt een warme lichtreflectie door het beeld; live krijgt de foto een rustige ademende omlijsting. De systeeminstelling Verminder beweging schakelt deze animaties automatisch uit.

Technische stappen
  1. Op telefoons tot 390 pixels groeit de foto van 108 naar 160 pixels hoog.
  2. De foto gebruikt een rustige zoom- en panbeweging zonder de tekst of bediening te verplaatsen.
  3. Straks en live krijgen verschillende visuele accenten, zodat de status ook zonder lange tekst herkenbaar is.
  4. De ruimtenaam staat groter en met meer contrast rechtstreeks in het beeld.
  5. De gastenapp gebruikt CSS-versie 57, JavaScript-versie 68 en publieke offline-cache 30.
CodevoorbeeldCSS
.moment-room-media { height: 160px; }
.moment-room-media img { animation: moment-room-drift 20s ease-in-out infinite alternate; }
.moment-session.is-live .moment-room-media { animation: moment-room-live-frame 2.8s ease-in-out infinite; }

Wat doet dit?De foto krijgt een grotere vaste hoogte en een trage beeldbeweging. Alleen wanneer de sessie live is, komt daar een rustige omlijstingsanimatie bij; de kaart zelf blijft stabiel staan.

4 wijzigingen

  • De foto van de wellnessruimte is veel groter bij Nu & straks.
  • Volgende sessie, straks en live zijn nu rechtstreeks in het beeld herkenbaar.
  • Een subtiele beeldbeweging en warme lichtreflectie maken de kaart levendiger.
  • Verminder beweging op het toestel blijft volledig gerespecteerd.
v1.0.37 Eventvideo en flyer duidelijk in beeld
Probleem / foutmelding

Op een eventdag verschenen de video en flyer als twee kleine meldingen. Vooral op een kleinere telefoon waren de previews nauwelijks herkenbaar en verdween de begeleidende tekst, waardoor gasten de extra eventinformatie gemakkelijk voorbijgingen.

Oplossing

Video en flyer staan nu samen in één duidelijk eventblok boven het dagprogramma. Beide hebben een veel grotere preview, een herkenbare afspeelknop of flyeractie en voldoende uitleg. Dezelfde presentatie verschijnt ook wanneer een gast de eventdatum via de maandkalender opent.

Technisch

De vaste dagplanning en het dynamisch opgebouwde kalenderdetail gebruiken nu dezelfde media-opbouw. De mobiele minimumafmetingen zijn verhoogd en de offline-cache is vernieuwd, zodat geïnstalleerde apps de nieuwe presentatie ontvangen.

Technische stappen
  1. De mediapreview is op kleine schermen meer dan verdubbeld van 54 naar 112 pixels breed.
  2. Video en flyer krijgen afzonderlijke kaarten binnen één herkenbaar eventvlak.
  3. De video toont centraal een duidelijke afspeelmarkering en laadt voldoende gegevens voor een zichtbare preview.
  4. De begeleidende tekst blijft voortaan ook op kleinere telefoons zichtbaar.
  5. De gastenapp gebruikt CSS-versie 56, JavaScript-versie 67 en publieke offline-cache 29.
CodevoorbeeldCSS
.guest-event-media-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); }
.guest-flyer-preview { width: 104px; height: 82px; }
@media (max-width: 380px) { .guest-flyer-preview { width: 112px; height: 88px; } }

Wat doet dit?Het eventblok verdeelt de beschikbare ruimte automatisch over de video en flyer. Op een smalle telefoon worden de kaarten onder elkaar geplaatst en krijgt iedere preview bewust meer ruimte.

4 wijzigingen

  • Video en flyer vallen nu direct op boven het programma van de eventdag.
  • Beide media krijgen evenveel aandacht met een grotere preview en eigen knop.
  • De kalenderdetails tonen dezelfde duidelijke eventpresentatie.
  • Ook op kleinere telefoons blijven titel, uitleg en acties volledig zichtbaar.
v1.0.36 ROTS-dagen automatisch als speciaal event herkend
Probleem / foutmelding

Zondag 9 augustus is Rituals of the Soul, maar de gastenapp toonde deze dag alleen als extra planning. ROTS staat in de gewone planning bij meerdere sessie-uren en niet in het aparte thema- of flyerveld, waardoor de bestaande eventdetectie de dag miste.

Oplossing

Zondag 9 augustus krijgt nu automatisch het label Speciaal event · Rituals of the Soul (ROTS), met de gouden eventster in de kalender en dezelfde aankondiging in dagplanning en tv-scherm. Deze herkenning geldt voortaan voor iedere ROTS-dag.

Technisch

De app gebruikt nu de bestaande ROTS-planningsscanner als vaste eventbron. Zodra op een datum minstens één ROTS-uur wordt gevonden, ontstaat automatisch een speciaal event zonder handmatige datum of flyer.

Technische stappen
  1. De planning bevat op 9 augustus zeven door de ROTS-scanner herkende uren.
  2. ROTS blijft apart van gewone thema's en wordt als speciaal event opgeslagen.
  3. Toekomstige ROTS-datums krijgen automatisch dezelfde kalender- en dagmarkering.
  4. Een flyer of handmatige evenementdatum is niet nodig voor de herkenning.
  5. De programmagegevens gebruiken cacheversie 11, JavaScript-versie 66 en publieke offline-cache 28.
CodevoorbeeldPHP
foreach (scanRotsHours($monthName) as $iso => $times) {
    if (!empty($times)) {
        $planningEventsByDate[$iso] = 'Rituals of the Soul (ROTS)';
    }
}

Wat doet dit?De app controleert per maand op welke datums ROTS in de planning voorkomt. Elke gevonden datum wordt automatisch als speciaal event doorgegeven aan alle publieke programmaweergaven.

4 wijzigingen

  • Zondag 9 augustus is nu herkenbaar als Rituals of the Soul (ROTS).
  • ROTS verschijnt als speciaal event in plaats van als gewoon thema.
  • De kalender toont de gouden eventster naast de bestaande markering voor extra sessies.
  • Ook toekomstige ROTS-dagen worden automatisch herkend.
v1.0.35 Drie opgieters volledig zichtbaar bij één sessie
Probleem / foutmelding

Bij een sessie met drie opgieters werden slechts de eerste twee profielcirkels weergegeven. Daardoor bleef bij de Banja-sessie van 21:30 de aanwezige profielfoto van Koen verborgen achter een technische limiet van twee personen.

Oplossing

De gastenapp toont nu alle drie de opgieters bij dezelfde sessie. Gwen en Marin verschijnen met hun initialen zolang er geen foto is geüpload; Koen verschijnt daarnaast met zijn beschikbare profielfoto. Namen en sessiegegevens blijven volledig leesbaar.

Technisch

Alle avatarweergaven ondersteunen nu drie personen. De drie-personenvariant gebruikt afzonderlijke compacte cirkels zonder overlap, zodat de indeling ook op kleine telefoons stabiel blijft.

Technische stappen
  1. De dagplanning, tijdlijn, kalenderdetails, sessiedetail en gelijktijdige sessies tonen maximaal drie betrokken personen.
  2. Ook het tv-scherm toont voortaan de derde opgieter.
  3. De beschikbare profielfoto wordt niet langer weggefilterd wanneer ze als derde in de sessie staat.
  4. Bij ontbrekende foto's blijft per persoon een duidelijke initiaal zichtbaar.
  5. De gastenapp gebruikt CSS-versie 55, JavaScript-versie 65, tv-stijlen 19, tv-script 24 en publieke offline-cache 27.
CodevoorbeeldJavaScript
var people = (session.hostPhotos || []).slice(0, 3);
container.classList.toggle('has-three', people.length === 3);

Wat doet dit?De sessie neemt nu drie personen mee in plaats van twee. Bij exact drie personen activeert de app een compactere indeling die alle cirkels naast elkaar plaatst zonder overlap.

4 wijzigingen

  • Alle drie de opgieters zijn nu zichtbaar bij de Banja-sessie van 21:30.
  • De profielfoto van Koen wordt naast Gwen en Marin getoond.
  • Drie profielcirkels blijven ook op kleine telefoons netjes binnen de beschikbare ruimte.
  • Dezelfde verbetering geldt voor de kalender, details en het tv-scherm.
v1.0.34 Alchemy of Elements correct als tijdelijk speciaal event
Probleem / foutmelding

De recent aangekondigde flyer voor Alchemy of Elements werd in de kalender als een vast thema behandeld, terwijl dit event niet in Google Spreadsheet staat en uitsluitend voor zaterdag 8 augustus geldt.

Oplossing

Zaterdag 8 augustus wordt nu herkenbaar aangeduid als Speciaal event · Alchemy of Elements. Een goudkleurige ster maakt de eventdag zichtbaar in de kalender, de volledige titel staat in de dagplanning en het tv-scherm spreekt eveneens over een speciaal event.

Technisch

Thema's en tijdelijke events zijn voortaan twee aparte gegevenssoorten. Een thema komt alleen uit Google Spreadsheet; een speciaal event wordt automatisch afgeleid uit goedgekeurde eventmedia met exact dezelfde datum.

Technische stappen
  1. De flyer zelf blijft de bron voor het tijdelijke event en wijzigt niets aan Google Spreadsheet.
  2. Bij verwijdering van de goedgekeurde flyer of eventvideo verdwijnt de eventmarkering automatisch.
  3. De maandkalender toont een aparte ster voor speciale events en behoudt een afzonderlijke markering voor echte thema's.
  4. Het kalenderdetail, de dagplanning, de hoofdweergave en het tv-scherm gebruiken dezelfde eventtitel.
  5. De programmagegevens gebruiken cacheversie 10, CSS-versie 54, JavaScript-versie 64, tv-scriptversie 23 en publieke offline-cache 26.
CodevoorbeeldPHP
$themeName = guestThemeNameForDate($iso, $themeByDate);
$eventTitle = guestEventTitleForDate($iso, $guestFlyersByDate);

Wat doet dit?De eerste regel leest uitsluitend een officieel planningsthema. De tweede zoekt apart naar goedgekeurde eventmedia op dezelfde datum. Daardoor kan een tijdelijke flyer nooit meer onbedoeld als spreadsheetthema worden opgeslagen of weergegeven.

5 wijzigingen

  • 8 augustus heet nu correct Speciaal event · Alchemy of Elements.
  • Een gouden ster maakt het eenmalige event herkenbaar in de maandkalender.
  • De app en het tv-scherm gebruiken niet langer onterecht het woord Themadag voor deze flyer.
  • De markering volgt automatisch de tijdelijke, datumgebonden flyer.
  • Google Spreadsheet blijft volledig ongewijzigd.
v1.0.33 Themadagen herkenbaar in de wellnesskalender
Probleem / foutmelding

Alchemy of Elements was via de flyer en het tv-scherm herkenbaar, maar zaterdag 8 augustus kreeg geen thema-icoon in de wellnesskalender. Het aparte themaveld in de planning was leeg, waardoor de kalender theme: null ontving.

Oplossing

Een goedgekeurde evenementflyer of eventvideo kan nu automatisch de themanaam aan de juiste kalenderdatum geven. De dag krijgt een duidelijk goudkleurig ✦-icoon; na selectie staat de volledige naam Alchemy of Elements ook in het kalenderdetail.

Technisch

De kalender gebruikt eerst het officiële themaveld uit de planning. Is dat leeg, dan neemt hij uitsluitend de titel van goedgekeurde eventmedia met exact dezelfde datum. Gewone dagen en media van andere datums blijven ongemoeid.

Technische stappen
  1. Zaterdag 8 augustus ontvangt nu het thema Alchemy of Elements.
  2. Het thema wordt zowel aan de zevendaagse dagplanning als aan de maandkalender gekoppeld.
  3. Het gouden ✦-icoon is visueel anders dan de markering voor badkleding en extra sessies.
  4. De volledige themanaam verschijnt als label in het kalenderdetail en in de toegankelijke dagomschrijving.
  5. De programmagegevens gebruiken cacheversie 9, CSS-versie 53, JavaScript-versie 63 en publieke offline-cache 25.
CodevoorbeeldPHP
$themeName = guestThemeNameForDate($iso, $themeByDate, $guestFlyersByDate);
$calendarDay['theme'] = $themeName;

Wat doet dit?De datum zoekt eerst een ingevuld planningsthema. Alleen wanneer dat ontbreekt, wordt de titel van goedgekeurde eventmedia op exact die datum gebruikt. Daardoor herkennen alle kalenderweergaven dezelfde themadag.

5 wijzigingen

  • ✦ Alchemy of Elements staat nu als themadag aangeduid op zaterdag 8 augustus.
  • 📅 Een goudkleurig speciaal icoon maakt de themadag direct herkenbaar in de maandkalender.
  • 🏷️ Na het selecteren van de datum verschijnt Thema · Alchemy of Elements boven het dagprogramma.
  • 🎬 De themakoppeling volgt automatisch de datum van de goedgekeurde flyer of eventvideo.
  • 🔄 De publieke appcache is vernieuwd naar versie 25.
v1.0.32 Banja-sessie met Gwen, Marin en Koen toegevoegd
Probleem / foutmelding

De gezamenlijke Banja-sessie van zaterdag 8 augustus om 21:30 stond nog als open sessie in The Barn, omdat de drie opgieters niet in de Google Spreadsheet waren ingevuld.

Oplossing

De open plaats is vervangen door één gezamenlijke Banja-sessie met Gwen, Marin en Koen VDB. De juiste sessie staat nu in de gastenplanning, het kalenderdetail en vanaf de evenementdag ook op het tv-scherm.

Technisch

Een gecontroleerde planningsuitzondering vult uitsluitend datum 8 augustus, tijdstip 21:30 en ruimte The Barn aan. De gewone spreadsheetplanning blijft voor alle andere sessies leidend.

Technische stappen
  1. De drie namen worden samengevoegd tot één sessie en niet als drie dubbele kaarten weergegeven.
  2. Het bestaande open slot van 21:30 in The Barn wordt verwijderd zodra de uitzondering actief is.
  3. De sessietitel is Banja-sessie en de ruimte blijft The Barn.
  4. Alle andere opgieters, tijden en gelijktijdige sessies blijven onaangeraakt.
  5. De publieke offline-cache is vernieuwd naar versie 24 en de hoofdcode naar assetversie 62.
CodevoorbeeldJSON
{
  "date": "2026-08-08",
  "time": "21u30",
  "room": "THE BARN",
  "description": "Banja-sessie",
  "hosts": ["Gwen", "Marin", "Koen VDB"]
}

Wat doet dit?De uitzondering is beperkt tot één exact tijdstip. Daardoor kan deze ontbrekende evenementensessie correct verschijnen zonder andere gegevens uit de Google Spreadsheet te overschrijven.

6 wijzigingen

  • 🌿 Zaterdag 8 augustus om 21:30 staat nu een Banja-sessie in The Barn.
  • 👥 Gwen, Marin en Koen VDB worden samen als opgieters vermeld op één duidelijke sessiekaart.
  • 📅 De sessie verschijnt in de dagplanning en in het kalenderdetail van zaterdag 8 augustus.
  • 📺 Op de evenementdag staat de Banja-sessie ook in het volledige tv-programma.
  • ✓ De vroegere melding Opgieter wordt aangekondigd is op dit tijdstip verwijderd.
  • 🔄 De publieke appcache is vernieuwd naar versie 24.
v1.0.31 Themadag van morgen vooraf zichtbaar op het tv-scherm
Probleem / foutmelding

Het tv-scherm toonde alleen het programma en thema van vandaag. Een aangekondigde themadag voor morgen was daardoor nog niet herkenbaar voor gasten die vandaag naar het scherm keken.

Oplossing

Een themadag van morgen krijgt voortaan een vaste aankondiging in de hoofding van het tv-scherm met de evenementnaam en volledige datum. Dezelfde aankondiging verschijnt regelmatig groter in de wisselende boodschap onderaan.

Technisch

Het scherm leest eerst het themaveld van morgen en gebruikt bij een geüpload evenement de titel van de gekoppelde flyer of video als betrouwbare aanvulling. Alleen media met exact de datum van morgen activeren de vooraankondiging.

Technische stappen
  1. De tv-hoofding toont permanent Morgen · Themadag, de evenementnaam en de volledige weekdag en datum.
  2. Tijdens rustige momenten en na de laatste sessie keert de aankondiging terug in de grote wisselende boodschap onderaan.
  3. Op de evenementdag zelf verandert dezelfde titel automatisch in de aanduiding Themadag voor vandaag.
  4. De flyer en eventvideo blijven uitsluitend op de evenementdag zelf zichtbaar; vooraf verschijnt alleen de compacte aankondiging.
  5. Scherm-CSS 18, scherm-JavaScript 22 en publieke offline-cache 23 laden de nieuwe tv-weergave op vaste en geïnstalleerde schermen.
CodevoorbeeldJavaScript
const tomorrowTheme = tomorrow.theme || tomorrow.flyers?.find(item => item.title)?.title;
notice.hidden = !tomorrowTheme;
noticeTitle.textContent = tomorrowTheme;

Wat doet dit?De evenementtitel komt bij voorkeur uit de planning. Wanneer die nog niet als apart thema is ingevuld, kan de datumgebonden eventmedia de themadag toch correct herkennen en aankondigen.

6 wijzigingen

  • ✦ Het tv-scherm kondigt een themadag van morgen nu vooraf aan met naam en volledige datum.
  • 📺 De aankondiging blijft permanent herkenbaar in de hoofding en verschijnt regelmatig groter onderaan het scherm.
  • 📅 De melding wordt volledig automatisch door de evenementdatum gestuurd en verdwijnt op gewone dagen.
  • 🎬 De flyer en video zelf blijven alleen bij de dagplanning van het event staan, zodat het scherm vandaag overzichtelijk blijft.
  • 🌍 De themamelding werkt in Nederlands, Frans en Engels; het tv-scherm start zoals voorheen standaard in het Nederlands.
  • 🔄 De publieke appcache is vernieuwd naar versie 23.
v1.0.30 Korte eventvideo’s brengen speciale dagen tot leven
Probleem / foutmelding

Een event kon alleen met een stilstaande flyer worden aangekondigd. Een korte sfeer- of teaservideo kon niet binnen de juiste dagplanning worden getoond.

Oplossing

Een evenementdag kan nu een korte bewegende videovoorvertoning bevatten. De preview blijft geluidloos en rustig; via Bekijk video opent de gast bewust de volledige video.

Technisch

De app ontvangt bij iedere dag het mediatype en speelt alleen een video in het zichtbare dag- of kalenderdetail. MP4-video wordt via byte-streaming geladen, zodat mobiele browsers niet vooraf het hele bestand hoeven binnen te halen.

Technische stappen
  1. Eventvideo’s gebruiken een herkenbare afspeelmarkering en dezelfde compacte kaart als flyers.
  2. De preview speelt muted, in een herhaling en rechtstreeks binnen de pagina met playsinline.
  3. Bij het wisselen van dag of menu worden verborgen video’s onmiddellijk gepauzeerd.
  4. De knop Bekijk video opent de originele video met de bediening van de browser.
  5. CSS 52, JavaScript 60 en publieke offline-cache 22 zorgen dat de nieuwe mediaweergave ook in de geïnstalleerde app wordt geladen.
CodevoorbeeldJavaScript
if (visible) {
  video.play().catch(function () {});
} else {
  video.pause();
}

Wat doet dit?Na iedere dag- of menuwissel controleert de app welke eventvideo werkelijk zichtbaar is. Alleen die video mag bewegen; alle andere previews worden gepauzeerd.

6 wijzigingen

  • 🎬 Speciale evenementdagen kunnen nu een korte eventvideo tonen.
  • 🔇 De preview beweegt zonder geluid, zodat de dagplanning rustig blijft.
  • ▶ Bekijk video opent de volledige video bewust met geluid en bediening.
  • 📅 De video staat uitsluitend bij de datum van het event, zowel in de dagplanning als in het kalenderdetail.
  • 📱 De mobiele videolading is geoptimaliseerd voor Safari en iPhone.
  • 🔄 De publieke appcache is vernieuwd naar versie 22.
v1.0.29 Evenementflyers verschijnen uitsluitend op de juiste dag
Probleem / foutmelding

Een toekomstige evenementflyer kon als algemene aankondiging op de startdag Vandaag verschijnen, terwijl de inhoud alleen bij de evenementdag hoorde.

Oplossing

Flyers zijn voortaan aan één evenementdatum gekoppeld. Ze verschijnen pas wanneer een gast die dag opent via de dagknoppen of selecteert in de wellnesskalender.

Technisch

De openbare programmagegevens bevatten per dag alleen de flyers met exact dezelfde ISO-datum. Het kalenderdetail bouwt de compacte flyerkaart opnieuw op zodra een andere datum wordt geselecteerd.

Technische stappen
  1. De flyer staat niet langer als algemene tegel tussen Nu & straks en de dagkeuze.
  2. Iedere dag in de zevendaagse planning heeft een eigen flyers-lijst die meestal leeg is.
  3. Kalenderdagen voor deze en volgende maand ontvangen dezelfde datumgebonden informatie.
  4. De volledige flyer opent pas wanneer de bezoeker op Bekijk flyer tikt.
  5. CSS 51, JavaScript 59 en offline-cache 21 laden de juiste datumweergave ook in de geïnstalleerde app.
CodevoorbeeldJavaScript
renderFlyerCards(
  calendarDayFlyers,
  selectedDay.flyers
);

Wat doet dit?Na iedere kalenderselectie wordt de flyerzone leeggemaakt en uitsluitend gevuld met de flyers die de server aan de gekozen dag heeft gekoppeld.

4 wijzigingen

  • 📅 Een evenementflyer staat alleen op de dag waarvoor hij bedoeld is.
  • 👉 Selecteer de evenementdag via de dagknoppen of kalender om de flyer te zien.
  • 🧘 Vandaag blijft rustig en vrij van aankondigingen voor latere dagen.
  • 🔄 De publieke appcache is vernieuwd naar versie 21.
v1.0.28 Sound healer duidelijker op kleine telefoons
Probleem / foutmelding

De tekst Live sound healing met naam nam op de kleinste telefoons meerdere regels in, terwijl de sessietitel de live sound healing al vermeldt.

Oplossing

De partnerregel luidt nu korter Sound healer · naam. De twee rollen blijven duidelijk en de live sessie neemt minder schermhoogte in.

Technisch

De naam blijft afkomstig uit liveWith. Alleen de vertaalde opmaaktekst is verkort en wordt opnieuw toegepast wanneer de bezoeker van taal wisselt.

Technische stappen
  1. JavaScript leest liveWith als de naam van de gekoppelde sound healer.
  2. liveSoundWith voegt daar per taal het korte rollabel Sound healer aan toe.
  3. De dagtijdlijn hoeft hierdoor geen langere zin te bewaren en kan de tekst gemakkelijker over beschikbare breedte verdelen.
  4. De sessietitel Live opgieting + sound healing en beide profielfoto’s blijven volledig zichtbaar.
  5. JavaScript 58 en publieke offline-cache 20 zorgen dat de verfijning ook in een geïnstalleerde app wordt geladen.
CodevoorbeeldJavaScript
replace(text('liveSoundWith'), {
  guest: session.liveWith
});

// Resultaat: Sound healer · Rasmus

Wat doet dit?De vertaling bevat een plaatsaanduiding {guest}. De functie vervangt die door de echte naam uit de planning. Zo blijft één compacte tekst bruikbaar voor alle sound healers en alle ondersteunde talen.

4 wijzigingen

  • 🎵 De live partner staat nu als Sound healer · naam in de dagplanning.
  • 📱 De live sessie blijft overzichtelijker op telefoons vanaf 320 pixels breed.
  • 👥 De twee profielfoto’s, de opgieter en de sound healer blijven samen zichtbaar.
  • 🔄 De publieke appcache is vernieuwd naar versie 20.
v1.0.27 Live opgieting valt duidelijker op
Probleem / foutmelding

Bij een live opgieting stonden de opgieter en sound healer vooral samen in één tekstregel. Daardoor was voor gasten niet onmiddellijk duidelijk dat twee mensen samen één bijzondere sessie verzorgen.

Oplossing

De live opgieting heeft nu een eigen gouden markering, een zichtbaar Live-label, twee profielfoto’s en afzonderlijke rollen voor de opgieter en sound healer.

Technisch

De gastenapp gebruikt het bestaande veld liveWith uit het openbare programma. Dat veld stuurt nu zowel de speciale vormgeving als de aparte rollen en vertalingen aan.

Technische stappen
  1. De server voegt liveWith alleen toe wanneer een opgieting werkelijk aan de sound healer van die dag gekoppeld is.
  2. De dagtijdlijn krijgt bij zo’n sessie de klasse is-live-special, een Live-label onder het uur en een aparte regel voor live sound healing.
  3. De grote Nu & straks-weergave bouwt voor dezelfde sessie twee rolblokken op: Opgieter en Sound healer.
  4. De bestaande profielfotostapel blijft beide personen tonen en sluit nu visueel aan bij de twee uitgeschreven namen.
  5. De termen worden bij iedere taalwissel opnieuw opgebouwd in Nederlands, Frans of Engels. CSS 50, JavaScript 57 en publieke offline-cache 19 zorgen dat geïnstalleerde apps de nieuwe weergave ophalen.
CodevoorbeeldJavaScript
button.classList.toggle('is-special', !!session.liveWith);

if (session.liveWith) {
  showRole('Opgieter', session.host);
  showRole('Sound healer', session.liveWith);
}

Wat doet dit?liveWith bevat de naam van de sound healer die aan de opgieting deelneemt. Zodra dat veld gevuld is, activeert de app de opvallende live-stijl en bouwt ze twee afzonderlijke rolregels. Zonder liveWith blijft de gewone compacte sessieweergave behouden.

5 wijzigingen

  • ✨ Live opgietingen krijgen een eigen gouden markering in Nu & straks en in het volledige dagprogramma.
  • 🎵 Het programma vermeldt duidelijk Live opgieting + sound healing en toont een zichtbaar Live-label bij het uur.
  • 👥 Opgieter en sound healer staan voortaan als twee afzonderlijke rollen, elk met de juiste naam en profielfoto.
  • 🌍 De verduidelijking werkt in Nederlands, Frans en Engels en past zich meteen aan bij de gekozen taal.
  • 🔄 De publieke appcache is vernieuwd naar versie 19.
v1.0.26 Rechtstreekse ingang voor opgieters
Probleem / foutmelding

Opgieters die de publieke gastenapp bekeken, moesten het adres van de interne opgietplanner nog zelf kennen of opnieuw opzoeken.

Oplossing

Bij App-info staat nu een afzonderlijke link Voor opgieters die rechtstreeks naar de interne opgietplanner gaat.

Technisch

De medewerkerslink staat buiten de publieke hoofdnavigatie en gebruikt het vaste pad /opgietplanner/. De tekst volgt automatisch de gekozen taal van de gastenapp.

Technische stappen
  1. De Twig-template plaatst de medewerkerslink tussen Wat is er nieuw en de ontwikkelaarsvermelding.
  2. data-i18n koppelt het label en de knoptekst aan de bestaande taalwissel van de gastenapp.
  3. De Nederlandse, Franse en Engelse vertalingen worden vanuit dezelfde JavaScript-vertalingstabel ingevuld.
  4. De vaste route /opgietplanner/ voorkomt dat het gastenpad of een gekozen gastenpagina in het interne adres terechtkomt.
  5. Nieuwe versies van CSS en JavaScript zijn opgenomen in publieke offline-cache 18.
CodevoorbeeldHTML
<a class="staff-planner-link" href="/opgietplanner/">
  <small data-i18n="staffOnly">Voor opgieters</small>
  <strong data-i18n="openStaffPlanner">Open de interne opgietplanner</strong>
</a>

Wat doet dit?De link zelf blijft voor iedere taal identiek. Alleen de twee teksten worden bij een taalwissel vervangen. Zo gaat iedere opgieter naar dezelfde interne startpagina zonder drie verschillende templates te onderhouden.

5 wijzigingen

  • 🧖 Onderaan bij App-info staat nu ‘Voor opgieters’, duidelijk gescheiden van de navigatie voor gasten.
  • ↗️ De link opent rechtstreeks de interne opgietplanner via coonweb.com/opgietplanner/.
  • 🌍 Het label volgt Nederlands, Frans en Engels, samen met de gekozen taal van de gastenapp.
  • 📣 De interne app kondigt de nieuwe gastenapp nu ook zichtbaar aan met een rechtstreekse knop naar dit publieke programma.
  • 🔄 De publieke appcache is vernieuwd naar versie 18.
v1.0.25 Technische updates worden stap voor stap uitgelegd
Probleem / foutmelding

De technische uitleg bevatte vaak maar één korte zin en een klein codefragment. Daardoor was niet altijd duidelijk welke onderdelen samenwerken en waarom de code het probleem oplost.

Oplossing

Technische releases kunnen nu afzonderlijke stappen, een taalbadge, een meerregelig codevoorbeeld en een uitleg onder de code tonen.

Technisch

De gastenapp en interne app gebruiken hetzelfde Twig-component. Nieuwe optionele velden in de releasegegevens worden alleen getoond wanneer ze ingevuld zijn; oudere updates blijven daardoor ongewijzigd werken.

Technische stappen
  1. Het releasebestand bewaart naast probleem, oplossing en technische samenvatting nu ook een lijst met concrete technische stappen.
  2. Het gedeelde Twig-component zet die stappen om in een genummerd overzicht dat ook op kleine telefoons leesbaar blijft.
  3. codeLanguage vermeldt of het voorbeeld bijvoorbeeld JavaScript, PHP, Twig of CSS gebruikt.
  4. codeExplanation vertaalt het codefragment daarna opnieuw naar gewone taal en benoemt het praktische resultaat.
CodevoorbeeldTwig + JSON
{% if rel.technicalDetails|length %}
  <ol>
    {% for step in rel.technicalDetails %}
      <li>{{ step }}</li>
    {% endfor %}
  </ol>
{% endif %}

<pre data-language="{{ rel.codeLanguage }}">
  {{ rel.code }}
</pre>

Wat doet dit?Twig leest de extra velden uit het JSON-releasebestand. Alleen wanneer technische stappen of code aanwezig zijn, worden die onderdelen opgebouwd. Daardoor hoeven oudere releases niet aangepast te worden en blijft één component bruikbaar in beide apps.

5 wijzigingen

  • 🧩 Technische wijzigingen worden voortaan opgesplitst in begrijpelijke stappen in plaats van één korte vakterm of functienaam.
  • ⌨️ Codevoorbeelden mogen meerdere regels bevatten en vermelden de gebruikte taal, zoals JavaScript, Twig, PHP of CSS.
  • 📖 Onder ieder uitgebreid codefragment kan nu ‘Wat doet dit?’ staan, met een uitleg van de werking en het voordeel voor de gebruiker.
  • 🌍 De nieuwe vaste labels volgen Nederlands, Frans en Engels. De inhoud van de release blijft de originele ontwikkelaarsuitleg.
  • 🔄 De openbare appcache is vernieuwd naar versie 17.
v1.0.24 Compacte faselijn houdt de dagplanning overzichtelijk
Probleem / foutmelding

Wanneer een sessie de voorbereiding inging, nam de vierstappenlijn in de mobiele dagplanning te veel verticale ruimte in.

Oplossing

Op telefoons gebruikt de sessierij nu een dunne lijn met vier duidelijke punten. De actuele status blijft ernaast staan, terwijl de uitgebreide uitleg bij ‘Nu & straks’ behouden blijft.

Technisch

De mobiele lijn staat compact onderaan de sessierij en vergroot de rij nog slechts minimaal. De vier fasen blijven toegankelijk voor schermlezers.

Codevoorbeeldcode
mobiele sessierij: compacte rail · grote kaart: volledige uitleg

4 wijzigingen

  • 📱 De actuele sessie neemt in de mobiele dagplanning aanzienlijk minder hoogte in. Daardoor blijven meer volgende sessies tegelijk zichtbaar.
  • •••• De vier fasen blijven herkenbaar als een dunne bewegende lijn met vier punten. De actuele status vermeldt nog steeds wat er gebeurt.
  • 🌿 De volledige woorden en begeleidende tekst blijven bij ‘Nu & straks’ staan, waar er voldoende ruimte voor is.
  • 🔄 De openbare appcache is vernieuwd naar versie 16.
v1.0.23 Belevingslijn nu ook in de dagplanning
Probleem / foutmelding

De vier fasen waren duidelijk zichtbaar bij ‘Nu & straks’, maar nog niet rechtstreeks bij de bijbehorende sessierij in het volledige dagprogramma.

Oplossing

Een sessie die binnen dertig minuten begint, bezig is of net afgerond werd krijgt nu ook in de dagplanning een compacte lijn met Voorbereiding, Begint zo, Bezig en Herstel.

Technisch

De compacte lijn gebruikt dezelfde starttijd en sessieduur als de grote belevingskaart. Ze verschijnt alleen rond het actuele moment, zodat de rest van het programma rustig en scanbaar blijft.

Codevoorbeeldcode
scheduled → preparing → soon → live → afterglow

5 wijzigingen

  • ⏱️ De vier fasen staan nu ook rechtstreeks bij de juiste sessie in de dagplanning: Voorbereiding, Begint zo, Bezig en Herstel.
  • 📍 De voortgangslijn verschijnt vanaf dertig minuten voor de start en vult automatisch verder. Na de sessie eindigt ze rustig bij Herstel.
  • 📱 Op kleine telefoons krijgt de lijn een eigen volle rij, zodat namen, uren en fasen nergens overlappen.
  • 🌿 Toekomstige sessies blijven compact. Alleen de sessie die op dat moment aandacht nodig heeft krijgt de extra visuele begeleiding.
  • 🔄 De openbare appcache is vernieuwd naar versie 15.
v1.0.22 Nieuwe versie komt direct door in geïnstalleerde app
Probleem / foutmelding

De hosting kon het service-workerbestand zonder versienummer tijdelijk uit een oudere cache leveren. Daardoor kon een geïnstalleerde app langer op de vorige vormgeving blijven staan.

Oplossing

De gastenapp vraagt de service worker voortaan met het actuele cacheversienummer op. De nieuwste vormgeving en correcties worden daardoor onmiddellijk herkend.

Technisch

De registratie gebruikt nu sw.js?v=14 en de hoofdcode is vernieuwd naar assetversie 52.

Codevoorbeeldcode
navigator.serviceWorker.register('/thewhiteoak/sw.js?v=14');

3 wijzigingen

  • 🔄 Geïnstalleerde gastenapps herkennen de nieuwste update nu onmiddellijk. Een oudere tussen-cache van de hosting houdt de app niet langer op de vorige versie.
  • 📲 De nieuwe belevingslijn en volledige dagnamen komen daardoor ook betrouwbaar door op het startscherm.
  • ⚙️ Technisch: de service worker wordt voortaan met cacheversie 14 geregistreerd; de appcode gebruikt assetversie 52.
v1.0.21 Volledige dagnamen op kleine telefoons
Probleem / foutmelding

Op telefoons van 320 pixels breed werden woensdag en donderdag in de dagkeuze afgekapt.

Oplossing

De vier vervolgdagen staan op kleine schermen nu in twee rustige rijen. Daardoor blijven alle weekdagen volledig leesbaar en aanklikbaar.

Technisch

Alleen onder 390 pixels schakelt het vervolgrooster van vier naar twee kolommen; grotere mobiele en desktopweergaven blijven ongewijzigd.

Codevoorbeeldcode
grid-template-columns: repeat(2, minmax(0, 1fr));

3 wijzigingen

  • 📅 Woensdag en donderdag worden op de kleinste smartphones niet meer afgekapt. Alle volledige dagnamen blijven meteen herkenbaar.
  • 📱 De vier vervolgdagen staan daar voortaan in twee nette rijen. De knoppen krijgen meer breedte zonder horizontaal te moeten schuiven.
  • 🔄 De openbare appcache is vernieuwd naar versie 14, zodat ook een geïnstalleerde gastenapp deze correctie automatisch ontvangt.
v1.0.20 Van voorbereiding tot herstel als één beleving
Probleem / foutmelding

Een gast zag de eerstvolgende sessie en een aftelling, maar de voorbereiding, het bijna-startmoment, de livefase en het herstel waren nog niet verbonden in één herkenbare visuele lijn.

Oplossing

Elke eerstvolgende sessie doorloopt nu automatisch Voorbereiding, Begint zo, Bezig en Herstel. De ruimtefoto, opgieter, boodschap, beweging en voortgang veranderen samen met het juiste moment.

Technisch

De app berekent de fase lokaal uit startsAt en durationMinutes. De animaties gebruiken lichte CSS-transforms en opacity, blijven offline beschikbaar en stoppen automatisch wanneer het toestel ‘verminder beweging’ gebruikt.

Codevoorbeeldcode
scheduled → preparing → soon → imminent → live → afterglow

7 wijzigingen

  • 🕯️ Dertig minuten voor de start verschijnt ‘In voorbereiding’, gevolgd door ‘Bijna zover’, ‘Neem rustig plaats’, ‘Nu live’ en uiteindelijk ‘Herstel’.
  • 📍 Een bewegend punt en een vierstappenlijn tonen waar de sessie zich bevindt: Voorbereiding, Begint zo, Bezig of Herstel.
  • 🔥 Elke sessiesoort heeft een eigen rustige beweging op de echte ruimtefoto: opstijgende warmte, uitdeinende klankringen of een zachte beweging voor het scrubritueel.
  • 💬 De begeleidende tekst wekt nieuwsgierigheid en wordt concreter wanneer de start dichterbij komt. In de laatste vijf minuten verwijst de app rustig naar de juiste ruimte.
  • 👥 Gelijktijdige sessies blijven even groot en even opvallend. Beide gastenkeuzes doorlopen onafhankelijk dezelfde status en timing.
  • 📺 Ook het tv-scherm gebruikt deze belevingslijn met grotere tekst, terwijl alle sessies van het dagprogramma zichtbaar blijven.
  • ♿ Bij de systeeminstelling ‘verminder beweging’ worden alle animaties automatisch stilgezet. De openbare appcache is vernieuwd naar versie 13.
v1.0.19 Wat is er nieuw met uren en filters
Probleem / foutmelding

De gastenapp liet bij ‘Wat is er nieuw?’ alleen de meest recente versie zien. Het publicatie-uur, zoeken, filters en een duidelijke technische toelichting ontbraken.

Oplossing

De gastenapp gebruikt nu hetzelfde rustige releasevenster als de Opgietplanner, met alle updates van vandaag, het exacte publicatie-uur, een zoekveld en vier inhoudsfilters.

Technisch

De gastenapp laadt hetzelfde gedeelde Twig-releasecomponent als de interne app. Daardoor blijven datumselectie, filterlogica en technische velden in beide apps gelijk; de bedieningslabels volgen Nederlands, Frans of Engels.

Codevoorbeeldcode
{% include '_changelog.twig' with { changelog: guestChangelog } %}

5 wijzigingen

  • 🕘 Iedere update van vandaag toont voortaan de publicatiedatum én het exacte uur. Zo is ook bij meerdere kleine verbeteringen duidelijk welke versie het recentst is.
  • 🔎 Filter op Alles, Verbeteringen, Opgelost of Technisch en zoek rechtstreeks in de wijzigingen van vandaag. De bediening blijft compact op kleine smartphones.
  • 🧩 Nieuwe updates leggen waar nodig afzonderlijk het probleem, de oplossing en de techniek uit. Een kort codevoorbeeld kan extra inzicht geven zonder de praktische uitleg te verdringen.
  • 🌍 Knoppen, filters en zoekbediening volgen Nederlands, Frans of Engels. De volledige versiehistoriek blijft via dezelfde popup bereikbaar.
  • 🔄 De openbare appcache is vernieuwd naar versie 12, zodat geïnstalleerde gastenapps de nieuwe releaseweergave automatisch ophalen.
v1.0.18 Volgende sessie toont meteen de juiste ruimte

4 wijzigingen

  • 📷 Bij ‘Nu & straks’ staat voortaan een duidelijke foto van de ruimte waar de eerstvolgende sessie plaatsvindt. Gasten herkennen daardoor sneller waar zij verwacht worden.
  • 🕒 Het startuur en de volledige ruimtenaam staan rechtstreeks op de ruimtefoto. De sessietitel, opgieters en hun profielfoto’s behouden daarnaast een eigen rustige zone.
  • 📱 De kaart herschikt zich op kleine smartphones naar een brede ruimtefoto met de sessiegegevens eronder. Ook duo’s en twee gelijktijdige sessies blijven zonder overlap leesbaar.
  • 🔄 De openbare appcache is vernieuwd, zodat geïnstalleerde gastenapps de nieuwe ruimteweergave automatisch ophalen.
v1.0.17 Duo-foto’s staan voortaan rustig naast elkaar

4 wijzigingen

  • 👥 Twee verschillende opgieters of sound healers worden niet meer over elkaar gestapeld. Mario en Rasmus staan bij de live sessie nu als twee afzonderlijke, duidelijk herkenbare cirkels naast elkaar.
  • 📅 Dezelfde rustige fotoweergave geldt in de dagplanning, kalender en sessiedetails. Teksten behouden ook op kleine smartphones voldoende ruimte.
  • 📷 Een bestaande gezamenlijke duo-foto blijft één keer zichtbaar. Persoonlijke foto’s worden automatisch afzonderlijk getoond zodra ze beschikbaar zijn.
  • 🔄 De openbare appcache is vernieuwd, zodat geïnstalleerde apps de nieuwe fotoweergave ophalen.
v1.0.16 Volgende sessie zonder overlappende foto’s of tekst

4 wijzigingen

  • 📱 ‘Nu & straks’ is volledig herschikt voor smartphones. Het uur en de foto’s hebben een eigen kolom, terwijl titel, namen en ruimte voldoende breedte krijgen.
  • 👥 Een gezamenlijke foto van een duo verschijnt één keer. Twee verschillende profielfoto’s staan netjes naast elkaar zonder elkaar of de tekst te bedekken.
  • ⏱️ Je ziet onmiddellijk in welke fase de sessie zit: ‘Volgende sessie’, ‘Bijna zover’, ‘Neem rustig plaats’ of ‘Nu bezig’. De exacte begintijd of aftelling staat apart en blijft volledig leesbaar.
  • 🌍 De verbeterde kaart werkt ook in het Frans en Engels en de openbare appcache is vernieuwd zodat geïnstalleerde apps de correctie ophalen.
v1.0.15 Duo-profielfoto’s opnieuw zichtbaar

4 wijzigingen

  • 📷 De bestaande gezamenlijke foto van Wim en Yvonne staat opnieuw bij hun sessies en in het wellness-team. Hun aparte interne accounts en agenda’s blijven ongewijzigd.
  • 👥 De correctie werkt ook in sessiedetails en op het tv-scherm. Zodra voor een van beiden later een persoonlijke foto wordt geüpload, krijgt die automatisch voorrang.
  • ✓ Alle momenteel beschikbare profielfoto’s zijn online gecontroleerd en laden correct. Teamleden waarvoor nog geen foto werd geüpload, krijgen bewust een rustige beginletter.
  • 🔄 De openbare appcache is vernieuwd, zodat geïnstalleerde gastenapps de herstelde foto’s ophalen.
v1.0.14 Flyers gericht gepubliceerd vanuit de Opgietplanner

3 wijzigingen

  • ▣ Een flyer kan voortaan specifiek voor de gastenapp of voor beide apps worden gepubliceerd. Goedgekeurde flyers blijven compact onder ‘Nu & straks’ staan, zodat het dagprogramma rustig en overzichtelijk blijft.
  • 📊 De namen, uren en ruimtes in het gastenprogramma volgen opnieuw uitsluitend de officiële Google Spreadsheet. Tijdelijke interne wisselaanduidingen kunnen het publieke programma niet meer overschrijven.
  • 🔄 De openbare appcache is vernieuwd, zodat geïnstalleerde gastenapps deze publicatie- en planningscorrectie automatisch ophalen.
v1.0.13 Smartphonevrije wellness meteen zichtbaar

4 wijzigingen

  • 📵 De smartphonevrije wellnessregel staat nu direct onder Nu & straks op de gastenhomepage. Gasten zien de afspraak daardoor vóór flyers, dagkeuze en het verdere programma.
  • 🔒 De boodschap vermeldt duidelijk dat smartphones in een kluisje horen en alleen in de ontvangstruimte of bij de receptie gebruikt mogen worden.
  • 🌍 De prominente plaatsing werkt in Nederlands, Frans en Engels en blijft ook op de praktische pagina beschikbaar.
  • 🔄 De openbare appcache is vernieuwd, zodat geïnstalleerde gastenapps de verplaatste melding automatisch ophalen.
v1.0.12 Extra planning volledig en rustig weergegeven

5 wijzigingen

  • ◇ De kalender vermeldt alleen nog ‘Extra sessies’, zonder aantal. Zo blijft de aanduiding rustig en is meteen duidelijk dat die dag een afwijkend programma heeft.
  • 🗓️ Ook extra-planningsdagen met evenveel sessies als een gewone dag worden nu aangeduid. Daardoor zijn onder meer 7 en 15 augustus niet langer onzichtbaar als extra programma.
  • ✓ Een volledig ingevulde extra planning wordt in de gastenapp integraal overgenomen. Is de extra planning nog niet toegewezen, dan blijft voorlopig de gewone dagplanning zichtbaar zodat gasten geen sessies missen.
  • 🌍 De rustige benaming blijft gelijk in Nederlands, Frans en Engels.
  • 🔄 De openbare appcache is vernieuwd, zodat geïnstalleerde gastenapps deze correctie automatisch ophalen.
v1.0.11 Extra sessies duidelijk in de kalender

4 wijzigingen

  • ◇ Het kalenderruitje betekent voortaan ‘Extra sessies’. Het verschijnt alleen op een dag die werkelijk meer sessies bevat dan de gewone dagplanning.
  • ✓ Thema’s en gastopgieters worden niet meer als extra sessie aangeduid. Een thema behoudt zijn eigen rustige gouden ster, zodat beide betekenissen helder van elkaar gescheiden blijven.
  • 🌍 De kalenderuitleg, legenda en daglabels zijn aangepast in het Nederlands, Frans en Engels.
  • 🔄 De openbare appcache is vernieuwd, zodat geïnstalleerde gastenapps de juiste benaming en markeringen ophalen.
v1.0.10 Oud adres stuurt nu altijd meteen door

12 wijzigingen

  • ↪️ Op coonweb.com/the-white-oak wordt geen gastenpagina meer getoond. Iedere oude link gaat voortaan onmiddellijk naar hetzelfde onderdeel onder coonweb.com/thewhiteoak.
  • 📲 Ook een eerder geïnstalleerde app met het oude startadres wordt meteen naar het nieuwe adres gebracht. Er blijft geen verborgen compatibiliteitsversie van de website actief.
  • 🧹 Het oude migratiescript verwijdert achtergebleven caches en schrijft zichzelf daarna uit. Alleen de noodzakelijke doorverwijzing blijft bestaan om oude favorieten en QR-links niet in een foutpagina te laten eindigen.
  • 🗑️ De oude websitebestanden, schermpagina en oude posterbestanden zijn van de server verwijderd. De actuele app en materialen bestaan uitsluitend nog onder /thewhiteoak/.
  • ✦ Thema’s en bijzondere opgietmomenten zijn voortaan herkenbaar in de wellnesskalender. Een rustige gouden ster markeert een themadag en een warm ruitje duidt een werkelijk bijzonder opgietmoment aan.
  • 🗓️ De kalender blijft bewust rustig. Gewone opgietsessies en de vaste dagelijkse live samenwerking krijgen geen extra symbool; badkledingdagen behouden hun groene vlak en de volledige betekenis verschijnt na het aanklikken van de datum.
  • 🌍 De nieuwe kalenderlegenda en daglabels zijn beschikbaar in Nederlands, Frans en Engels. Bekende themacodes zoals ROTS verschijnen bovendien met hun volledige publieksnaam.
  • 📺 Na de laatste sessie verandert het tv-scherm voortaan in een rustige visuele dagafsluiting. Echte beelden van het gebouw, zwembad, Panorama Sauna en de klankruimte wisselen subtiel af naast het volledige dagprogramma.
  • 🖼️ Het grote tekstblok is vervangen door één korte afsluitzin en drie heldere herstelwoorden. De foto’s krijgen de hoofdrol, terwijl alle sessies rechts zichtbaar blijven.
  • ✓ Herhaalde labels ‘Voltooid’ verdwijnen zodra de hele dag is afgerond. De planning blijft daardoor leesbaar vanop afstand zonder elf keer dezelfde status te tonen.
  • 🤝 De team-, gast- en herstelboodschappen onderaan zijn korter gemaakt. Ze wisselen rustig af naast de QR-code en blijven beschikbaar in Nederlands, Frans en Engels.
  • 🔄 De openbare appcache is vernieuwd, zodat tv-schermen de nieuwe fotoafsluiting automatisch ophalen.
v1.0.9 Korter vast adres zonder gebroken links

6 wijzigingen

  • 🔗 Het vaste adres van de gastenapp is voortaan coonweb.com/thewhiteoak. De kortere link is makkelijker te onthouden, over te typen en te gebruiken op drukwerk.
  • ↪️ Het eerdere adres met koppeltekens blijft automatisch doorsturen. Bestaande favorieten, gedeelde berichten en eerder geïnstalleerde apps blijven daardoor bruikbaar.
  • 📲 De app-identiteit, startpagina, installatieruimte en offline-cache gebruiken nu allemaal hetzelfde korte adres. The White Oak blijft technisch volledig gescheiden van de interne Opgietplanner.
  • 🖥️ Ook het tv-scherm, de versiehistoriek, posterpagina en alle links op Coonweb verwijzen naar het nieuwe adres. Gasten komen vanuit iedere ingang op dezelfde plaats terecht.
  • ▦ De QR-code en alle A5-, A4- en A3-materialen zijn opnieuw opgebouwd. Zowel de scaninhoud als het zichtbare webadres verwijst rechtstreeks naar coonweb.com/thewhiteoak.
  • 🧹 Een speciale migratie ruimt de oude openbare appcache gecontroleerd op. Zo blijven verouderde startpagina’s niet hangen na de adreswijziging.
v1.0.8 Rustiger live overzicht en actuele aankondigingen

30 wijzigingen

  • 🕰️ De homepage begint voortaan met één helder overzicht ‘Nu & straks’. De grote dubbele sessiepresentatie is vervangen door een rustige tijdlijn met uur, volledige naam, ruimte en actuele status.
  • ↔️ Gelijktijdige sessies krijgen exact dezelfde vorm en visuele aandacht. Zo lijkt geen van beide belevingen belangrijker wanneer gasten op hetzelfde uur kunnen kiezen.
  • ⏱️ De sessiedetails vermelden de verwachte duur. Sound healing staat daar als 30–45 minuten aangeduid; opgiet- en scrubsessies tonen hun passende duurtijd.
  • 👤 Profielfoto’s en volledige begeleidersnamen staan duidelijker in de live tijdlijn en sessiedetails. Bij live samenwerkingen blijven beide namen zichtbaar.
  • 💧 Na een afgeronde sessie verschijnt automatisch een compact hersteloverzicht met afkoelen, water drinken, iets eten en voldoende rust.
  • 📶 Online en offline status zijn nu meteen zichtbaar. Bij wegvallende verbinding blijft het laatst geladen programma beschikbaar en ziet de gast dat de app offline werkt.
  • 🗓️ De rustige maandkalender blijft badkledingdagen als belangrijkste uitzondering markeren, met de legenda direct onder de kalender en begeleiders in het geopende dagoverzicht.
  • ✨ Bewegingen zijn beperkt tot betekenisvolle momenten: een rustige statuspuls wanneer een sessie bijna begint of bezig is en een zachte overgang bij wisselende welkomstboodschappen.
  • ⚡ De grote sfeerheader is compacter gemaakt, waardoor het actuele programma en alle zeven dagknoppen op kleine smartphones sneller in beeld komen.
  • 🔎 De welkomstzin blijft op ieder uur boven de lichte delen van de wellnessfoto goed leesbaar, met iets meer beeldcontrast zonder de foto donker of zwaar te maken.
  • 🖥️ De planning op het tv-scherm is vanop afstand veel duidelijker leesbaar. Uren, profielfoto’s, volledige namen, sessietypes en ruimtes zijn aanzienlijk vergroot.
  • 📋 Het tv-scherm toont opnieuw alle sessies van de dag tegelijk. De indeling is volledig herschikt naar drie brede kolommen, zodat uur, profielfoto, volledige naam, sessietype en ruimte leesbaar blijven zonder door het programma te bladeren.
  • 🟢 Lopende, bijna startende en eerstvolgende sessies vallen duidelijk op binnen het volledige overzicht. Gelijktijdige sessies staan naast elkaar en behouden exact dezelfde afmetingen en aandacht.
  • 🧹 De afzonderlijke ontvangstmodus is verwijderd. De gewone gastenapp, het duidelijke tv-scherm en de posters met QR-code blijven beschikbaar.
  • ↔ Een lastminutewissel van opgieter kan nu onmiddellijk zichtbaar worden gemaakt. De gastenapp en het tv-scherm tonen de vervanger zonder te wachten tot de manager de Google Spreadsheet bijwerkt.
  • ▣ Een actuele flyer kan compact onder ‘Nu & straks’ verschijnen. De aankondiging blijft rustig in de pagina en opent pas volledig wanneer een gast bewust op ‘Bekijk flyer’ tikt.
  • 🌍 De flyerknop en begeleidende tekst volgen Nederlands, Frans en Engels. Verlopen flyers verdwijnen automatisch uit de gastenapp.
  • 🔄 De openbare appcache is vernieuwd naar versie 17, zodat geïnstalleerde apps de nieuwe planning en flyerweergave ophalen.
  • 🖥️ Het tv-scherm heeft een volledig nieuwe professionele schermindeling. De actuele of eerstvolgende sessie staat groot links met een echte foto van de ruimte; alle sessies blijven rechts tegelijk zichtbaar.
  • 🔠 Uren, begeleiders, sessietypes en ruimtes zijn opnieuw vergroot en herschikt voor leesbaarheid op kijkafstand. Het dagprogramma loopt chronologisch van boven naar onder in twee brede kolommen en lange namen worden niet afgekapt.
  • ↔️ Twee gelijktijdige sessies krijgen een eigen, even grote livepresentatie. Beide foto's, uren, namen, ruimtes en duurtijden verschijnen naast het volledige dagoverzicht met exact dezelfde aandacht.
  • ✨ Rustige beweging ondersteunt voortaan de actuele status. Ruimtefoto's bewegen heel subtiel, warmte stijgt op wanneer een sessie bijna begint of bezig is en de live-aanduiding ademt zonder het programma druk te maken.
  • 🔄 De openbare appcache is vernieuwd naar versie 18, zodat tv-schermen en geïnstalleerde apps de nieuwe schermopmaak onmiddellijk ophalen.
  • 🎛️ Vaste intensiteitslabels zoals ‘zacht’, ‘gemiddeld’ en ‘intens’ zijn uit de gastenapp verwijderd. De opgieter bepaalt zelf de concrete opbouw en intensiteit van iedere sessie; de sessiedetails tonen daarom alleen objectieve informatie zoals duur, ruimte, prijs en capaciteit.
  • 🔄 De openbare appcache is vernieuwd naar versie 19, zodat ook geïnstalleerde gastenapps de aangepaste sessie-informatie meteen ophalen.
  • 🧹 Ook de duurtijd in minuten is uit de overzichten verwijderd. ‘Nu & straks’ en het volledige dagprogramma tonen voortaan alleen uur, sessie, begeleider, ruimte en actuele status; de verwachte duur blijft beschikbaar in het sessiedetail.
  • 🔄 De openbare appcache is vernieuwd naar versie 20, zodat het vereenvoudigde overzicht meteen op geïnstalleerde gastenapps verschijnt.
  • 🟢 Een sessie die bezig is, krijgt nu een veel duidelijkere aanduiding ‘Nu live’. Een rustige bewegende indicator trekt de aandacht zonder het programma onnodig druk te maken.
  • ✨ Iedere live sessie vertelt kort wat er op dat moment gebeurt en in welke ruimte. Opgietingen, sound healing en scrubrituelen krijgen elk een passende boodschap; gelijktijdige sessies behouden exact dezelfde aandacht.
  • 🔄 De openbare appcache is vernieuwd naar versie 21, zodat ook geïnstalleerde gastenapps de nieuwe live-aanduiding onmiddellijk ophalen.
v1.0.7 Duidelijk waarvoor het gastenprogramma dient

14 wijzigingen

  • ⚠️ De tijdelijke pagina op het oude gastenadres vermeldt nu duidelijk dat deze link binnenkort wordt verwijderd. De nieuwe vaste link staat zichtbaar en aanklikbaar op de pagina.
  • 📱 Bezoekers lezen precies waarom installeren vroeger mislukte: Android en Chrome herkenden het gastenprogramma onder /opgietplanner als dezelfde app als de interne medewerkersplanner.
  • ✅ Ook de oplossing staat helder beschreven. The White Oak heeft nu een eigen app-identiteit, startadres, manifest, service worker en offline-cache.
  • 🔗 De pagina stuurt niemand automatisch door. Bezoekers kiezen zelf de enige bestemmingslink naar het nieuwe gastenprogramma.
  • 🌍 De uitgebreide uitleg is beschikbaar in Nederlands, Frans en Engels.
  • ℹ️ Op het oude adres staat geen planning of andere gastenfunctie meer. De tijdelijke pagina bevat alleen de volledige uitleg over het installatieconflict en de link naar coonweb.com/the-white-oak/.
  • ✉️ Een persoonlijke melding van Koen legt uit waarom het oude adres nog kort beschikbaar blijft: de link was al naar de manager gestuurd. De pagina sluit af met ‘Groetjes, Koen’.
  • 🌳 Na installatie heet de app nu overal ‘The White Oak’. De manifestnaam, korte Android-naam en iPhone-/iPad-titel zijn gelijkgetrokken naar de volledige naam.
  • 🌙 Na de laatste sessie blijft geen afgeronde sessie meer als actueel moment staan. De app en het tv-scherm schakelen automatisch over naar een rustige dagafsluiting.
  • 🤝 De dag eindigt met een dankwoord voor het wellness-team en de gasten, aangevuld met een warm levensmotto.
  • 💧 Na iedere sessie staat het volledige hersteladvies klaar: voldoende en geleidelijk afkoelen, water drinken, iets voedzaams eten en genoeg rust nemen.
  • ℹ️ De tijdelijke pagina vermeldt nu duidelijk dat dit niet de officiële website van The White Oak is. Het nieuwe adres is uitsluitend de vaste link naar het gastenprogramma.
  • 📅 De inhoud wordt nu exact benoemd: actuele opgiet-, scrub- en soundhealingsessies voor vandaag, de komende dagen, per maand en live op het informatiescherm.
  • 🔎 De titel en zoekbeschrijving noemen het voortaan een opgiet- en sessieprogramma, zodat er geen verwarring ontstaat met de algemene wellnesswebsite.
v1.0.6 Heldere uitleg bij het oude gastenadres

4 wijzigingen

  • ℹ️ Bezoekers van het eerder gedeelde adres krijgen nu een rustige tussenpagina die uitlegt waarom The White Oak naar een apart openbaar adres verhuisde.
  • 📱 De reden wordt in gewone taal uitgelegd: de interne medewerkersapp en de openbare gastenapp moeten op Android en Chrome afzonderlijk geïnstalleerd kunnen worden.
  • 🔗 Vanuit de uitlegpagina kan men rechtstreeks naar de gastenapp of naar Posters & QR-materiaal. De bestaande link blijft dus bruikbaar.
  • 🌍 De uitleg is volledig beschikbaar in Nederlands, Frans en Engels.
v1.0.5 Posters en QR-materiaal op een vast adres

3 wijzigingen

  • 🪧 Alle printmaterialen staan voortaan samen op coonweb.com/the-white-oak/poster: de A5-receptiekaart, A4- en A3-ingangsposters en de PNG-versie.
  • ↪️ Oude poster- en PDF-links blijven automatisch werken en verwijzen naar hetzelfde bestand op het nieuwe openbare adres.
  • 📥 Onder Praktisch staat een nieuwe knop ‘Posters & QR-code’. De naam en uitleg van deze downloadknop volgen de gekozen taal in de gastenapp.
v1.0.4 Oude gastenlink blijft herkenbaar werken

3 wijzigingen

  • ↪️ Het eerder gedeelde gastenadres blijft bezoekers automatisch naar The White Oak brengen. Bestaande berichten, favorieten en links hoeven niet aangepast te worden.
  • ℹ️ Bezoekers via het oude adres zien nu kort waarom de app verhuisde: het openbare wellnessprogramma en de interne medewerkersapp moeten afzonderlijk installeerbaar blijven.
  • 🌍 De adresmelding volgt de gekozen taal en is volledig beschikbaar in Nederlands, Frans en Engels.
v1.0.3 The White Oak is nu echt een aparte app

4 wijzigingen

  • 📲 The White Oak is verhuisd naar coonweb.com/the-white-oak. Android en Chrome zien de app daardoor niet langer als onderdeel van de reeds geïnstalleerde opgietplanner.
  • ↪️ De vorige gastenlink blijft werken en stuurt automatisch door, zodat bestaande favorieten en gedeelde links niet verloren gaan.
  • 📶 De app heeft voortaan een volledig eigen installatiebereik en offline-cache. Oude installatieregistraties worden automatisch opgeruimd.
  • 🖥️ De tv-schermmodus en QR-materialen gebruiken voortaan eveneens het nieuwe publieke adres.
v1.0.2 De app heet The White Oak

2 wijzigingen

  • 🌳 De gastenapp heet voortaan officieel ‘The White Oak’. Deze naam omvat naast opgietsessies ook sound healing, scrubsessies en praktische wellnessinformatie.
  • 📱 Op een klein startscherm staat het compacte label ‘White Oak’, zodat de naam volledig en professioneel zichtbaar blijft.
v1.0.1 Gastenapp apart installeerbaar

4 wijzigingen

  • 📲 De gastenapp kan nu naast de interne opgietplanner op hetzelfde toestel worden geïnstalleerd. Beide apps hebben voortaan een eigen vaste identiteit en vervangen elkaar niet meer.
  • ✅ ‘Reeds geïnstalleerd’ verschijnt alleen nog voor de gastenapp zelf. Wanneer het gastenprogramma vanuit de opgietplanner wordt bekeken, blijft de juiste installatiehulp beschikbaar.
  • 🏷️ Na installatie staat de gastenapp herkenbaar als ‘WO Gasten’ op het startscherm.
  • 📶 De offline-cache van de gastenapp blijft behouden wanneer de interne opgietplanner wordt bijgewerkt.
v1.0.0 Het wellnessprogramma voor gasten

23 wijzigingen

  • 🌿 De eerste zelfstandige gastenapp is beschikbaar. Gasten bekijken het actuele wellnessprogramma zonder toegang tot persoonlijke agenda’s of interne planning.
  • 📶 De laatst geladen planning blijft offline beschikbaar nadat de gastenapp eenmaal met internet werd geopend.
  • 🌍 Het volledige programma is beschikbaar in Nederlands, Frans en Engels, inclusief sessiedetails en praktische wellnessinformatie.
  • 📸 Opgieters en sound healers verschijnen met hun profielfoto. Bij duo’s en live samenwerkingen worden beide begeleiders getoond.
  • 🗓️ De interactieve wellnesskalender toont de huidige en volgende maand. Een geopende dag vermeldt alle uren, ruimtes en begeleiders.
  • 🩱 Badkledingdagen vallen duidelijk op in de dagweergave en maandkalender.
  • ↔️ Gelijktijdige sessies krijgen evenveel aandacht, zodat gasten bewust tussen beide belevingen kunnen kiezen.
  • 🎶 Live samenwerkingen vermelden duidelijk met wie de opgieter samenwerkt, samen met beide profielfoto’s wanneer die beschikbaar zijn.
  • ⏳ Aankomende en lopende sessies reageren rustig mee met het moment. Een aftelling, live status en passende sfeerbeweging maken de start herkenbaar.
  • ✅ Afgeronde sessies zijn herkenbaar en standaard ingeklapt. Ze kunnen indien nodig opnieuw worden getoond.
  • 📵 De smartphonevrije wellnessregel staat duidelijk vermeld. Toestellen horen in een kluisje en mogen alleen bij de receptie of in de ontvangstruimte worden gebruikt.
  • 🖥️ Een aparte schermmodus is beschikbaar voor tv en informatieschermen, standaard in het Nederlands en met aandacht voor de actuele sessies.
  • 🪧 Printklare QR-materialen zijn beschikbaar voor ingang en receptie in A3, A4 en A5.
  • 🗂️ App-info heeft een volledige versiehistoriek met publicatiedatum, exact uur en alle wijzigingen per versie.
  • 🧴 Scrubsessies tonen de juiste praktische informatie: vooraf inschrijven bij de receptie, geen handdoek nodig, prijs en maximumaantal gasten.
  • 🎵 Bij sound healing staat correct dat de smartphone vooraf in een kluisje moet, niet dat het toestel alleen op stil moet staan.
  • 🌿 De ontwikkelaarsvermelding luidt ‘Ontwikkeld door opgieter Koen Van den Bossche (Coonweb)’, samen met het aanklikbare Coonweb-logo.
  • 🔢 De gastenapp heeft voortaan een eigen versiereeks. Versie 1.0.0 staat los van de interne opgietplanner en bevat uitsluitend wijzigingen die voor gasten relevant zijn.
  • 📷 Bij App-info staat nu de kleine profielfoto van opgieter Koen Van den Bossche, gevolgd door zijn naam en het aanklikbare Coonweb-logo.
  • 📅 Iedere dag toont voortaan de volledige weekdag. Ook Vandaag, Morgen en Overmorgen vermelden bijvoorbeeld woensdag, donderdag en vrijdag; op het tv-scherm staat de volledige weekdag en datum nu eveneens boven het dagprogramma.
  • 🌿 Badkledingdagen hebben voortaan een rustige mosgroene uitstraling. De melding, maandkalender en het tv-scherm blijven duidelijk herkenbaar zonder de harde rode kleur.
  • 🎵 Timo, Rasmus, Eef, Barbara en Alan worden correct uitsluitend als sound healer getoond. Het onjuiste extra label ‘opgieter’ is bij deze vijf teamleden verwijderd.
  • 📷 Bij de ontwikkelaarsvermelding staat nu dezelfde actuele profielfoto als in Koen zijn opgietersprofiel. De oude buitenfoto wordt niet meer gebruikt.