v2026.5.44 — variables CSS dynamiques (--topbar-bg/text/font/height) + helpers Apparence + verdicts ghost + refresh séquentiel/abort
+81
@@ -170,6 +170,87 @@ Côté `background.js`, tous les hardcodes runtime ont été remplacés par des
|
|||||||
| `textZoom` | `-2..+2` | Niveau de zoom du texte | v2026.5.39 |
|
| `textZoom` | `-2..+2` | Niveau de zoom du texte | v2026.5.39 |
|
||||||
| `cacheDays` | number | Durée de rétention du cache (défaut 7) | v2026.5.39 |
|
| `cacheDays` | number | Durée de rétention du cache (défaut 7) | v2026.5.39 |
|
||||||
| `dayStart` / `dayEnd` | number | Plage horaire de la timeline (défaut 8-18) | v2026.5.39 |
|
| `dayStart` / `dayEnd` | number | Plage horaire de la timeline (défaut 8-18) | v2026.5.39 |
|
||||||
|
| `closedStatus` / `resolvedStatus` / `cancelledStatus` / `suspendedStatus` | `[string]` | Statuts EV reconnus pour les verdicts (matching insensible casse/accents/conjugaisons) | v2026.5.44 |
|
||||||
|
| `topbarColor` | string `#rrggbb` | Couleur de fond de la topbar (vide = défaut thème) | v2026.5.44 |
|
||||||
|
| `appFont` | string | Identifiant de police (cf. `APP_FONT_OPTIONS`) appliquée à toute la page | v2026.5.44 |
|
||||||
|
|
||||||
`localStorage["view_mode"]` : `classic` ou `horizontal` (depuis v2026.5.32).
|
`localStorage["view_mode"]` : `classic` ou `horizontal` (depuis v2026.5.32).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Variables CSS dynamiques (v2026.5.44)
|
||||||
|
|
||||||
|
Posées sur `:root` ou `html` par JS, lues partout dans le CSS :
|
||||||
|
|
||||||
|
| Variable | Source | Rôle |
|
||||||
|
|---|---|---|
|
||||||
|
| `--topbar-bg` | `_applyTopbarColor(color)` depuis `cfg.topbarColor` | Fond de la topbar (et de la sidebar en horizontal). Vide = `--bg-elevated` du thème |
|
||||||
|
| `--topbar-text` | `_applyTopbarColor` calcule via `_readableTextOn(color)` (luminance pondérée 0.299·r + 0.587·g + 0.114·b) | Couleur du texte topbar — blanc si fond foncé, foncé si fond clair |
|
||||||
|
| `--app-font` | `_applyAppFont(val)` depuis `cfg.appFont` (mappe sur `_appFontStack`) | Stack `font-family` appliquée à `body` (cascade vers toute la page) |
|
||||||
|
| `--topbar-height` | `_initTopbarHeightVar()` via `ResizeObserver` sur `header.topbar` | Hauteur réelle de la topbar — utilisée par les éléments sticky en dessous (`.session-banner`, `.progress-bar`, `.session-slide-alert`) pour leur `top:` |
|
||||||
|
| `--text-scale` / `--zoom-factor` | `_applyTextZoom(level)` depuis `cfg.textZoom` | Multiplicateurs du zoom texte (existants depuis v2026.5.39, listés ici pour complétude) |
|
||||||
|
|
||||||
|
Classe `html.has-topbar-color` (toggle JS dans `_applyTopbarColor`) active les règles `color-mix` translucides sur les boutons / today-block / date-custom de la topbar et de la sidebar horizontale, pour qu'ils restent lisibles sur n'importe quel fond.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Helpers d'apparence (v2026.5.44)
|
||||||
|
|
||||||
|
| Fonction (`viewer.js`) | Rôle |
|
||||||
|
|---|---|
|
||||||
|
| `APP_FONT_OPTIONS` | Tableau des 28 stacks de police proposés dans le panel admin |
|
||||||
|
| `_appFontStack(val)` | Retourne le stack `font-family` correspondant à un identifiant |
|
||||||
|
| `_hexToLuminance(hex)` | Calcule la luminance perçue (0..1) d'une couleur hex (#rgb ou #rrggbb) |
|
||||||
|
| `_readableTextOn(hex)` | Retourne `#1a1f2b` ou `#ffffff` selon contraste optimal |
|
||||||
|
| `_applyTopbarColor(color)` | Pose `--topbar-bg`, `--topbar-text` et toggle `html.has-topbar-color` |
|
||||||
|
| `_applyAppFont(val)` | Pose `--app-font` sur `:root` |
|
||||||
|
| `_initTopbarStyleFromConfig()` | Lit `cfg.topbarColor` + `cfg.appFont` (avec fallback `cfg.topbarFont`) au boot et applique |
|
||||||
|
| `_initTopbarHeightVar()` | Démarre le `ResizeObserver` qui maintient `--topbar-height` à jour |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Helpers de verdict ghost (v2026.5.44 — refonte)
|
||||||
|
|
||||||
|
Dans `analyzeOneDisappearedIv()` :
|
||||||
|
|
||||||
|
| Verdict (`iv._disappearStatus`) | Décision | Rendu UI |
|
||||||
|
|---|---|---|
|
||||||
|
| `terminated-clos` | KEEP | Carte **verte** + ✓✓ |
|
||||||
|
| `terminated-pending` | KEEP | ✓ gris « Fait » |
|
||||||
|
| `terminated-suspended` | KEEP | ✓ jaune « Suspendu » + barre verte (horizontal) |
|
||||||
|
| `closed` / `terminated` | KEEP | Carte verte + ✓✓ |
|
||||||
|
| `cancelled` / `cancelled-reservation` / `cancelled-absence` | REMOVE | (retiré silencieusement en PROD ; loggé en mode diagnostic) |
|
||||||
|
| `error` | KEEP (silent) | Inchangé |
|
||||||
|
| `fiche_tronquee` | KEEP (silent) | Inchangé |
|
||||||
|
|
||||||
|
Helpers de matching (`_normalizeStatus`, `_stemStatus`, `_statusMatchesAny`) : permettent à l'utilisateur de saisir ses statuts EV en français normal (« Clôturé », « clôture », « Clos », « clôs », « Suspendu : Attente info »…) avec matching tolérant aux variations casse/accents/conjugaisons via lowercase + suppression diacritiques + strip suffixes verbaux courants.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Refresh séquentiel + abort (v2026.5.44)
|
||||||
|
|
||||||
|
`background.js` :
|
||||||
|
|
||||||
|
```js
|
||||||
|
const _evFetchControllers = new Set(); // registre global des AbortController en vol
|
||||||
|
function _abortAllEvFetches() { // appelé sur message "abortAllFetches"
|
||||||
|
for (const c of _evFetchControllers) {
|
||||||
|
try { c.abort(); } catch (e) { /* ignore */ }
|
||||||
|
}
|
||||||
|
_evFetchControllers.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function evFetch(url, origin, opts = {}) {
|
||||||
|
let controller = null;
|
||||||
|
if (!opts.signal) {
|
||||||
|
controller = new AbortController();
|
||||||
|
_evFetchControllers.add(controller);
|
||||||
|
}
|
||||||
|
// ... fetch avec signal
|
||||||
|
try { return await fetch(url, fetchOpts); }
|
||||||
|
finally { if (controller) _evFetchControllers.delete(controller); }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`viewer.js` envoie `{type: "abortAllFetches"}` au service worker quand l'utilisateur clique « ✕ Arrêter ». Tous les fetch EV en vol sont avortés instantanément (avant la complétion). Le state `state.refreshAborted` interrompt aussi la boucle séquentielle au prochain `await`.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user