Skip to content

Commit

Permalink
Merge pull request #5 from cdmoro/dynamic-theme
Browse files Browse the repository at this point in the history
Dynamic theme
  • Loading branch information
cdmoro authored May 20, 2024
2 parents d6784fd + 6fce02b commit 6aa6145
Show file tree
Hide file tree
Showing 16 changed files with 541 additions and 37 deletions.
5 changes: 4 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@
<option value="frame" data-text="frame">Frame</option>
<option value="subtle" data-text="subtle">Subtle</option>
<option value="poster" data-text="poster">Poster</option>
<option value="dynamic" data-text="dynamic">Dynamic</option>
</optgroup>
</select>
<select id="variant-select" tabindex="6">
Expand All @@ -197,7 +198,9 @@
</select>
</span>
<select id="font-select" tabindex="7">
<option value="default" data-text="themeFont">Theme font</option>
<option value="default" data-text="default_font">
Theme font
</option>
</select>
</span>
</div>
Expand Down
2 changes: 1 addition & 1 deletion public/times/es-ES/02_43.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"quote_time_case": "2:43",
"quote_first": "Ella se recostó a su lado. \"Son las ",
"quote_last": ":12 am, Case. Tengo una lectura insertada en mi nervio óptico\".",
"title": "neuromante",
"title": "Neuromante",
"author": "William Gibson",
"sfw": "unknown"
},
Expand Down
2 changes: 1 addition & 1 deletion public/times/es-ES/04_23.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"quote_time_case": "04:23",
"quote_first": "Su chip marcaba la hora. ",
"quote_last": ":04. Había sido un día largo.",
"title": "neuromante",
"title": "Neuromante",
"author": "William Gibson",
"sfw": "unknown"
}
Expand Down
2 changes: 1 addition & 1 deletion public/times/es-ES/06_27.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"quote_time_case": "06:27",
"quote_first": "",
"quote_last": ":52 por el chip en su nervio óptico; Case había estado siguiendo su progreso a través de Villa Straylight durante más de una hora, dejando que el análogo de endorfinas que había tomado borrara su resaca.",
"title": "neuromante",
"title": "Neuromante",
"author": "William Gibson",
"sfw": "unknown"
},
Expand Down
2 changes: 1 addition & 1 deletion public/times/es-ES/07_02.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"quote_time_case": "07:02",
"quote_first": "",
"quote_last": ":18 Una hora y media. \"Caso\", dijo, \"quiero favorecer\".",
"title": "neuromante",
"title": "Neuromante",
"author": "William Gibson",
"sfw": "sfw"
}
Expand Down
8 changes: 4 additions & 4 deletions quotes/quotes.es-ES.csv
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ Time,Quote time,Quote,Title,Author,SFW
02:40,* 2:40 am,"La señorita Conover dijo a los investigadores que a las 2:40 a. m., el oficial Martin Willis entró al restaurante y pidió café y donas.",La cepa de Andrómeda,Michael Crichton,unknown
02:41,02.41,"Sus ayudantes querían un anuncio largo y florido lleno de frases conmovedoras y elogios exagerados para sus distintos generales. Eisenhower desechó sus sugerencias y escribió: ¡Ah! ahí está: ""La misión de esta fuerza aliada se cumplió a las 02.41 hora local del 7 de mayo de 1945"".",Guerra lunar,Ben Bova,sfw
02:42,02.42,"Esta vez era un pájaro, un cuervo, el que llevaba gafas. Patterson había descifrado el telegrama y ahora lo leyó rápidamente. DIOSA 4 informa que GENIUS salió del salón a las 02.42 ZULU.",garza nocturna,Adam Brookes,sfw
02:43,2:43,"Ella se recostó a su lado. ""Son las 2:43:12 am, Case. Tengo una lectura insertada en mi nervio óptico"".",neuromante,William Gibson,unknown
02:43,2:43,"Ella se recostó a su lado. ""Son las 2:43:12 am, Case. Tengo una lectura insertada en mi nervio óptico"".",Neuromante,William Gibson,unknown
02:43,02:43,"Max se despertó de la pesadilla con un grito ahogado, con los ojos abiertos de par en par en la habitación a oscuras. Parpadeó dos veces y ahogó un gemido cuando la marca de tiempo de las 02:43 apareció en su visión. ""Nunca has visto un oso de verdad"", murmuró.",Una luz pálida en la oscuridad,K.B. Wagers,sfw
02:44,* dieciséis minutos para las tres,Llegaste aquí a las tres menos dieciséis minutos. Ron miró su reloj.,El hombre abominable,Maj Sjöwall,sfw
02:45,* cuarto para las tres,Cuando despertó ya era de noche y la luna brillaba en la habitación. Miró su reloj: eran las tres menos cuarto. El sueño lo había abandonado; se sentó en la cama y pensó en el funeral de la vieja condesa.,reina de Espadas,Alexsander S. Pushkin,sfw
Expand Down Expand Up @@ -601,7 +601,7 @@ Time,Quote time,Quote,Title,Author,SFW
04:22,4:22,El presidente marcó siete dígitos y pidió hablar con el oficial de turno. Miró su reloj mientras esperaba que lo pasaran. Eran las 4:22.,Honor entre ladrones,Jeffrey Archer,sfw
04:22,4.22,Me lastimó hasta el punto de querer decirle algo. Mi reloj marcaba ahora las 4.22. Se había detenido. Fue destrozado.,El archivo Ipcress,Len Deighton,unknown
04:23,4:23,"4:23, lunes por la mañana, Plaza Islandia. En los alrededores de Bjornsongatan, unos fuertes gritos despiertan a varias personas.",Deje que entre el correcto,John Ajvide Lindqvist,unknown
04:23,04:23,Su chip marcaba la hora. 04:23:04. Había sido un día largo.,neuromante,William Gibson,unknown
04:23,04:23,Su chip marcaba la hora. 04:23:04. Había sido un día largo.,Neuromante,William Gibson,unknown
04:24,04:24,"A las 04:24 del 5 de enero de 2025, las estrellas se detuvieron en el cielo. En California, el terremoto comenzó con un estruendo de baja frecuencia. No fue un sonido sino una sensación que provocó una incomprensible debilidad en las piernas, una constricción de los intestinos y pánico.",Circulo perfecto,Carlos J. Cortes,sfw
04:25,las cuatro y veinticinco minutos,"Mientras me vestía, miré mi reloj. No era de extrañar que nadie se moviera. Eran las cuatro y veinticinco minutos.",Las aventuras de Sherlock Holmes,Sir Arthur Conan Doyle,unknown
04:26,las cuatro y veintiséis minutos,"A las cuatro y veintiséis minutos fue declarada muerta. La causa de la muerte, o más bien la forma de la muerte, era evidente. Tenía dos impactos de bala de entrada en el tórax.",Si realmente me amaras,Ann Rule,nsfw
Expand Down Expand Up @@ -845,7 +845,7 @@ Time,Quote time,Quote,Title,Author,SFW
06:26,6:26 a.m.,"6:26 a.m.<br>""Está bien"", declaró Armont, ""haremos el inserto aquí"". Golpeó con el dedo el plano. ""Atacamos el centro neurálgico de Launch con granadas aturdidoras y gases lacrimógenos, y lo derribamos. Si tenemos suerte, Ramírez seguirá allí, y ese debería ser el final"".",Proyecto cíclope,Thomas Hoover,nsfw
06:27,6:27 a.m.,"6:27 a.m.<br>Finalmente, Mark no pudo soportarlo más y a las 6:30 a.m. se levantó, se duchó y se puso una camisa limpia y un traje limpio.",¿Se lo contamos al presidente?,Jeffrey Archer,sfw
06:27,6:27,"Eran las 6:27. En el piso de Frances Peverell sonó el teléfono. Tan pronto como James pronunció su nombre, supo que algo andaba mal.",El pecado original,P.D. James,sfw
06:27,06:27,"06:27:52 por el chip en su nervio óptico; Case había estado siguiendo su progreso a través de Villa Straylight durante más de una hora, dejando que el análogo de endorfinas que había tomado borrara su resaca.",neuromante,William Gibson,unknown
06:27,06:27,"06:27:52 por el chip en su nervio óptico; Case había estado siguiendo su progreso a través de Villa Straylight durante más de una hora, dejando que el análogo de endorfinas que había tomado borrara su resaca.",Neuromante,William Gibson,unknown
06:27,* 0627 horas,"Temprano en la mañana, a finales de siglo, Cricklewood Broadway. A las 06.27 horas del 1 de enero de 1975, Alfred Archibald Jones estaba vestido de pana y sentado en un Cavalier Musketeer Estate lleno de humo, boca abajo sobre el volante, esperando que el juicio no fuera demasiado pesado para él.",Dientes blancos,Zadie Smith,unknown
06:28,6:28 a.m.,Jueves 6:28 a.m.<br>El aire de la mañana era fuerte y deseó haber agarrado uno de los chales de punto negros de Adriana antes de salir. ¿Podría pasar por una de esas campesinas griegas encorvadas? Ella se preguntó. No es probable. Ella se estremeció y se envolvió en su fino abrigo.,Proyecto Dédalo,Thomas Hoover,sfw
06:29,6:29,"Durante los siguientes quince minutos cargó las cajas de vino y cerveza escaleras arriba, deteniéndose constantemente para mirar su reloj, y a las 6:29 abrió la puerta trasera para encontrar al cabo alemán saltando arriba y abajo y golpeándose los costados en un esfuerzo. para mantener el calor.",Los pecados del padre,Jeffrey Archer,sfw
Expand Down Expand Up @@ -937,7 +937,7 @@ Time,Quote time,Quote,Title,Author,SFW
07:00,* las siete en punto,"Se encerró, no respondió a mi bonjour a través de la puerta; A las siete se levantó y le llevaron el samovar desde la cocina.",Crimen y castigo,Fyodor Dostoyevsky,unknown
07:00,siete de la mañana,"A las siete de la mañana, cuando el coronel Gerineldo Márquez fue a buscarlo en compañía de un grupo de oficiales rebeldes, lo encontró más taciturno que nunca, más pensativo y solitario.",100 años de soledad,Gabriel García Márquez,sfw
07:01,las siete y un minuto,"Di el primer paso tentativo para descubrirlo a las siete y un minuto de la mañana siguiente, en la morgue de Fort Bird.",El enemigo,Lee Child,sfw
07:02,07:02,"07:02:18 Una hora y media. ""Caso"", dijo, ""quiero favorecer"".",neuromante,William Gibson,sfw
07:02,07:02,"07:02:18 Una hora y media. ""Caso"", dijo, ""quiero favorecer"".",Neuromante,William Gibson,sfw
07:03,7:03 a.m.,7:03 a.m. Regreso a la cama enfurruñado por el peso. Estado de cabeza malo. Dormir o levantarse igualmente fuera de discusión. Piensa en Daniel.,El diario de Bridget Jones,Helen Fielding,sfw
07:03,las siete y tres minutos,Hubo problemas con la pista. Nadie podría dar idea de cuándo se arreglaría. El tren que llegó a las siete y tres minutos había sido el último en llegar. ¿Estaban todos los dioses del viaje conspirando para frustrarlo?,La sala del asesinato,P.D. James,sfw
07:03,* tres minutos después de las 7 am,Y hasta ahora había decretado que alguien debía empezar a lavarme y arreglarme exactamente tres minutos después de las 7 de la mañana.,El día de los trífidos,John Wyndham,sfw
Expand Down
14 changes: 10 additions & 4 deletions src/modules/clock.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { updateQuote } from "./quotes";
import { getTime, updateFavicon } from "../utils/utils";
import { getStringSetting } from "../utils/settings";
import { setDayParameters } from "./dynamic";

