source: Klonkt/src/assets/js/ward-theme.js@ 39dab6b

Last change on this file since 39dab6b was 39dab6b, checked in by Robin <roboburr@…>, 3 months ago

Ward-PWA: de mini-speler, de themakleur en een breder kaartraster

Drie dingen in een ronde.

DE THEMAKLEUR (SkyPalette). De acht presets en de luminantie-regel komen
LETTERLIJK uit Shaer: dezelfde kleuren, en dezelfde beslissing welke
tekst erop leesbaar is (donker op zon, wit op nacht). Een handgehouden
lijstje zou uit de pas lopen; luminantie beslist. De keuze kleurt het
accent (knoppen, bubbels, de (+)), tint de achtergrond zacht, en laat de
hemel zijn placeholder-schijfjes bijkleuren. Opgeslagen per apparaat.

DE MINI-SPELER. Een feed-kaart rendert een gewone audio, maar de feed
wordt bij elke verversing opnieuw getekend en dan sterft dat element:
de muziek stopt midden in een nummer. Daarom is er EEN blijvende speler
buiten de feed; een audiotegel geeft alleen zijn bron door (gevangen in
de capture-fase) en pauzeert zichzelf. Zo overleeft het geluid een
herteken en een wissel naar de hemel, precies als in de app.

HET KAARTRASTER (Robins wens, 12-8). Op desktop net als op mobiel en
tablet MEER kolommen: auto-fill met een minimum van 280px vult zelf op,
een op een smalle telefoon, twee op een tablet, drie of meer breed.

New file:
src/assets/js/ward-theme.js

  • presets, onSky (luminantie), load/save/apply

Changed files:
src/assets/js/ward.js

  • wireTheme (swatches), wireMiniPlayer (gedeelde audio)
  • de hemel skint bij op een themawissel

src/assets/js/ward-sky.js

  • buildAtlas neemt het accent; reskin() bij een kleurwissel

src/views/pages/ward.ejs

  • themaknop, themadialoog, mini-speler-balk

src/assets/css/ward.css

  • accent/achtergrond als variabelen, mini-speler, swatches, responsief raster (auto-fill minmax 280px)

src/services/i18n.js

  • kleur + play/pause in nl, en, de

test/ward-theme.test.js

  • acht presets, en de tekstkleur volgt luminantie

remarks: 905 tests groen. Slepen en het echt doorspelen van audio zijn
in code getest, niet met oor en vinger; dat is aan Robin op dev.

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

  • Property mode set to 100644
File size: 2.2 KB
RevLine 
[39dab6b]1/**
2 * De themakleur (SkyPalette): één gekozen kleur die de hele ward kleurt.
3 *
4 * De acht presets en de luminantie-regel komen LETTERLIJK uit Shaer (iOS is de
5 * bron): dezelfde kleuren, en dezelfde beslissing welke tekst erop leesbaar is
6 * (donker op licht, wit op de rest). Een handgehouden lijstje zou uit de pas
7 * gaan lopen; luminantie beslist.
8 *
9 * Opgeslagen in localStorage, per apparaat, net als in de app.
10 */
11'use strict';
12
13export const PRESETS = [
14 0x5A32E6, // paars, de vertrouwde
15 0x1E6AE1, // oceaan
16 0x0E9B8A, // zeegroen
17 0x2E7D32, // bos
18 0xF59E0B, // zon
19 0xFF6B4A, // koraal
20 0xE255A1, // roze
21 0x1F2937, // nacht
22];
23const FALLBACK = 0x5A32E6;
24const KEY = 'ward.skyColor';
25
26const hex = (rgb) => '#' + rgb.toString(16).padStart(6, '0');
27
28/** Wit of donker, wat leesbaar is op deze kleur. Zelfde som als in de app. */
29export function onSky(rgb) {
30 const r = ((rgb >> 16) & 0xff) / 255;
31 const g = ((rgb >> 8) & 0xff) / 255;
32 const b = (rgb & 0xff) / 255;
33 const lum = 0.2126 * r + 0.7152 * g + 0.0722 * b;
34 return lum > 0.5 ? '#1f2430' : '#ffffff';
35}
36
37/** De opgeslagen kleur, of de vertrouwde paarse als er nog niets gekozen is. */
38export function loadColor() {
39 const v = parseInt(localStorage.getItem(KEY) || '', 10);
40 return Number.isFinite(v) && v >= 0 && v <= 0xffffff ? v : FALLBACK;
41}
42
43/**
44 * De kleur toepassen: het accent dat de knoppen, de bubbels en de (+) dragen,
45 * plus een zachte tint over de donkere achtergrond zodat de hele hemel de
46 * gekozen kleur ademt. De tekst-op-accent volgt de luminantie.
47 */
48export function applyColor(rgb) {
49 const root = document.documentElement.style;
50 root.setProperty('--accent', hex(rgb));
51 root.setProperty('--on-accent', onSky(rgb));
52 // De achtergrond blijft donker (leesbaar), maar krijgt een vleugje van de
53 // kleur: een verticale gradient van de getinte nacht naar bijna zwart.
54 const r = (rgb >> 16) & 0xff, g = (rgb >> 8) & 0xff, b = rgb & 0xff;
55 const tint = (f) => `rgb(${Math.round(r * f + 20 * (1 - f))},${Math.round(g * f + 26 * (1 - f))},${Math.round(b * f + 36 * (1 - f))})`;
56 root.setProperty('--bg-top', tint(0.22));
57 root.setProperty('--bg-bottom', tint(0.06));
58}
59
60export function saveColor(rgb) {
61 localStorage.setItem(KEY, String(rgb));
62 applyColor(rgb);
63}
Note: See TracBrowser for help on using the repository browser.