diff --git a/src/lib/components/ui/accordion/accordion-content.svelte b/src/lib/components/ui/accordion/accordion-content.svelte new file mode 100644 index 0000000..f2cfe88 --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-content.svelte @@ -0,0 +1,24 @@ + + + +
+ {@render children?.()} +
+
diff --git a/src/lib/components/ui/accordion/accordion-item.svelte b/src/lib/components/ui/accordion/accordion-item.svelte new file mode 100644 index 0000000..852bcf3 --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-item.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/accordion/accordion-trigger.svelte b/src/lib/components/ui/accordion/accordion-trigger.svelte new file mode 100644 index 0000000..6c033b9 --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-trigger.svelte @@ -0,0 +1,31 @@ + + + + svg]:rotate-180", + className + )} + {...restProps} + > + {@render children?.()} + + + diff --git a/src/lib/components/ui/accordion/index.ts b/src/lib/components/ui/accordion/index.ts new file mode 100644 index 0000000..3fc36e7 --- /dev/null +++ b/src/lib/components/ui/accordion/index.ts @@ -0,0 +1,17 @@ +import { Accordion as AccordionPrimitive } from "bits-ui"; +import Content from "./accordion-content.svelte"; +import Item from "./accordion-item.svelte"; +import Trigger from "./accordion-trigger.svelte"; + +const Root = AccordionPrimitive.Root; +export { + Root, + Content, + Item, + Trigger, + // + Root as Accordion, + Content as AccordionContent, + Item as AccordionItem, + Trigger as AccordionTrigger, +}; diff --git a/src/lib/config.ts b/src/lib/config.ts index 5d94a36..bbcdccf 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -15,6 +15,11 @@ export const games: GamesObj = { image: '', description: 'Sorteeri kolme suvalise muusika albumi pealkiri, artistid ja pilt.' }, + '/epochalypse': { + name: 'Epochalypse', + image: '', + description: 'Varsti veel üks Y2K. Kui nostalgiline!' + }, '': { name: 'Rohkem mänge soon™', image: '', diff --git a/src/lib/types.ts b/src/lib/types.ts index 51aa872..3b5a6c1 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -29,3 +29,12 @@ export type Game = { }; export type GamesObj = Record; + +export interface TimeRemaining { + years: number; + months: number; + days: number; + hours: number; + minutes: number; + seconds: number; +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 87577a1..3aa7e67 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,5 +1,6 @@ import { type ClassValue, clsx } from 'clsx'; import { twMerge } from 'tailwind-merge'; +import type { TimeRemaining } from './types'; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); @@ -109,3 +110,55 @@ export function truncate(text: string, maxLength: number): string { return text.slice(0, cutoffIndex).trim() + ellipsis; } + +// Created using Claude 3.5 Sonett +export function getTimeRemaining(currentTime: Date, targetTime: Date): TimeRemaining { + // Convert both dates to milliseconds and get the difference + let delta = targetTime.getTime() - currentTime.getTime(); + + // If target is in the past, return all zeros + if (delta < 0) { + return { + years: 0, + months: 0, + days: 0, + hours: 0, + minutes: 0, + seconds: 0 + }; + } + + // Calculate each unit + const millisecondsPerSecond = 1000; + const millisecondsPerMinute = millisecondsPerSecond * 60; + const millisecondsPerHour = millisecondsPerMinute * 60; + const millisecondsPerDay = millisecondsPerHour * 24; + const millisecondsPerMonth = millisecondsPerDay * 30.436875; // Average month length + const millisecondsPerYear = millisecondsPerDay * 365.2425; // Average year length + + const years = Math.floor(delta / millisecondsPerYear); + delta -= years * millisecondsPerYear; + + const months = Math.floor(delta / millisecondsPerMonth); + delta -= months * millisecondsPerMonth; + + const days = Math.floor(delta / millisecondsPerDay); + delta -= days * millisecondsPerDay; + + const hours = Math.floor(delta / millisecondsPerHour); + delta -= hours * millisecondsPerHour; + + const minutes = Math.floor(delta / millisecondsPerMinute); + delta -= minutes * millisecondsPerMinute; + + const seconds = Math.floor(delta / millisecondsPerSecond); + + return { + years, + months, + days, + hours, + minutes, + seconds + }; +} diff --git a/src/routes/(games)/epochalypse/+page.svelte b/src/routes/(games)/epochalypse/+page.svelte new file mode 100644 index 0000000..3356ee9 --- /dev/null +++ b/src/routes/(games)/epochalypse/+page.svelte @@ -0,0 +1,108 @@ + + +{#snippet clockDigit(nr: number)} +
{String(nr).padStart(2, '0')}
+{/snippet} + +{#snippet clockStage(count: number, index: number, title: string, divider = true)} +
+
+
+ {#each { length: count } as _, i} + {@render clockDigit(i)} + {/each} +
+
+ +

{title}

+
+ {#if divider} +

:

+ {/if} +{/snippet} + +
+

Epochalypse

+

Ära muretse! Sul on veel aega:

+
+
+
+ {@render clockStage(13, timeUntil.years, 'aastat')} + {@render clockStage(13, timeUntil.months, 'kuud')} + {@render clockStage(31, timeUntil.days, 'päeva')} + {@render clockStage(24, timeUntil.hours, 'tundi')} + {@render clockStage(60, timeUntil.minutes, 'minutit')} + {@render clockStage(60, timeUntil.seconds, 'sekundit', false)} +
+ + + + Mis asi see on?? + +

+ Epochalypse nimeline probleem on sarnane 1990 lõpus toimunud Y2K-le
+ Laialdaselt kasutatud süsteem aja ja kuupäeva märkimiseks saab otsa. +

+

+ Enamus Linuxi baasiga Operatsioonisüsteeme kasutab aja märkimiseks UNIX aega + - mitu sekundit on möödunud UNIX epoch-ist 00:00:00 19.01.1970 UTC. +

+

+ Neid sekundeid hoitaks signed 32-bit täisarvuna. Selle andmetüübi maksimaalne + väärtus on + 231-1. Viimane kuupäev (UNIX epoch + 231-1) on 03:14:07 19.01.2038 UTC. +

+

+ Sekund pärast seda, kui arvutid lisavad ajale sekundi juurde, juhtub täisarvu ületäitumine + ja aja väärtuseks saab + -231.
+ Arvutid loevad seda kui 20:45:52 13.12.1901 UTC, ehk varaseim võimalik aeg + UNIX aja järgi. +

+
+
+
+