/* IMPORT */ import {$, render, useAnimationLoop} from 'voby'; import type {Observable} from 'voby'; /* HELPERS */ const mapRange = ( start: number, end: number, increment: number, callback: (( nr: number ) => T) ): T[] => { const results: T[] = []; for ( let i = start; i < end; i += increment ) { results.push ( callback ( i ) ); } return results; }; const getMillisecondsSinceMidnight = (): number => { const now = Date.now (); const midnight = new Date ().setHours ( 0, 0, 0, 0 ); return now - midnight; }; /* MAIN */ const useTime = () => { const time = $( getMillisecondsSinceMidnight () / 1000 ); const tick = () => time ( getMillisecondsSinceMidnight () / 1000 ); useAnimationLoop ( tick ); return time; }; const ClockFace = ({ time }: { time: Observable }): JSX.Element => { const abstract = ( rotate: number ) => `rotate(${(rotate * 360).toFixed ( 1 )})`; const millisecond = () => abstract ( time () % 1 ); const second = () => abstract ( ( time () % 60 ) / 60 ); const minute = () => abstract ( ( time () / 60 % 60 ) / 60 ); const hour = () => abstract ( ( time () / 60 / 60 % 12 ) / 12 ); return ( {mapRange ( 0, 60, 1, i => ( ))} {mapRange ( 0, 12, 1, i => ( ))} ); }; const Clock = (): JSX.Element => { const time = useTime (); return (
); }; /* RENDER */ render ( , document.getElementById ( 'app' ) );