-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
373 lines (345 loc) · 16.1 KB
/
script.js
File metadata and controls
373 lines (345 loc) · 16.1 KB
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
// --- Multilanguage Fortunes ---
const fortunes = {
EN: [
"The shadow you chase will reveal its own light.",
"Whispers in silence carry the answer you seek.",
"A path closes only to guide you to a hidden gate.",
"What is lost waits patiently to be found again.",
"The next turn of the moon will alter your course.",
"The stars hold a secret only you can unlock.",
"A chance encounter will echo in your future.",
"The silence between words hides the true message.",
"Your steps are guided by a rhythm older than time.",
"An invisible ally awaits you in the shadows.",
"Your Wi-Fi will connect on the first try today.",
"You will finally remember why you entered that room.",
"Beware: free samples may lead to lifelong commitments.",
"Someone will like your meme more than you do.",
"Your socks will vanish, but only the left ones.",
"Today you will defeat the printer in battle.",
"Beware the autocorrect: it knows too much.",
"An unplanned nap will change your destiny.",
"Your future looks bright… once you recharge your phone.",
"You will open the fridge and find exactly what you forgot you wanted.",
"An unexpected snack will bring unexpected joy.",
"The spilled coffee will be a sign of greatness.",
"Your cat/dog will judge your life choices today.",
"You will find a sock... but only when it’s too late.",
"Your message will eventually reach the right person.",
"A song stuck in your head contains the answers you need.",
"The ice cream aisle holds the key to happiness.",
"Your password will work on the first try.",
"Someone will compliment you today, for no reason.",
"Your online order will arrive faster than expected.",
"Today you master the art of not tripping over anything."
],
ES: [
"La sombra que perseguís va a revelar su propia luz.",
"Los susurros del silencio traen la respuesta que buscás.",
"Un camino se cierra solo para guiarte hacia una puerta escondida.",
"Lo que perdiste te espera, paciente, para ser encontrado otra vez.",
"El próximo giro de la luna cambiará tu rumbo.",
"Las estrellas guardan un secreto que solo vos podés descubrir.",
"Un encuentro casual va a resonar en tu futuro.",
"El silencio entre las palabras esconde el verdadero mensaje.",
"Tus pasos siguen un ritmo más antiguo que el tiempo.",
"Un aliado invisible te espera entre las sombras.",
"Tu Wi-Fi se va a conectar al primer intento hoy.",
"Por fin te vas a acordar por qué entraste a esa habitación.",
"Cuidado: las muestras gratis pueden volverse compromisos eternos.",
"Alguien va a disfrutar tu meme más que vos.",
"Tus medias van a desaparecer, pero solo las izquierdas.",
"Hoy vas a derrotar a la impresora en batalla.",
"Cuidado con el autocorrector: sabe demasiado.",
"Una siesta no planeada va a cambiar tu destino.",
"Tu futuro se ve brillante... cuando cargues el celular.",
"Vas a abrir la heladera y encontrar justo eso que ni recordabas que querías.",
"Un snack inesperado te va a traer una alegría inesperada.",
"El café derramado será señal de grandeza.",
"Tu gato o perro hoy va a juzgar tus decisiones de vida.",
"Vas a encontrar una media... pero demasiado tarde.",
"Tu mensaje va a llegar, aunque tarde, a la persona correcta.",
"La canción que no se te va de la cabeza tiene las respuestas que buscás.",
"La góndola de los helados guarda la clave de la felicidad.",
"Tu contraseña va a funcionar al primer intento.",
"Alguien te va a halagar hoy, sin motivo alguno.",
"Tu pedido online va a llegar antes de lo esperado.",
"Hoy dominás el arte de no tropezarte con nada."
],
NO: [
"Skyggen du jager vil avsløre sitt eget lys.",
"Hvisking i stillhet bærer svaret du søker.",
"En vei lukkes bare for å lede deg til en skjult port.",
"Det som er tapt venter tålmodig på å bli funnet igjen.",
"Neste måneskifte vil endre kursen din.",
"Stjernene holder på en hemmelighet bare du kan låse opp.",
"Et tilfeldig møte vil gi gjenklang i fremtiden din.",
"Stillheten mellom ordene skjuler det sanne budskapet.",
"Dine steg blir styrt av en rytme eldre enn tiden.",
"En usynlig alliert venter på deg i skyggene.",
"Wi-Fi-en din vil koble til på første forsøk i dag.",
"Du vil endelig huske hvorfor du gikk inn i det rommet.",
"Pass opp: gratisprøver kan føre til livslange forpliktelser.",
"Noen vil like memen din mer enn du gjør.",
"Sokkene dine vil forsvinne — bare de venstre.",
"I dag vil du seire over printeren i kamp.",
"Pass deg for autokorrektur: den vet for mye.",
"En uplanlagt lur vil endre skjebnen din.",
"Fremtiden din ser lys ut… når du lader telefonen.",
"Du vil åpne kjøleskapet og finne akkurat det du glemte at du ville ha.",
"En uventet snacks vil gi uventet glede.",
"Den sølte kaffen vil være et tegn på storhet.",
"Katten eller hunden din vil dømme livsvalgene dine i dag.",
"Du vil finne en sokk... men for sent.",
"Meldingen din vil til slutt nå den rette personen.",
"Sangen som sitter fast i hodet ditt har svarene du trenger.",
"Isdisken holder nøkkelen til lykke.",
"Passordet ditt vil fungere på første forsøk.",
"Noen vil gi deg et kompliment i dag, uten grunn.",
"Bestillingen din vil komme raskere enn du forventet.",
"I dag mestrer du kunsten å ikke snuble i noe."
],
PT: [
"A sombra que você persegue vai revelar sua própria luz.",
"Os sussurros do silêncio trazem a resposta que você procura.",
"Um caminho se fecha apenas para guiá-lo até um portão escondido.",
"O que foi perdido espera pacientemente para ser encontrado novamente.",
"A próxima virada da lua mudará seu rumo.",
"As estrelas guardam um segredo que só você pode desvendar.",
"Um encontro inesperado ecoará no seu futuro.",
"O silêncio entre as palavras esconde a verdadeira mensagem.",
"Seus passos são guiados por um ritmo mais antigo que o tempo.",
"Um aliado invisível espera por você nas sombras.",
"Seu Wi-Fi vai conectar de primeira hoje.",
"Você finalmente vai lembrar por que entrou naquele cômodo.",
"Cuidado: amostras grátis podem se tornar compromissos eternos.",
"Alguém vai gostar do seu meme mais do que você.",
"Suas meias vão sumir — mas só as esquerdas.",
"Hoje você vencerá a impressora na batalha.",
"Cuidado com o autocorretor: ele sabe demais.",
"Um cochilo inesperado mudará seu destino.",
"Seu futuro parece brilhante… assim que carregar o celular.",
"Você abrirá a geladeira e encontrará exatamente o que queria sem lembrar.",
"Um lanche inesperado trará alegria inesperada.",
"O café derramado será um sinal de grandeza.",
"Seu gato ou cachorro julgará suas escolhas de vida hoje.",
"Você encontrará uma meia... mas tarde demais.",
"Sua mensagem acabará chegando à pessoa certa.",
"A música na sua cabeça contém as respostas que você precisa.",
"O corredor dos sorvetes guarda a chave da felicidade.",
"Sua senha funcionará na primeira tentativa.",
"Alguém vai te elogiar hoje, sem motivo.",
"Seu pedido online chegará antes do esperado.",
"Hoje você dominará a arte de não tropeçar em nada."
],
DE: [
"Der Schatten, den du jagst, wird sein eigenes Licht offenbaren.",
"Flüstern in der Stille trägt die Antwort, die du suchst.",
"Ein Weg schließt sich nur, um dich zu einem verborgenen Tor zu führen.",
"Was verloren ist, wartet geduldig darauf, wiedergefunden zu werden.",
"Die nächste Mondwende wird deinen Kurs verändern.",
"Die Sterne bergen ein Geheimnis, das nur du entschlüsseln kannst.",
"Eine zufällige Begegnung wird in deiner Zukunft widerhallen.",
"Die Stille zwischen den Worten verbirgt die wahre Botschaft.",
"Deine Schritte werden von einem Rhythmus geführt, älter als die Zeit.",
"Ein unsichtbarer Verbündeter erwartet dich in den Schatten.",
"Dein WLAN wird sich heute beim ersten Versuch verbinden.",
"Du wirst dich endlich erinnern, warum du diesen Raum betreten hast.",
"Vorsicht: Gratisproben können zu lebenslangen Verpflichtungen führen.",
"Jemand wird dein Meme mehr mögen als du.",
"Deine Socken werden verschwinden — aber nur die linken.",
"Heute wirst du den Drucker im Kampf besiegen.",
"Hüte dich vor der Autokorrektur: Sie weiß zu viel.",
"Ein ungeplanter Mittagsschlaf wird dein Schicksal verändern.",
"Deine Zukunft sieht hell aus… sobald du dein Handy auflädst.",
"Du wirst den Kühlschrank öffnen und genau das finden, was du vergessen hattest, dass du wolltest.",
"Ein unerwarteter Snack wird unerwartete Freude bringen.",
"Verschütteter Kaffee wird ein Zeichen von Größe sein.",
"Deine Katze oder dein Hund wird heute deine Lebensentscheidungen beurteilen.",
"Du wirst eine Socke finden... aber zu spät.",
"Deine Nachricht wird schließlich die richtige Person erreichen.",
"Das Lied in deinem Kopf enthält die Antworten, die du brauchst.",
"Das Eisregal enthält den Schlüssel zum Glück.",
"Dein Passwort wird beim ersten Versuch funktionieren.",
"Jemand wird dich heute ohne Grund loben.",
"Deine Online-Bestellung wird früher als erwartet ankommen.",
"Heute meisterst du die Kunst, über nichts zu stolpern."
],
FR: [
"L’ombre que tu poursuis révélera sa propre lumière.",
"Les murmures du silence portent la réponse que tu cherches.",
"Un chemin se ferme seulement pour te guider vers une porte cachée.",
"Ce qui est perdu attend patiemment d’être retrouvé.",
"Le prochain tour de la lune changera ta trajectoire.",
"Les étoiles gardent un secret que toi seul peux dévoiler.",
"Une rencontre fortuite résonnera dans ton avenir.",
"Le silence entre les mots cache le vrai message.",
"Tes pas sont guidés par un rythme plus ancien que le temps.",
"Un allié invisible t’attend dans l’ombre.",
"Ton Wi-Fi se connectera du premier coup aujourd’hui.",
"Tu te souviendras enfin pourquoi tu es entré dans cette pièce.",
"Attention : les échantillons gratuits peuvent devenir des engagements à vie.",
"Quelqu’un aimera ton mème plus que toi.",
"Tes chaussettes disparaîtront — mais seulement les gauches.",
"Aujourd’hui, tu vaincras l’imprimante au combat.",
"Méfie-toi de l’autocorrecteur : il en sait trop.",
"Une sieste imprévue changera ton destin.",
"Ton avenir semble brillant… une fois ton téléphone rechargé.",
"Tu ouvriras le frigo et trouveras exactement ce que tu avais oublié vouloir.",
"Un en-cas inattendu t’apportera une joie inattendue.",
"Le café renversé sera un signe de grandeur.",
"Ton chat ou ton chien jugera tes choix de vie aujourd’hui.",
"Tu trouveras une chaussette... mais trop tard.",
"Ton message atteindra finalement la bonne personne.",
"La chanson coincée dans ta tête contient les réponses dont tu as besoin.",
"Le rayon des glaces détient la clé du bonheur.",
"Ton mot de passe fonctionnera du premier coup.",
"Quelqu’un te complimentera aujourd’hui, sans raison.",
"Ta commande en ligne arrivera plus vite que prévu.",
"Aujourd’hui, tu maîtriseras l’art de ne trébucher sur rien."
]
};
// --- Button text by language ---
const buttonLabels = {
EN: "Reveal Fortune",
ES: "Revelá tu destino",
NO: "Avslør skjebnen",
PT: "Revele sua sorte",
DE: "Offenbare dein Schicksal",
FR: "Révèle ta destinée"
};
// --- Title text by language ---
const titles = {
EN: "Your Fortune",
ES: "Tu Fortuna",
NO: "Din Skjebne",
PT: "Sua Sorte",
DE: "Dein Schicksal",
FR: "Ta Destinée"
};
// --- Select elements ---
const fortuneBtn = document.getElementById("fortune-btn");
const fortuneEl = document.getElementById("fortune");
const titleEl = document.getElementById("title");
// --- Typing control ---
let typingIntervalId = null;
// --- Detect or load language ---
let currentLang = "EN";
const savedLang = localStorage.getItem("fortuneLang");
if (savedLang && fortunes[savedLang]) {
currentLang = savedLang;
} else {
const detected = (navigator.language || navigator.userLanguage || "en").slice(0,2).toUpperCase();
if (fortunes[detected]) currentLang = detected;
localStorage.setItem("fortuneLang", currentLang);
}
// --- Initialize UI ---
fortuneBtn.textContent = buttonLabels[currentLang];
titleEl.textContent = titles[currentLang];
document.querySelectorAll(".lang-switcher button").forEach((b) => {
b.classList.toggle("active", b.dataset.lang === currentLang);
});
// --- Sound setup ---
const sound = document.getElementById("button-sound");
sound.volume = 0.4;
sound.preload = "auto";
// --- Force browser to decode/play silently once ---
window.addEventListener("load", () => {
sound.play().then(() => sound.pause()).catch(() => {});
});
// --- Reveal Fortune ---
fortuneBtn.addEventListener("click", () => {
// Play button sound instantly
sound.currentTime = 0;
sound.play().catch(() => setTimeout(() => sound.play(), 50));
// Pick and show a random fortune
const langFortunes = fortunes[currentLang];
const randomIndex = Math.floor(Math.random() * langFortunes.length);
const selectedFortune = langFortunes[randomIndex];
typeFortune(selectedFortune);
});
// --- Typing Animation ---
function typeFortune(text) {
if (typingIntervalId) clearInterval(typingIntervalId);
fortuneEl.textContent = "";
fortuneEl.style.opacity = 1;
let i = 0;
typingIntervalId = setInterval(() => {
fortuneEl.textContent += text.charAt(i);
i++;
if (i >= text.length) {
clearInterval(typingIntervalId);
typingIntervalId = null;
}
}, 50);
}
// --- Find index across all languages ---
function findFortuneIndex(text) {
for (const lang of Object.keys(fortunes)) {
const idx = fortunes[lang].indexOf(text);
if (idx > -1) return idx;
}
return -1;
}
// --- Language Switching ---
document.querySelectorAll(".lang-switcher button").forEach((btn) => {
btn.addEventListener("click", () => {
document.querySelectorAll(".lang-switcher button").forEach((b) =>
b.classList.remove("active")
);
btn.classList.add("active");
currentLang = btn.dataset.lang;
fortuneBtn.textContent = buttonLabels[currentLang];
titleEl.textContent = titles[currentLang];
localStorage.setItem("fortuneLang", currentLang);
const currentText = fortuneEl.textContent.trim();
if (currentText) {
const index = findFortuneIndex(currentText);
if (index > -1) typeFortune(fortunes[currentLang][index]);
}
});
}); // <-- CLOSE the language-switcher loop here
// --- Background Music with fade ---
const musicBtn = document.getElementById("music-btn");
const music = new Audio("assets/fortune-song.mp3");
music.loop = true;
music.volume = 0; // start muted
let musicPlaying = false;
let fadeInterval = null;
const fadeStep = 0.02; // volume increment per step
const fadeIntervalTime = 50; // ms per step
musicBtn.addEventListener("click", () => {
if (!musicPlaying) {
music.play().catch(() => {}); // play on user interaction
musicBtn.classList.add("active");
musicBtn.classList.remove("muted"); // REMOVE the diagonal line
fadeVolume(true);
musicPlaying = true;
} else {
fadeVolume(false);
musicBtn.classList.remove("active");
musicBtn.classList.add("muted"); // ADD the diagonal line
musicPlaying = false;
}
});
function fadeVolume(fadeIn) {
if (fadeInterval) clearInterval(fadeInterval);
fadeInterval = setInterval(() => {
if (fadeIn) {
music.volume = Math.min(music.volume + fadeStep, 0.3); // fade in to 0.3
if (music.volume >= 0.3) clearInterval(fadeInterval);
} else {
music.volume = Math.max(music.volume - fadeStep, 0); // fade out to 0
if (music.volume <= 0) {
clearInterval(fadeInterval);
music.pause();
}
}
}, fadeIntervalTime);
}
// --- Toggle language menu visibility ---
const langToggle = document.getElementById("lang-toggle");
const langMenu = document.querySelector(".lang-switcher");
langToggle.addEventListener("click", () => {
langMenu.classList.toggle("active");
});