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 @@ + + +
+
+ +
+
+
H
+
H
+
+
M
+
M
+
+
S
+
S
+
+ + +
+
8
+
+
+
+
+
+
+
+
+
+ + +
+
4
+
+
+
+
+
+
+
+
+
+ + +
+
2
+
+
+
+
+
+
+
+
+
+ + +
+
1
+
+
+
+
+
+
+
+
+
+ + +
+ {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} +
+
= 5}> + {digit} +
+
+
+ {/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} +
+
+
+ +