diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFace.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFace.svelte
new file mode 100644
index 000000000..5d0dc0bf2
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFace.svelte
@@ -0,0 +1,61 @@
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceBauhaus.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceBauhaus.svelte
new file mode 100644
index 000000000..53aba8a76
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceBauhaus.svelte
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+ {#each Array(12) as _, i}
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceBinary.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceBinary.svelte
new file mode 100644
index 000000000..a1976dc04
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceBinary.svelte
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeString}
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceClassic.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceClassic.svelte
new file mode 100644
index 000000000..8d0f3c9b0
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceClassic.svelte
@@ -0,0 +1,302 @@
+
+
+
+
+
+
+
+
+
+
+ {#each Array(60) as _, i}
+ {#if i % 5 !== 0}
+
+ {/if}
+ {/each}
+
+
+ {#each Array(12) as _, i}
+
+ {/each}
+
+
+ {#each romanNumerals as numeral, i}
+
+ {numeral}
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceElegant.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceElegant.svelte
new file mode 100644
index 000000000..7a666375d
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceElegant.svelte
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
+
+
+
+
+ {#each Array(60) as _, i}
+
+ {/each}
+
+
+ {#each Array(12) as _, i}
+
+ {/each}
+
+
+
+
+
+
+
ELEGANT
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceFlip.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceFlip.svelte
new file mode 100644
index 000000000..85c30fef1
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceFlip.svelte
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+ {h1}
+
+
+ {h1}
+
+
+
+
+
+ {h2}
+
+
+ {h2}
+
+
+
+
+
+
+
+
+
+
+
+ {m1}
+
+
+ {m1}
+
+
+
+
+
+ {m2}
+
+
+ {m2}
+
+
+
+
+
+
+
+
+
+
+
+ {s1}
+
+
+ {s1}
+
+
+
+
+
+ {s2}
+
+
+ {s2}
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceGradient.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceGradient.svelte
new file mode 100644
index 000000000..91e3a5a63
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceGradient.svelte
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeString}
+ {timeString}
+
+
+
+
+ {secondsString}
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceIndustrial.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceIndustrial.svelte
new file mode 100644
index 000000000..52e83a9d8
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceIndustrial.svelte
@@ -0,0 +1,278 @@
+
+
+
+
+
+ {#each Array(12) as _, i}
+
+ {/each}
+
+
+
+
+
+
+ {#each Array(60) as _, i}
+
+ {/each}
+
+
+ {#each numbers as num, i}
+
+ {num.toString().padStart(2, '0')}
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceLCD.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceLCD.svelte
new file mode 100644
index 000000000..3c3776c06
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceLCD.svelte
@@ -0,0 +1,316 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceMatrix.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceMatrix.svelte
new file mode 100644
index 000000000..024d06252
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceMatrix.svelte
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
+
+ {#each patterns[h1] as row}
+
+ {#each row as dot}
+
+ {/each}
+
+ {/each}
+
+
+ {#each patterns[h2] as row}
+
+ {#each row as dot}
+
+ {/each}
+
+ {/each}
+
+
+
+
+ {#each colonPattern as row}
+
+ {#each row as dot}
+
+ {/each}
+
+ {/each}
+
+
+
+
+ {#each patterns[m1] as row}
+
+ {#each row as dot}
+
+ {/each}
+
+ {/each}
+
+
+ {#each patterns[m2] as row}
+
+ {#each row as dot}
+
+ {/each}
+
+ {/each}
+
+
+
+
+ {#each colonPattern as row}
+
+ {#each row as dot}
+
+ {/each}
+
+ {/each}
+
+
+
+
+ {#each patterns[s1] as row}
+
+ {#each row as dot}
+
+ {/each}
+
+ {/each}
+
+
+ {#each patterns[s2] as row}
+
+ {#each row as dot}
+
+ {/each}
+
+ {/each}
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceMinimalist.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceMinimalist.svelte
new file mode 100644
index 000000000..e03e11b5e
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceMinimalist.svelte
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+ {#each Array(12) as _, i}
+
+ {/each}
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceModern.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceModern.svelte
new file mode 100644
index 000000000..aef6d292b
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceModern.svelte
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+ {#each Array(60) as _, i}
+ {#if i % 5 !== 0}
+
+ {/if}
+ {/each}
+
+
+ {#each numbers as num, i}
+
+ {num}
+
+ {/each}
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceNautical.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceNautical.svelte
new file mode 100644
index 000000000..a532bef57
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceNautical.svelte
@@ -0,0 +1,286 @@
+
+
+
+
+
+
+
+
+
+
+
+ {#each Array(8) as _, i}
+
+ {/each}
+
+
+
+ {#each Array(60) as _, i}
+
+ {/each}
+
+
+ {#each numbers as num, i}
+
+ {num}
+
+ {/each}
+
+
+
+ {#each Array(8) as _, i}
+
+ {/each}
+
+
+
+
+
MARINE
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceNeon.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceNeon.svelte
new file mode 100644
index 000000000..f9dd6e405
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceNeon.svelte
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+ {timeString}
+ {timeString}
+ {timeString}
+
+
+
+
+ {secondsString}
+ {secondsString}
+ {secondsString}
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceRadar.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceRadar.svelte
new file mode 100644
index 000000000..1190e6d33
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceRadar.svelte
@@ -0,0 +1,283 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TIME
+ {timeString}
+
+
+
+
+
+
+ SYNC
+
+
+
+ TRAC
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceRailway.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceRailway.svelte
new file mode 100644
index 000000000..1742f64b8
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceRailway.svelte
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
+
+ {#each Array(60) as _, i}
+ {#if i % 5 !== 0}
+
+ {/if}
+ {/each}
+
+
+ {#each Array(12) as _, i}
+
+ {/each}
+
+
+ {#each numbers as num, i}
+
+ {num}
+
+ {/each}
+
+
+
SBB CFF FFS
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceRetro.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceRetro.svelte
new file mode 100644
index 000000000..c863a9520
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceRetro.svelte
@@ -0,0 +1,294 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {#each pixelPatterns[h1] as row}
+
+ {#each row as pixel}
+
+ {/each}
+
+ {/each}
+
+
+ {#each pixelPatterns[h2] as row}
+
+ {#each row as pixel}
+
+ {/each}
+
+ {/each}
+
+
+
+
+ {#each colonPattern as row}
+
+ {#each row as pixel}
+
+ {/each}
+
+ {/each}
+
+
+
+
+ {#each pixelPatterns[m1] as row}
+
+ {#each row as pixel}
+
+ {/each}
+
+ {/each}
+
+
+ {#each pixelPatterns[m2] as row}
+
+ {#each row as pixel}
+
+ {/each}
+
+ {/each}
+
+
+
+
+ {#each colonPattern as row}
+
+ {#each row as pixel}
+
+ {/each}
+
+ {/each}
+
+
+
+
+ {#each pixelPatterns[s1] as row}
+
+ {#each row as pixel}
+
+ {/each}
+
+ {/each}
+
+
+ {#each pixelPatterns[s2] as row}
+
+ {#each row as pixel}
+
+ {/each}
+
+ {/each}
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceSporty.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceSporty.svelte
new file mode 100644
index 000000000..b6b1efcce
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceSporty.svelte
@@ -0,0 +1,313 @@
+
+
+
+
+
+ {#each Array(120) as _, i}
+
+ {/each}
+
+
+
+
+
+
+ {#each Array(60) as _, i}
+
+ {/each}
+
+
+ {#each mainNumbers as { num, angle }}
+
+ {num}
+
+ {/each}
+
+
+
+ CHRONO
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceTerminal.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceTerminal.svelte
new file mode 100644
index 000000000..6fb45e87b
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceTerminal.svelte
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
clock@system:~
+
+
+
+
+
+ $
+ date --format="%T"
+
+
+
+ {timeString}
+
+
+
+ $
+ date --format="%a %b %d"
+
+
+
+ {dateString}
+
+
+
+ $
+ _
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceTypewriter.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceTypewriter.svelte
new file mode 100644
index 000000000..33cbaf696
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceTypewriter.svelte
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {#each digits as digit, i}
+ {#if digit === -1}
+
:
+ {:else}
+
+ {/if}
+ {/each}
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceVintage.svelte b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceVintage.svelte
new file mode 100644
index 000000000..1acb4a3d0
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/ClockFaceVintage.svelte
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#each Array(60) as _, i}
+ {#if i % 5 !== 0}
+
+ {/if}
+ {/each}
+
+
+ {#each Array(12) as _, i}
+
+ {/each}
+
+
+ {#each numbers as num, i}
+
+ {num}
+
+ {/each}
+
+
+
+ VINTAGE
+ EST. 1920
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/clock/apps/web/src/lib/components/clock-faces/index.ts b/apps/clock/apps/web/src/lib/components/clock-faces/index.ts
new file mode 100644
index 000000000..cb5b362fe
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/components/clock-faces/index.ts
@@ -0,0 +1,23 @@
+export { default as ClockFace } from './ClockFace.svelte';
+// Analog faces
+export { default as ClockFaceClassic } from './ClockFaceClassic.svelte';
+export { default as ClockFaceMinimalist } from './ClockFaceMinimalist.svelte';
+export { default as ClockFaceModern } from './ClockFaceModern.svelte';
+export { default as ClockFaceElegant } from './ClockFaceElegant.svelte';
+export { default as ClockFaceSporty } from './ClockFaceSporty.svelte';
+export { default as ClockFaceVintage } from './ClockFaceVintage.svelte';
+export { default as ClockFaceNautical } from './ClockFaceNautical.svelte';
+export { default as ClockFaceIndustrial } from './ClockFaceIndustrial.svelte';
+export { default as ClockFaceBauhaus } from './ClockFaceBauhaus.svelte';
+export { default as ClockFaceRailway } from './ClockFaceRailway.svelte';
+// Digital faces
+export { default as ClockFaceLCD } from './ClockFaceLCD.svelte';
+export { default as ClockFaceFlip } from './ClockFaceFlip.svelte';
+export { default as ClockFaceMatrix } from './ClockFaceMatrix.svelte';
+export { default as ClockFaceNeon } from './ClockFaceNeon.svelte';
+export { default as ClockFaceBinary } from './ClockFaceBinary.svelte';
+export { default as ClockFaceRetro } from './ClockFaceRetro.svelte';
+export { default as ClockFaceGradient } from './ClockFaceGradient.svelte';
+export { default as ClockFaceTerminal } from './ClockFaceTerminal.svelte';
+export { default as ClockFaceTypewriter } from './ClockFaceTypewriter.svelte';
+export { default as ClockFaceRadar } from './ClockFaceRadar.svelte';
diff --git a/apps/clock/apps/web/src/lib/i18n/locales/de.json b/apps/clock/apps/web/src/lib/i18n/locales/de.json
index fe408d26b..d892c7aba 100644
--- a/apps/clock/apps/web/src/lib/i18n/locales/de.json
+++ b/apps/clock/apps/web/src/lib/i18n/locales/de.json
@@ -84,7 +84,13 @@
"noLaps": "Noch keine Runden",
"best": "Beste",
"worst": "Längste",
- "total": "Gesamt"
+ "total": "Gesamt",
+ "new": "Neu",
+ "continue": "Weiter",
+ "noStopwatches": "Keine Stoppuhren",
+ "noStopwatchesDescription": "Starte deine erste Stoppuhr, um mehrere Zeitmessungen parallel zu verfolgen.",
+ "startFirst": "Erste Stoppuhr starten",
+ "otherStopwatches": "Weitere Stoppuhren"
},
"pomodoro": {
"title": "Pomodoro",
@@ -144,6 +150,96 @@
"ok": "OK",
"loading": "Laden...",
"error": "Fehler",
- "success": "Erfolg"
+ "success": "Erfolg",
+ "back": "Zurück"
+ },
+ "clockFaces": {
+ "title": "Zifferblätter",
+ "subtitle": "Wähle dein bevorzugtes Uhren-Design für die Startseite",
+ "customize": "Zifferblatt anpassen",
+ "currentSelection": "Aktuelle Auswahl",
+ "analog": "Analoge Uhren",
+ "digital": "Digitale Uhren",
+ "selected": "Ausgewählt",
+ "classic": {
+ "name": "Klassisch",
+ "description": "Elegante Uhr mit römischen Ziffern"
+ },
+ "minimalist": {
+ "name": "Minimalistisch",
+ "description": "Schlichtes Design mit Stundenmarkierungen"
+ },
+ "modern": {
+ "name": "Modern",
+ "description": "Zeitgemäßer Stil mit arabischen Zahlen"
+ },
+ "elegant": {
+ "name": "Elegant",
+ "description": "Luxuriöse goldene Akzente"
+ },
+ "sporty": {
+ "name": "Sportlich",
+ "description": "Dynamisches Design wie bei Sportuhren"
+ },
+ "lcd": {
+ "name": "LCD",
+ "description": "Klassisches 7-Segment LCD-Display"
+ },
+ "flip": {
+ "name": "Fallblatt",
+ "description": "Retro-Stil wie alte Bahnhofsuhren"
+ },
+ "matrix": {
+ "name": "Matrix",
+ "description": "Punktmatrix LED-Anzeige"
+ },
+ "neon": {
+ "name": "Neon",
+ "description": "Leuchtender Neonröhren-Effekt"
+ },
+ "binary": {
+ "name": "Binär",
+ "description": "Zeit im Binärformat dargestellt"
+ },
+ "vintage": {
+ "name": "Vintage",
+ "description": "Antike Uhr mit gealterter Patina"
+ },
+ "nautical": {
+ "name": "Nautisch",
+ "description": "Marine-Stil mit Messing-Schiffsuhr"
+ },
+ "industrial": {
+ "name": "Industrie",
+ "description": "Fabrik-Stil mit Metall-Akzenten"
+ },
+ "bauhaus": {
+ "name": "Bauhaus",
+ "description": "Geometrisches Design mit Primärfarben"
+ },
+ "railway": {
+ "name": "Bahnhof",
+ "description": "Schweizer Bahnhofsuhr-Design"
+ },
+ "retro": {
+ "name": "Retro",
+ "description": "Pixel-Stil CRT-Anzeige"
+ },
+ "gradient": {
+ "name": "Farbverlauf",
+ "description": "Moderne Anzeige mit Farbwechsel"
+ },
+ "terminal": {
+ "name": "Terminal",
+ "description": "Kommandozeilen-Interface-Stil"
+ },
+ "typewriter": {
+ "name": "Schreibmaschine",
+ "description": "Vintage mechanischer Tastatur-Stil"
+ },
+ "radar": {
+ "name": "Radar",
+ "description": "Militär-Radarschirm-Anzeige"
+ }
}
}
diff --git a/apps/clock/apps/web/src/lib/i18n/locales/en.json b/apps/clock/apps/web/src/lib/i18n/locales/en.json
index 13578d206..651a8e254 100644
--- a/apps/clock/apps/web/src/lib/i18n/locales/en.json
+++ b/apps/clock/apps/web/src/lib/i18n/locales/en.json
@@ -84,7 +84,13 @@
"noLaps": "No laps yet",
"best": "Best",
"worst": "Worst",
- "total": "Total"
+ "total": "Total",
+ "new": "New",
+ "continue": "Continue",
+ "noStopwatches": "No Stopwatches",
+ "noStopwatchesDescription": "Start your first stopwatch to track multiple time measurements simultaneously.",
+ "startFirst": "Start First Stopwatch",
+ "otherStopwatches": "Other Stopwatches"
},
"pomodoro": {
"title": "Pomodoro",
@@ -144,6 +150,96 @@
"ok": "OK",
"loading": "Loading...",
"error": "Error",
- "success": "Success"
+ "success": "Success",
+ "back": "Back"
+ },
+ "clockFaces": {
+ "title": "Clock Faces",
+ "subtitle": "Choose your preferred clock design for the homepage",
+ "customize": "Customize Clock",
+ "currentSelection": "Current Selection",
+ "analog": "Analog Clocks",
+ "digital": "Digital Clocks",
+ "selected": "Selected",
+ "classic": {
+ "name": "Classic",
+ "description": "Elegant clock with Roman numerals"
+ },
+ "minimalist": {
+ "name": "Minimalist",
+ "description": "Clean design with only hour markers"
+ },
+ "modern": {
+ "name": "Modern",
+ "description": "Contemporary style with Arabic numerals"
+ },
+ "elegant": {
+ "name": "Elegant",
+ "description": "Luxurious golden accents"
+ },
+ "sporty": {
+ "name": "Sporty",
+ "description": "Bold design inspired by sports watches"
+ },
+ "lcd": {
+ "name": "LCD",
+ "description": "Classic 7-segment LCD display"
+ },
+ "flip": {
+ "name": "Flip Clock",
+ "description": "Retro split-flap display style"
+ },
+ "matrix": {
+ "name": "Matrix",
+ "description": "Dot matrix LED display"
+ },
+ "neon": {
+ "name": "Neon",
+ "description": "Glowing neon tube effect"
+ },
+ "binary": {
+ "name": "Binary",
+ "description": "Time displayed in binary format"
+ },
+ "vintage": {
+ "name": "Vintage",
+ "description": "Antique clock with aged patina"
+ },
+ "nautical": {
+ "name": "Nautical",
+ "description": "Marine-inspired brass ship clock"
+ },
+ "industrial": {
+ "name": "Industrial",
+ "description": "Factory-style with metal accents"
+ },
+ "bauhaus": {
+ "name": "Bauhaus",
+ "description": "Geometric design with primary colors"
+ },
+ "railway": {
+ "name": "Railway",
+ "description": "Swiss railway station clock style"
+ },
+ "retro": {
+ "name": "Retro",
+ "description": "Pixel-style CRT display"
+ },
+ "gradient": {
+ "name": "Gradient",
+ "description": "Modern display with color shifts"
+ },
+ "terminal": {
+ "name": "Terminal",
+ "description": "Command-line interface style"
+ },
+ "typewriter": {
+ "name": "Typewriter",
+ "description": "Vintage mechanical keyboard style"
+ },
+ "radar": {
+ "name": "Radar",
+ "description": "Military radar screen display"
+ }
}
}
diff --git a/apps/clock/apps/web/src/lib/i18n/locales/es.json b/apps/clock/apps/web/src/lib/i18n/locales/es.json
index a4f97497d..52a5f75c4 100644
--- a/apps/clock/apps/web/src/lib/i18n/locales/es.json
+++ b/apps/clock/apps/web/src/lib/i18n/locales/es.json
@@ -84,7 +84,13 @@
"noLaps": "Aún no hay vueltas",
"best": "Mejor",
"worst": "Peor",
- "total": "Total"
+ "total": "Total",
+ "new": "Nuevo",
+ "continue": "Continuar",
+ "noStopwatches": "Sin cronómetros",
+ "noStopwatchesDescription": "Inicia tu primer cronómetro para seguir múltiples mediciones de tiempo simultáneamente.",
+ "startFirst": "Iniciar primer cronómetro",
+ "otherStopwatches": "Otros cronómetros"
},
"pomodoro": {
"title": "Pomodoro",
@@ -144,6 +150,96 @@
"ok": "OK",
"loading": "Cargando...",
"error": "Error",
- "success": "Éxito"
+ "success": "Éxito",
+ "back": "Volver"
+ },
+ "clockFaces": {
+ "title": "Esferas de Reloj",
+ "subtitle": "Elige tu diseño de reloj preferido para la página de inicio",
+ "customize": "Personalizar reloj",
+ "currentSelection": "Selección actual",
+ "analog": "Relojes analógicos",
+ "digital": "Relojes digitales",
+ "selected": "Seleccionado",
+ "classic": {
+ "name": "Clásico",
+ "description": "Reloj elegante con números romanos"
+ },
+ "minimalist": {
+ "name": "Minimalista",
+ "description": "Diseño limpio con marcadores de hora"
+ },
+ "modern": {
+ "name": "Moderno",
+ "description": "Estilo contemporáneo con números árabes"
+ },
+ "elegant": {
+ "name": "Elegante",
+ "description": "Acentos dorados de lujo"
+ },
+ "sporty": {
+ "name": "Deportivo",
+ "description": "Diseño audaz inspirado en relojes deportivos"
+ },
+ "lcd": {
+ "name": "LCD",
+ "description": "Pantalla LCD clásica de 7 segmentos"
+ },
+ "flip": {
+ "name": "Flip",
+ "description": "Estilo retro de paneles giratorios"
+ },
+ "matrix": {
+ "name": "Matriz",
+ "description": "Pantalla LED de matriz de puntos"
+ },
+ "neon": {
+ "name": "Neón",
+ "description": "Efecto de tubo de neón brillante"
+ },
+ "binary": {
+ "name": "Binario",
+ "description": "Hora mostrada en formato binario"
+ },
+ "vintage": {
+ "name": "Vintage",
+ "description": "Reloj antiguo con pátina envejecida"
+ },
+ "nautical": {
+ "name": "Náutico",
+ "description": "Reloj de barco de latón estilo marino"
+ },
+ "industrial": {
+ "name": "Industrial",
+ "description": "Estilo fábrica con acentos metálicos"
+ },
+ "bauhaus": {
+ "name": "Bauhaus",
+ "description": "Diseño geométrico con colores primarios"
+ },
+ "railway": {
+ "name": "Estación",
+ "description": "Estilo reloj de estación suiza"
+ },
+ "retro": {
+ "name": "Retro",
+ "description": "Pantalla CRT estilo pixel"
+ },
+ "gradient": {
+ "name": "Degradado",
+ "description": "Pantalla moderna con cambios de color"
+ },
+ "terminal": {
+ "name": "Terminal",
+ "description": "Estilo interfaz de línea de comandos"
+ },
+ "typewriter": {
+ "name": "Máquina de escribir",
+ "description": "Estilo teclado mecánico vintage"
+ },
+ "radar": {
+ "name": "Radar",
+ "description": "Pantalla de radar militar"
+ }
}
}
diff --git a/apps/clock/apps/web/src/lib/i18n/locales/fr.json b/apps/clock/apps/web/src/lib/i18n/locales/fr.json
index c0ae83353..d07dc48e1 100644
--- a/apps/clock/apps/web/src/lib/i18n/locales/fr.json
+++ b/apps/clock/apps/web/src/lib/i18n/locales/fr.json
@@ -84,7 +84,13 @@
"noLaps": "Pas encore de tours",
"best": "Meilleur",
"worst": "Pire",
- "total": "Total"
+ "total": "Total",
+ "new": "Nouveau",
+ "continue": "Continuer",
+ "noStopwatches": "Aucun chronomètre",
+ "noStopwatchesDescription": "Démarrez votre premier chronomètre pour suivre plusieurs mesures de temps simultanément.",
+ "startFirst": "Démarrer le premier chronomètre",
+ "otherStopwatches": "Autres chronomètres"
},
"pomodoro": {
"title": "Pomodoro",
@@ -144,6 +150,96 @@
"ok": "OK",
"loading": "Chargement...",
"error": "Erreur",
- "success": "Succès"
+ "success": "Succès",
+ "back": "Retour"
+ },
+ "clockFaces": {
+ "title": "Cadrans",
+ "subtitle": "Choisissez votre design d'horloge préféré pour la page d'accueil",
+ "customize": "Personnaliser l'horloge",
+ "currentSelection": "Sélection actuelle",
+ "analog": "Horloges analogiques",
+ "digital": "Horloges numériques",
+ "selected": "Sélectionné",
+ "classic": {
+ "name": "Classique",
+ "description": "Horloge élégante avec chiffres romains"
+ },
+ "minimalist": {
+ "name": "Minimaliste",
+ "description": "Design épuré avec marqueurs d'heures"
+ },
+ "modern": {
+ "name": "Moderne",
+ "description": "Style contemporain avec chiffres arabes"
+ },
+ "elegant": {
+ "name": "Élégant",
+ "description": "Accents dorés luxueux"
+ },
+ "sporty": {
+ "name": "Sportif",
+ "description": "Design audacieux inspiré des montres de sport"
+ },
+ "lcd": {
+ "name": "LCD",
+ "description": "Affichage LCD classique à 7 segments"
+ },
+ "flip": {
+ "name": "Flip",
+ "description": "Style rétro à volets"
+ },
+ "matrix": {
+ "name": "Matrice",
+ "description": "Affichage LED à matrice de points"
+ },
+ "neon": {
+ "name": "Néon",
+ "description": "Effet tube néon lumineux"
+ },
+ "binary": {
+ "name": "Binaire",
+ "description": "Heure affichée en format binaire"
+ },
+ "vintage": {
+ "name": "Vintage",
+ "description": "Horloge ancienne avec patine vieillie"
+ },
+ "nautical": {
+ "name": "Nautique",
+ "description": "Horloge de navire en laiton style marin"
+ },
+ "industrial": {
+ "name": "Industriel",
+ "description": "Style usine avec accents métalliques"
+ },
+ "bauhaus": {
+ "name": "Bauhaus",
+ "description": "Design géométrique avec couleurs primaires"
+ },
+ "railway": {
+ "name": "Gare",
+ "description": "Style horloge de gare suisse"
+ },
+ "retro": {
+ "name": "Rétro",
+ "description": "Affichage CRT style pixel"
+ },
+ "gradient": {
+ "name": "Dégradé",
+ "description": "Affichage moderne avec changements de couleur"
+ },
+ "terminal": {
+ "name": "Terminal",
+ "description": "Style interface ligne de commande"
+ },
+ "typewriter": {
+ "name": "Machine à écrire",
+ "description": "Style clavier mécanique vintage"
+ },
+ "radar": {
+ "name": "Radar",
+ "description": "Affichage écran radar militaire"
+ }
}
}
diff --git a/apps/clock/apps/web/src/lib/i18n/locales/it.json b/apps/clock/apps/web/src/lib/i18n/locales/it.json
index adb22bca4..9cd4f4f4a 100644
--- a/apps/clock/apps/web/src/lib/i18n/locales/it.json
+++ b/apps/clock/apps/web/src/lib/i18n/locales/it.json
@@ -84,7 +84,13 @@
"noLaps": "Nessun giro ancora",
"best": "Migliore",
"worst": "Peggiore",
- "total": "Totale"
+ "total": "Totale",
+ "new": "Nuovo",
+ "continue": "Continua",
+ "noStopwatches": "Nessun cronometro",
+ "noStopwatchesDescription": "Avvia il tuo primo cronometro per tracciare più misurazioni di tempo contemporaneamente.",
+ "startFirst": "Avvia primo cronometro",
+ "otherStopwatches": "Altri cronometri"
},
"pomodoro": {
"title": "Pomodoro",
@@ -144,6 +150,96 @@
"ok": "OK",
"loading": "Caricamento...",
"error": "Errore",
- "success": "Successo"
+ "success": "Successo",
+ "back": "Indietro"
+ },
+ "clockFaces": {
+ "title": "Quadranti",
+ "subtitle": "Scegli il tuo design di orologio preferito per la home",
+ "customize": "Personalizza orologio",
+ "currentSelection": "Selezione attuale",
+ "analog": "Orologi analogici",
+ "digital": "Orologi digitali",
+ "selected": "Selezionato",
+ "classic": {
+ "name": "Classico",
+ "description": "Orologio elegante con numeri romani"
+ },
+ "minimalist": {
+ "name": "Minimalista",
+ "description": "Design pulito con marcatori delle ore"
+ },
+ "modern": {
+ "name": "Moderno",
+ "description": "Stile contemporaneo con numeri arabi"
+ },
+ "elegant": {
+ "name": "Elegante",
+ "description": "Accenti dorati di lusso"
+ },
+ "sporty": {
+ "name": "Sportivo",
+ "description": "Design audace ispirato agli orologi sportivi"
+ },
+ "lcd": {
+ "name": "LCD",
+ "description": "Display LCD classico a 7 segmenti"
+ },
+ "flip": {
+ "name": "Flip",
+ "description": "Stile retrò a palette"
+ },
+ "matrix": {
+ "name": "Matrice",
+ "description": "Display LED a matrice di punti"
+ },
+ "neon": {
+ "name": "Neon",
+ "description": "Effetto tubo neon luminoso"
+ },
+ "binary": {
+ "name": "Binario",
+ "description": "Ora visualizzata in formato binario"
+ },
+ "vintage": {
+ "name": "Vintage",
+ "description": "Orologio antico con patina invecchiata"
+ },
+ "nautical": {
+ "name": "Nautico",
+ "description": "Orologio da nave in ottone stile marino"
+ },
+ "industrial": {
+ "name": "Industriale",
+ "description": "Stile fabbrica con accenti metallici"
+ },
+ "bauhaus": {
+ "name": "Bauhaus",
+ "description": "Design geometrico con colori primari"
+ },
+ "railway": {
+ "name": "Stazione",
+ "description": "Stile orologio stazione svizzera"
+ },
+ "retro": {
+ "name": "Retro",
+ "description": "Display CRT stile pixel"
+ },
+ "gradient": {
+ "name": "Sfumato",
+ "description": "Display moderno con cambi di colore"
+ },
+ "terminal": {
+ "name": "Terminale",
+ "description": "Stile interfaccia riga di comando"
+ },
+ "typewriter": {
+ "name": "Macchina da scrivere",
+ "description": "Stile tastiera meccanica vintage"
+ },
+ "radar": {
+ "name": "Radar",
+ "description": "Display schermo radar militare"
+ }
}
}
diff --git a/apps/clock/apps/web/src/lib/stores/clock-face.svelte.ts b/apps/clock/apps/web/src/lib/stores/clock-face.svelte.ts
new file mode 100644
index 000000000..da77ab911
--- /dev/null
+++ b/apps/clock/apps/web/src/lib/stores/clock-face.svelte.ts
@@ -0,0 +1,280 @@
+/**
+ * Clock Face store for Clock app
+ * Manages the selected clock face style for the homepage
+ * SSR-safe implementation with localStorage persistence
+ */
+
+import { browser } from '$app/environment';
+
+// Storage key
+const CLOCK_FACE_KEY = 'clock-selected-face';
+
+// Available clock face types
+export type ClockFaceType =
+ // Analog faces
+ | 'classic'
+ | 'minimalist'
+ | 'modern'
+ | 'elegant'
+ | 'sporty'
+ | 'vintage'
+ | 'nautical'
+ | 'industrial'
+ | 'bauhaus'
+ | 'railway'
+ // Digital faces
+ | 'lcd'
+ | 'flip'
+ | 'matrix'
+ | 'neon'
+ | 'binary'
+ | 'retro'
+ | 'gradient'
+ | 'terminal'
+ | 'typewriter'
+ | 'radar';
+
+export interface ClockFaceDefinition {
+ id: ClockFaceType;
+ name: string;
+ nameKey: string;
+ description: string;
+ descriptionKey: string;
+ category: 'analog' | 'digital';
+}
+
+// All available clock faces
+export const CLOCK_FACES: ClockFaceDefinition[] = [
+ // Analog faces
+ {
+ id: 'classic',
+ name: 'Classic',
+ nameKey: 'clockFaces.classic.name',
+ description: 'Elegant clock with Roman numerals',
+ descriptionKey: 'clockFaces.classic.description',
+ category: 'analog',
+ },
+ {
+ id: 'minimalist',
+ name: 'Minimalist',
+ nameKey: 'clockFaces.minimalist.name',
+ description: 'Clean design with only hour markers',
+ descriptionKey: 'clockFaces.minimalist.description',
+ category: 'analog',
+ },
+ {
+ id: 'modern',
+ name: 'Modern',
+ nameKey: 'clockFaces.modern.name',
+ description: 'Contemporary style with Arabic numerals',
+ descriptionKey: 'clockFaces.modern.description',
+ category: 'analog',
+ },
+ {
+ id: 'elegant',
+ name: 'Elegant',
+ nameKey: 'clockFaces.elegant.name',
+ description: 'Luxurious golden accents',
+ descriptionKey: 'clockFaces.elegant.description',
+ category: 'analog',
+ },
+ {
+ id: 'sporty',
+ name: 'Sporty',
+ nameKey: 'clockFaces.sporty.name',
+ description: 'Bold design inspired by sports watches',
+ descriptionKey: 'clockFaces.sporty.description',
+ category: 'analog',
+ },
+ {
+ id: 'vintage',
+ name: 'Vintage',
+ nameKey: 'clockFaces.vintage.name',
+ description: 'Antique clock with aged patina',
+ descriptionKey: 'clockFaces.vintage.description',
+ category: 'analog',
+ },
+ {
+ id: 'nautical',
+ name: 'Nautical',
+ nameKey: 'clockFaces.nautical.name',
+ description: 'Marine-inspired brass ship clock',
+ descriptionKey: 'clockFaces.nautical.description',
+ category: 'analog',
+ },
+ {
+ id: 'industrial',
+ name: 'Industrial',
+ nameKey: 'clockFaces.industrial.name',
+ description: 'Factory-style with metal accents',
+ descriptionKey: 'clockFaces.industrial.description',
+ category: 'analog',
+ },
+ {
+ id: 'bauhaus',
+ name: 'Bauhaus',
+ nameKey: 'clockFaces.bauhaus.name',
+ description: 'Geometric design with primary colors',
+ descriptionKey: 'clockFaces.bauhaus.description',
+ category: 'analog',
+ },
+ {
+ id: 'railway',
+ name: 'Railway',
+ nameKey: 'clockFaces.railway.name',
+ description: 'Swiss railway station clock style',
+ descriptionKey: 'clockFaces.railway.description',
+ category: 'analog',
+ },
+ // Digital faces
+ {
+ id: 'lcd',
+ name: 'LCD',
+ nameKey: 'clockFaces.lcd.name',
+ description: 'Classic 7-segment LCD display',
+ descriptionKey: 'clockFaces.lcd.description',
+ category: 'digital',
+ },
+ {
+ id: 'flip',
+ name: 'Flip Clock',
+ nameKey: 'clockFaces.flip.name',
+ description: 'Retro split-flap display style',
+ descriptionKey: 'clockFaces.flip.description',
+ category: 'digital',
+ },
+ {
+ id: 'matrix',
+ name: 'Matrix',
+ nameKey: 'clockFaces.matrix.name',
+ description: 'Dot matrix LED display',
+ descriptionKey: 'clockFaces.matrix.description',
+ category: 'digital',
+ },
+ {
+ id: 'neon',
+ name: 'Neon',
+ nameKey: 'clockFaces.neon.name',
+ description: 'Glowing neon tube effect',
+ descriptionKey: 'clockFaces.neon.description',
+ category: 'digital',
+ },
+ {
+ id: 'binary',
+ name: 'Binary',
+ nameKey: 'clockFaces.binary.name',
+ description: 'Time displayed in binary format',
+ descriptionKey: 'clockFaces.binary.description',
+ category: 'digital',
+ },
+ {
+ id: 'retro',
+ name: 'Retro',
+ nameKey: 'clockFaces.retro.name',
+ description: 'Pixel-style CRT display',
+ descriptionKey: 'clockFaces.retro.description',
+ category: 'digital',
+ },
+ {
+ id: 'gradient',
+ name: 'Gradient',
+ nameKey: 'clockFaces.gradient.name',
+ description: 'Modern display with color shifts',
+ descriptionKey: 'clockFaces.gradient.description',
+ category: 'digital',
+ },
+ {
+ id: 'terminal',
+ name: 'Terminal',
+ nameKey: 'clockFaces.terminal.name',
+ description: 'Command-line interface style',
+ descriptionKey: 'clockFaces.terminal.description',
+ category: 'digital',
+ },
+ {
+ id: 'typewriter',
+ name: 'Typewriter',
+ nameKey: 'clockFaces.typewriter.name',
+ description: 'Vintage mechanical keyboard style',
+ descriptionKey: 'clockFaces.typewriter.description',
+ category: 'digital',
+ },
+ {
+ id: 'radar',
+ name: 'Radar',
+ nameKey: 'clockFaces.radar.name',
+ description: 'Military radar screen display',
+ descriptionKey: 'clockFaces.radar.description',
+ category: 'digital',
+ },
+];
+
+// Default clock face
+const DEFAULT_FACE: ClockFaceType = 'modern';
+
+// State
+let selectedFace = $state(DEFAULT_FACE);
+let initialized = $state(false);
+
+export const clockFaceStore = {
+ // Getters
+ get selectedFace(): ClockFaceType {
+ return selectedFace ?? DEFAULT_FACE;
+ },
+ get initialized(): boolean {
+ return initialized;
+ },
+ get faces(): ClockFaceDefinition[] {
+ return CLOCK_FACES;
+ },
+ get analogFaces(): ClockFaceDefinition[] {
+ return CLOCK_FACES.filter((f) => f.category === 'analog');
+ },
+ get digitalFaces(): ClockFaceDefinition[] {
+ return CLOCK_FACES.filter((f) => f.category === 'digital');
+ },
+ get currentFace(): ClockFaceDefinition | undefined {
+ return CLOCK_FACES.find((f) => f.id === selectedFace);
+ },
+
+ /**
+ * Initialize from localStorage (client-side only)
+ */
+ initialize() {
+ if (!browser) return;
+ if (initialized) return;
+
+ const saved = localStorage.getItem(CLOCK_FACE_KEY) as ClockFaceType | null;
+ if (saved && CLOCK_FACES.some((f) => f.id === saved)) {
+ selectedFace = saved;
+ }
+
+ initialized = true;
+ },
+
+ /**
+ * Set the selected clock face
+ */
+ setFace(face: ClockFaceType) {
+ if (!CLOCK_FACES.some((f) => f.id === face)) return;
+
+ selectedFace = face;
+ if (browser) {
+ localStorage.setItem(CLOCK_FACE_KEY, face);
+ }
+ },
+
+ /**
+ * Check if a face is analog
+ */
+ isAnalog(face: ClockFaceType): boolean {
+ return CLOCK_FACES.find((f) => f.id === face)?.category === 'analog';
+ },
+
+ /**
+ * Check if a face is digital
+ */
+ isDigital(face: ClockFaceType): boolean {
+ return CLOCK_FACES.find((f) => f.id === face)?.category === 'digital';
+ },
+};
diff --git a/apps/clock/apps/web/src/routes/clock-faces/+page.svelte b/apps/clock/apps/web/src/routes/clock-faces/+page.svelte
new file mode 100644
index 000000000..64f2ac2c7
--- /dev/null
+++ b/apps/clock/apps/web/src/routes/clock-faces/+page.svelte
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
{$_('clockFaces.currentSelection')}
+
+
+
+
+ {$_(CLOCK_FACES.find((f) => f.id === selectedFace)?.nameKey || '')}
+
+
+
+
+
+
+ {$_('clockFaces.analog')}
+
+ {#each analogFaces as face}
+
+ {/each}
+
+
+
+
+
+ {$_('clockFaces.digital')}
+
+ {#each digitalFaces as face}
+
+ {/each}
+
+
+
+
+