const urlParams = new URLSearchParams(window.location.search);
const testTime = urlParams.get("time");
Expand Down Expand Up @@ -32,15 +34,19 @@ function updateProgressBar() {
async function updateTime() {
const time = testTime || getTime();

if (time.includes(":00") || time.includes(":30")) {
updateFavicon(time);
}

if (!isTest) {
updateProgressBar();
}

if (lastTime !== time) {
if (time.includes(":00") || time.includes(":30")) {
updateFavicon(time);
}

if (getStringSetting("theme")?.startsWith("dynamic")) {
setDayParameters();
}

document.title = document.title.replace(/[0-9]{2}:[0-9]{2}/, time);
updateQuote(time);
lastTime = time;
Expand Down
73 changes: 73 additions & 0 deletions src/modules/dynamic.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import { describe, expect, test, vi } from "vitest";
import { getDayParameters, getDayProgress } from "./dynamic";

const PROGRESS = {
"0": new Date(2024, 5, 11, 0, 0, 0),
"16.67": new Date(2024, 5, 11, 4, 0, 0),
"25": new Date(2024, 5, 11, 6, 0, 0),
"32.78": new Date(2024, 5, 11, 7, 52, 6),
"33.33": new Date(2024, 5, 11, 8, 0, 0),
"37.5": new Date(2024, 5, 11, 9, 0, 0),
"45.83": new Date(2024, 5, 11, 11, 0, 0),
"50": new Date(2024, 5, 11, 12, 0, 0),
"60.83": new Date(2024, 5, 11, 14, 36, 0),
"75": new Date(2024, 5, 11, 18, 0, 0),
"79.17": new Date(2024, 5, 11, 19, 0, 0),
"100": new Date(2024, 5, 11, 23, 59, 59),
};

describe("getDayProgress", () => {
const formatDate = (date: Date) =>
`${date.getHours().toString().padStart(2, "0")}:${date
.getMinutes()
.toString()
.padStart(2, "0")}`;

Object.entries(PROGRESS).forEach(([progress, date]) => {
test(`should return ${progress}% for ${formatDate(date)}`, () => {
vi.useFakeTimers();
vi.setSystemTime(date);

expect(getDayProgress()).toEqual(parseFloat(progress));
});

vi.useRealTimers();
});
});

describe("getDayParameters", () => {
const dayParameterResponse = (
scene: string,
period: string,
segment: number,
progress: number
) => ({ scene, period, segment, progress });

const PARAMETERS = {
"0": dayParameterResponse("night", "am", 0, 0),
"16.67": dayParameterResponse("night", "am", 1, 16.67),
"25": dayParameterResponse("morning", "am", 2, 25),
"32.78": dayParameterResponse("morning", "am", 3, 32.78),
"33.33": dayParameterResponse("morning", "am", 3, 33.33),
"37.5": dayParameterResponse("morning", "am", 3, 37.5),
"45.83": dayParameterResponse("morning", "am", 4, 45.83),
"50": dayParameterResponse("morning", "pm", 4, 50),
"60.83": dayParameterResponse("afternoon", "pm", 5, 60.83),
"75": dayParameterResponse("evening", "pm", 6, 75),
"79.17": dayParameterResponse("evening", "pm", 6, 79.17),
"100": dayParameterResponse("night", "pm", 8, 100),
};

Object.entries(PROGRESS).forEach(([progress, date]) => {
test(`should return expected parameters for ${progress}%`, () => {
vi.useFakeTimers();
vi.setSystemTime(date);

expect(getDayParameters()).toEqual(
PARAMETERS[progress as keyof typeof PARAMETERS]
);
});

vi.useRealTimers();
});
});
68 changes: 68 additions & 0 deletions src/modules/dynamic.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
const MOON_PHASES = [
"new",
"waxing-crescent",
"first-quarter",
"waxing-gibbous",
"full",
"waning-gibbous",
"third-quarter",
"waning-crescent",
];
const moonPhase = MOON_PHASES[Math.floor(Math.random() * MOON_PHASES.length)];
const urlParams = new URLSearchParams(window.location.search);
const testScene = urlParams.get("scene");
const testProgress = urlParams.get("progress");

export function getDayProgress() {
const now = new Date();
const seconds =
now.getHours() * 3600 + now.getMinutes() * 60 + now.getSeconds();
const progress = (seconds * 100) / 86400;

return parseFloat(testProgress || progress.toFixed(2));
}

export function getDayParameters() {
const progress = getDayProgress();
// 9pm to 5am
let scene = "night";
// 5am to 12pm
if (progress >= 20.83 && progress <= 50) {
scene = "morning";
} // 12pm to 5pm
else if (progress > 50 && progress <= 70.83) {
scene = "afternoon";
} // 5pm to 9pm
else if (progress > 70.83 && progress <= 87.5) {
scene = "evening";
}

const segment = Math.round((progress * 8) / 100);

const period = progress < 50 ? "am" : "pm";

return {
scene: testScene || scene,
progress,
period,
segment,
};
}

export function setDayParameters() {
const { progress, scene, segment, period } = getDayParameters();

if (!document.querySelector(".sphere")) {
const actor = document.createElement("div");
actor.classList.add("sphere");
actor.classList.toggle(moonPhase, scene === "night");
document.querySelector("main")?.appendChild(actor);
}

const root = document.querySelector<HTMLElement>(":root");
root?.style.setProperty("--day-progress", progress.toString());
root?.setAttribute("data-progress", progress.toString());
root?.setAttribute("data-scene", scene);
root?.setAttribute("data-period", period);
root?.setAttribute("data-segment", segment.toString());
}
9 changes: 9 additions & 0 deletions src/modules/fonts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,15 @@ export const THEME_FONTS: Record<string, string[]> = {
frame: ["Playfair Display"],
subtle: ["Unna"],
poster: ["Averia Serif Libre", "Allura"],
dynamic: [
"Caveat",
"Yeseva One",
"Rye",
"Megrim",
"Jacquard 12",
"Sacramento",
"Indie Flower",
],
};

export const INITIAL_THEME_FONT_SIZE = {
Expand Down
5 changes: 5 additions & 0 deletions src/modules/themes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
updateURL,
} from "../utils/settings";
import { doFitQuote, fitQuote, loadFontIfNotExists } from "../utils/utils";
import { setDayParameters } from "./dynamic";

function getRandomThemeColor() {
let colors = Array.from(
Expand Down Expand Up @@ -102,6 +103,10 @@ export function setTheme(doUpdateURL = true) {
: "light";
}

if (theme === "dynamic") {
setDayParameters();
}

document.documentElement.dataset.theme = `${theme}-${variant}`;
fitQuote();

Expand Down
15 changes: 10 additions & 5 deletions src/strings/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"frame": "Frame",
"subtle": "Subtle",
"poster": "Poster",
"dynamic": "Dynamic",

"system": "System",
"light": "Light",
Expand All @@ -51,7 +52,7 @@
"it-IT": "Italian",
"random": "Random language",

"themeFont": "Theme font"
"default_font": "Default font"
},
"es-ES": {
"document_title": "Reloj Literario",
Expand Down Expand Up @@ -93,6 +94,7 @@
"frame": "Marco",
"subtle": "Sutil",
"poster": "Poster",
"dynamic": "Dinámico",

"system": "Sistema",
"light": "Claro",
Expand All @@ -105,7 +107,7 @@
"it-IT": "Italiano",
"random": "Lenguaje aleatorio",

"themeFont": "Fuente del tema"
"default_font": "Fuente por defecto"
},
"pt-BR": {
"document_title": "Relógio da Literatura",
Expand Down Expand Up @@ -147,6 +149,7 @@
"frame": "Moldura",
"subtle": "Sutil",
"poster": "Pôster",
"dynamic": "Dinâmico",

"system": "Sistema",
"light": "Claro",
Expand All @@ -159,7 +162,7 @@
"it-IT": "Italiano",
"random": "Idioma aleatório",

"themeFont": "Fonte do tema"
"default_font": "Fonte padrão"
},
"fr-FR": {
"document_title": "Horloge de la Littérature",
Expand Down Expand Up @@ -201,6 +204,7 @@
"frame": "Bordure",
"subtle": "Subtil",
"poster": "Affiche",
"dynamic": "Dynamique",

"system": "Système",
"light": "Clair",
Expand All @@ -213,7 +217,7 @@
"it-IT": "Italien",
"random": "Langue aléatoire",

"themeFont": "Police du thème"
"default_font": "Police par défaut"
},
"it-IT": {
"document_title": "Orologio della Letteratura",
Expand Down Expand Up @@ -256,6 +260,7 @@
"frame": "Cornice",
"subtle": "Sottile",
"poster": "Poster",
"dynamic": "Dinamico",

"system": "Sistema",
"light": "Chiaro",
Expand All @@ -268,6 +273,6 @@
"it-IT": "Italiano",
"random": "Lingua casuale",

"themeFont": "Font del tema "
"default_font": "Font predefinito "
}
}
3 changes: 2 additions & 1 deletion src/styles/styles.css
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
@import url(main.css);

@import url(themes/base.css);
@import url(themes/colors.css);
@import url(themes/anaglyph.css);
@import url(themes/bohemian.css);
@import url(themes/colors.css);
@import url(themes/dynamic.css);
@import url(themes/elegant.css);
@import url(themes/festive.css);
@import url(themes/frame.css);
Expand Down
Loading

0 comments on commit 6aa6145

Please sign in to comment.