File size: 4,103 Bytes
4edc3e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eebe76e
4edc3e5
 
 
 
eebe76e
 
 
 
 
 
 
 
 
4edc3e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// components/settings-component.js - Settings modal functionality

import { StateManager } from '../services/state-manager.js';
import { TranslationService } from '../services/translation-service.js';

export const SettingsComponent = {
  elements: {
    settingsBtn: null,
    settingsModal: null,
    doneSettingsBtn: null,
    closeSettingsBtn: null,
    frRadioBtnSettings: null,
    enRadioBtnSettings: null,
    increaseFontSizeBtn: null,
    decreaseFontSizeBtn: null,
    resetFontSizeBtn: null
  },

  constants: {
    MIN_FONT_SIZE: 0.75,
    MAX_FONT_SIZE: 1.625,
    FONT_SIZE_STEP: 0.125 // 1/8 rem for smooth increments
  },

  /**

   * Initialize the settings component

   */
  init() {
    this.elements.settingsBtn = document.getElementById('settings-btn');
    this.elements.settingsModal = document.getElementById('settings-modal');
    this.elements.doneSettingsBtn = document.getElementById('done-settings');
    this.elements.closeSettingsBtn = document.getElementById('close-settings-btn');
    this.elements.frRadioBtnSettings = document.getElementById('lang-fr-settings');
    this.elements.enRadioBtnSettings = document.getElementById('lang-en-settings');
    this.elements.increaseFontSizeBtn = document.getElementById('increase-font-size-btn');
    this.elements.decreaseFontSizeBtn = document.getElementById('decrease-font-size-btn');
    this.elements.resetFontSizeBtn = document.getElementById('reset-font-size-btn');

    this.attachOutsideClickListener();
    this.attachEventListeners();
    this.updateLanguageRadioButtons();
  },

  attachOutsideClickListener() {
    this.elements.settingsModal.addEventListener('click', (e) => {
      // Check if click is on the overlay itself (not its children)
      if (e.target === this.elements.settingsModal) {
        this.closeModal();
      }
    });
  },

  /**

   * Attach event listeners

   */
  attachEventListeners() {
    this.elements.settingsBtn.addEventListener('click', (e) => this.openModal(e));
    this.elements.closeSettingsBtn.addEventListener('click', () => this.closeModal());
    this.elements.doneSettingsBtn.addEventListener('click', () => this.closeModal());

    // Language change listeners
    this.elements.frRadioBtnSettings.addEventListener('change', () => {
      TranslationService.setLanguage(this.elements.frRadioBtnSettings.value);
      this.updateLanguageRadioButtons();
    });
    this.elements.enRadioBtnSettings.addEventListener('change', () => {
      TranslationService.setLanguage(this.elements.enRadioBtnSettings.value);
      this.updateLanguageRadioButtons();
    });

    // Font size listeners
    this.elements.increaseFontSizeBtn.addEventListener('click', () => {
      this.updateFontSize(StateManager.fontSize + this.constants.FONT_SIZE_STEP);
    });
    this.elements.decreaseFontSizeBtn.addEventListener('click', () => {
      this.updateFontSize(StateManager.fontSize - this.constants.FONT_SIZE_STEP);
    });
    this.elements.resetFontSizeBtn.addEventListener('click', () => {
      this.updateFontSize(1); // 1rem = browser default
    });
  },

  /**

   * Open the settings modal

   */
  openModal(e) {
    e.preventDefault();
    this.elements.settingsModal.style.display = '';
  },

  /**

   * Close the settings modal

   */
  closeModal() {
    this.elements.settingsModal.style.display = 'none';
  },

  /**

   * Update font size

   * @param {number} newSize - New font size in rem

   */
  updateFontSize(newSize) {
    const clampedSize = Math.min(
      this.constants.MAX_FONT_SIZE, 
      Math.max(this.constants.MIN_FONT_SIZE, newSize)
    );
    StateManager.setFontSize(clampedSize);
    document.documentElement.style.fontSize = clampedSize + 'rem';
  },

  /**

   * Update language radio buttons to reflect current language

   */
  updateLanguageRadioButtons() {
    this.elements.frRadioBtnSettings.checked = StateManager.currentLang === 'fr';
    this.elements.enRadioBtnSettings.checked = StateManager.currentLang === 'en';
  }
};