From 15f93e62275569015c365d095a1faad76b282a23 Mon Sep 17 00:00:00 2001 From: Adica Date: Fri, 3 Jul 2026 17:34:30 +0300 Subject: [PATCH 1/2] Phase 3: split the DOM glue layer into single-responsibility modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pure code movement — no behavior change, proven by the untouched e2e suite. script.ts (757 lines) becomes: - dom.ts el() helper + shared element references - labels.ts user-facing texts (single source of truth) - cloudinary.ts status image URLs + offline pre-cache - storage.ts last-station persistence - soundEffects.ts audioInstance (blob preload, warmUp, ensure) + cache - mediaSession.ts Now Playing metadata/handlers + iOS re-registration - serviceWorker.ts registration + deferred idle-time reload - theme.ts prefers-color-scheme theme color - stationSelector.ts accessible listbox, reports picks via onSelect() - main.ts entry point: wiring only, same execution order Notable seams: - the core<->mediaSession cycle is resolved by explicit injection (initMediaSession before createRadioCore, connectMediaSessionCore after) instead of a mutable let; - mediaSession no longer calls into serviceWorker — main composes updateMediaSession + maybeReloadForPendingServiceWorkerUpdate in the deps, preserving the original order. Bundle output unchanged (single js/index.js chunk), so sw.js APP_SHELL needs no bump. Typecheck clean, 63/63 unit, 37/37 e2e untouched, full production-preview smoke passing. Co-Authored-By: Claude Fable 5 --- plan.md | 42 ++- src/index.html | 2 +- src/js/cloudinary.ts | 27 ++ src/js/dom.ts | 28 ++ src/js/labels.ts | 6 + src/js/main.ts | 217 +++++++++++ src/js/mediaSession.ts | 139 +++++++ src/js/script.ts | 757 -------------------------------------- src/js/serviceWorker.ts | 64 ++++ src/js/soundEffects.ts | 146 ++++++++ src/js/stationSelector.ts | 190 ++++++++++ src/js/storage.ts | 14 + src/js/theme.ts | 18 + 13 files changed, 891 insertions(+), 759 deletions(-) create mode 100644 src/js/cloudinary.ts create mode 100644 src/js/dom.ts create mode 100644 src/js/labels.ts create mode 100644 src/js/main.ts create mode 100644 src/js/mediaSession.ts delete mode 100644 src/js/script.ts create mode 100644 src/js/serviceWorker.ts create mode 100644 src/js/soundEffects.ts create mode 100644 src/js/stationSelector.ts create mode 100644 src/js/storage.ts create mode 100644 src/js/theme.ts diff --git a/plan.md b/plan.md index 2b85ba7..c9e631d 100644 --- a/plan.md +++ b/plan.md @@ -142,6 +142,31 @@ SW-urile NU raman "pe viata": no-cache + reg.update() + skipWaiting/claim + stergerea cache-urilor radio-* vechi la activate. Forcarea invalidarii la useri = bump la cele 3 constante de versiune (facut: app-v3/images-v3/sounds-v2). +## Episodul handoff/carry (PR #41 — REVERTAT integral, decizia lui Adrian) + +S-a construit si VERIFICAT PE IPHONE un mecanism care facea sunetul de eroare +audibil din prima pe lock screen (handoff cu stop amanat + "carry": elementul +de loading isi schimba src-ul la tonul de eroare). Revertat pentru ca +contrazice filozofia proiectului: state machine = precizie, fara sunete +suprapuse, fara coordonare event-driven estimata in stratul DOM. + +Cunostinte castigate (valabile, de refolosit): +- iOS in background REFUZA orice pornire proaspata de element audio, dar + PERMITE unui element care deja canta sa-si schimbe src si sa continue. +- Web Audio API a fost deja incercat si revertat istoric (69a58f2): iOS + pierde sesiunea fara un