import { DOCUMENT } from '@angular/common'; import { Injectable, inject, signal } from '@angular/core'; /** * Gestiona la preferencia de tipografía OpenDyslexic. * * Es la "costura" de accesibilidad: aplica (o quita) el atributo * `data-dyslexia-font` en el elemento , que es el interruptor que el * fichero de tokens (_theme.scss) usa para alternar entre OpenDyslexic y las * tipografías de marca del handoff (Fredoka/Nunito). * * Decisión de producto (Fase 1): OpenDyslexic activada POR DEFECTO y aplicada a * TODO el texto. Es una preferencia por niño; de momento se persiste en * localStorage. En la Fase 5 esta preferencia pasará a leerse/escribirse contra * el backend (ajustes por niño), sustituyendo el almacenamiento local. */ @Injectable({ providedIn: 'root' }) export class FontPreferenceService { /** Clave de persistencia temporal hasta el cableado con el backend. */ private static readonly STORAGE_KEY = 'recordalexia.dyslexiaFont'; private readonly document = inject(DOCUMENT); /** Estado reactivo: ¿está activada OpenDyslexic? Por defecto, sí. */ private readonly enabledSignal = signal(this.readInitialState()); /** Señal de solo lectura para que la consuma la UI. */ readonly enabled = this.enabledSignal.asReadonly(); constructor() { // Sincroniza el DOM con el estado inicial al arrancar la app. this.applyToDom(this.enabledSignal()); } /** Activa o desactiva OpenDyslexic y propaga el cambio al DOM y a la persistencia. */ setEnabled(enabled: boolean): void { this.enabledSignal.set(enabled); this.applyToDom(enabled); this.persist(enabled); } /** Alterna el estado actual. */ toggle(): void { this.setEnabled(!this.enabledSignal()); } /** Lee el estado inicial de localStorage; si no hay nada guardado, ACTIVA por defecto. */ private readInitialState(): boolean { const stored = this.safeGetItem(FontPreferenceService.STORAGE_KEY); return stored === null ? true : stored === 'true'; } /** Refleja la preferencia en . */ private applyToDom(enabled: boolean): void { this.document.documentElement.setAttribute( 'data-dyslexia-font', enabled ? 'on' : 'off', ); } /** Guarda la preferencia, tolerando entornos sin localStorage. */ private persist(enabled: boolean): void { try { this.document.defaultView?.localStorage.setItem( FontPreferenceService.STORAGE_KEY, String(enabled), ); } catch { // localStorage no disponible (modo kiosko restringido): se ignora. } } private safeGetItem(key: string): string | null { try { return this.document.defaultView?.localStorage.getItem(key) ?? null; } catch { return null; } } }