diff --git a/src/App.css b/src/App.css deleted file mode 100644 index 74b5e05..0000000 --- a/src/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/src/App.js b/src/App.js index 99026ec..8c247d4 100644 --- a/src/App.js +++ b/src/App.js @@ -1,10 +1,11 @@ +import WallClock from "./apps-top/wall-clock/WallClock"; import Menu from "./menus/Menu"; function App() { return (
- SOON +

diff --git a/src/App.scss b/src/App.scss index a533b66..dfcd975 100644 --- a/src/App.scss +++ b/src/App.scss @@ -26,7 +26,8 @@ hr { display: block; } .app-top { - height: 150px; + min-height: 150px; + padding: 20px 0; display: flex; justify-content: center; align-items: center; diff --git a/src/App.test.js b/src/App.test.js deleted file mode 100644 index 1f03afe..0000000 --- a/src/App.test.js +++ /dev/null @@ -1,8 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import App from './App'; - -test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); -}); diff --git a/src/apps-top/wall-clock/WallClock.js b/src/apps-top/wall-clock/WallClock.js new file mode 100644 index 0000000..a431dec --- /dev/null +++ b/src/apps-top/wall-clock/WallClock.js @@ -0,0 +1,47 @@ +import { useEffect, useState } from "react" +import './index.css'; +import { getTimeNowInSeconds } from "./utils"; + +export default function WallClock() { + const [initialTime, setInitialTime] = useState(getTimeNowInSeconds()); + + useEffect(() => { + setInitialTime(getTimeNowInSeconds()); + },[]); + + return ( +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ ); +} \ No newline at end of file diff --git a/src/apps-top/wall-clock/index.css b/src/apps-top/wall-clock/index.css new file mode 100644 index 0000000..068693c --- /dev/null +++ b/src/apps-top/wall-clock/index.css @@ -0,0 +1,175 @@ +.wall-clock { + /* Initial value */ +/* --time: calc((60 * 60 * 3) + (60 * 47) + 6); */ + --time: 0; + /* starts from 00:00:00 am in seconds */ + --time-plus: var(--time); + /* Settings */ + --clock-size: 150px; + --clock-border-width: calc(0.025 * var(--clock-size)); + --clock-rounded-size: calc(0.2 * var(--clock-size)); + --bg-color: #222; + --text-color: #eee; + --color-light: #f0f0f030; + --color-shadow: #00000030; + --clock-hand-width: calc(0.05 * var(--clock-size)); + --clock-hand-second-color: #ee2222; + background-color: var(--bg-color); + display: block; + position: relative; /* Size won't relative to body size */ + width: var(--clock-size); + height: var(--clock-size); + min-width: var(--clock-size); + min-height: var(--clock-size); + border: var(--clock-border-width) solid var(--text-color); + padding: calc(0.025 * var(--clock-size)); + box-sizing: border-box; + box-shadow: + calc(-1 * var(--clock-border-width)) calc(-1 * var(--clock-border-width)) calc(3 * var(--clock-border-width)) var(--color-light), + inset calc(-1 * var(--clock-border-width)) calc(-1 * var(--clock-border-width)) calc(3 * var(--clock-border-width)) var(--color-light), + calc(1 * var(--clock-border-width)) calc(1 * var(--clock-border-width)) calc(3 * var(--clock-border-width)) var(--color-shadow), + inset calc(1 * var(--clock-border-width)) calc(1 * var(--clock-border-width)) calc(3 * var(--clock-border-width)) var(--color-shadow); + + /* Centering clock content */ + display: flex; + justify-content: center; + align-items: center; +} +.wall-clock.rounded { + border-radius: var(--clock-rounded-size); +} +.wall-clock.circle { + border-radius: var(--clock-size); +} +/* The center point */ +.wall-clock::after { + content: ''; + position: absolute; + width: var(--clock-hand-width); + height: var(--clock-hand-width); + box-sizing: border-box; + border: calc(0.25 * var(--clock-hand-width)) solid var(--clock-hand-second-color); + border-radius: 50%; + background-color: inherit; +} + +/* Clock nums */ +.wall-clock-nums { + position: relative; + width: 100%; + height: 100%; + font-family: "Lucida Console", "Courier New", monospace; + font-weight: bold; +} +.wall-clock-nums [num] { + --num-degree-pos: 0deg; /* for num 12 */ + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + transform: rotate(var(--num-degree-pos)); + color: var(--text-color); +} +.wall-clock-nums [num]::before { + content: attr(num); + line-height: calc(0.1 * var(--clock-size)); + font-size: calc(0.1 * var(--clock-size)); + position: absolute; + top: 0; + left: 50%; + width: calc(0.1 * var(--clock-size)); + height: calc(0.1 * var(--clock-size)); + text-align: center; + transform: translateX(-50%) rotate(calc(-1 * var(--num-degree-pos))); +} +.wall-clock-nums [num]:not(.numeric)::before { + --num-degree-pos: 0deg; + content: ''; + background-color: var(--text-color); + width: calc(0.007 * var(--clock-size)); + height: calc(0.05 * var(--clock-size)); +} +.wall-clock-nums [num$=".5"]:not(.numeric)::before { + width: calc(0.001 * var(--clock-size)); + height: calc(0.025 * var(--clock-size)); +} +.wall-clock-nums [num="12.5"] {--num-degree-pos: 15deg;} +.wall-clock-nums [num="1"] {--num-degree-pos: 30deg;} +.wall-clock-nums [num="1.5"] {--num-degree-pos: 45deg;} +.wall-clock-nums [num="2"] {--num-degree-pos: 60deg;} +.wall-clock-nums [num="2.5"] {--num-degree-pos: 75deg;} +.wall-clock-nums [num="3"] {--num-degree-pos: 90deg;} +.wall-clock-nums [num="3.5"] {--num-degree-pos: 105deg;} +.wall-clock-nums [num="4"] {--num-degree-pos: 120deg;} +.wall-clock-nums [num="4.5"] {--num-degree-pos: 135deg;} +.wall-clock-nums [num="5"] {--num-degree-pos: 150deg;} +.wall-clock-nums [num="5.5"] {--num-degree-pos: 165deg;} +.wall-clock-nums [num="6"] {--num-degree-pos: 180deg;} +.wall-clock-nums [num="6.5"] {--num-degree-pos: 195deg;} +.wall-clock-nums [num="7"] {--num-degree-pos: 210deg;} +.wall-clock-nums [num="7.5"] {--num-degree-pos: 225deg;} +.wall-clock-nums [num="8"] {--num-degree-pos: 240deg;} +.wall-clock-nums [num="8.5"] {--num-degree-pos: 255deg;} +.wall-clock-nums [num="9"] {--num-degree-pos: 270deg;} +.wall-clock-nums [num="9.5"] {--num-degree-pos: 285deg;} +.wall-clock-nums [num="10"] {--num-degree-pos: 300deg;} +.wall-clock-nums [num="10.5"] {--num-degree-pos: 315deg;} +.wall-clock-nums [num="11"] {--num-degree-pos: 330deg;} +.wall-clock-nums [num="11.5"] {--num-degree-pos: 345deg;} + +/* Clock hands */ +.wall-clock-hands, +.wall-clock-hands > *, +.wall-clock-hands > *::before { + position: absolute; + box-shadow: 0 0 var(--clock-border-width) var(--color-shadow); +} +.wall-clock-hands > * { + --hand-rotate-deg-func: 6deg; /* for second */ + transform : rotate(calc(var(--hand-rotate-deg-func) * var(--time))); +} + +.wall-clock-hands__hour::before { + content: ''; + height: calc(0.3 * var(--clock-size)); + width: calc(0.75 * var(--clock-hand-width)); + background-color: var(--text-color); + border-radius: var(--clock-hand-width); + transform: translate(-50%, -100%); +} +.wall-clock-hands__minute::before { + content: ''; + height: calc(0.4 * var(--clock-size)); + width: calc(0.5 * var(--clock-hand-width)); + background-color: var(--text-color); + border-radius: var(--clock-hand-width); + transform: translate(-50%, -100%); +} +.wall-clock-hands__second::before { + content: ''; + height: calc(0.5 * var(--clock-size)); + width: calc(0.25 * var(--clock-hand-width)); + background-color: var(--clock-hand-second-color); + border-radius: var(--clock-hand-width); + transform: translate(-50%, calc(-0.43 * var(--clock-size))); +} +.wall-clock-hands__hour { + --hand-rotate-deg-func: calc(6deg / 60 / 12); +} +.wall-clock-hands__minute { + --hand-rotate-deg-func: calc(6deg / 60); +} +.wall-clock-hands__second { + --hand-rotate-deg-func: 6deg; +} + +/* Animation */ +.wall-clock.animate .wall-clock-hands > * { + animation: clock-time calc(1s * (12 * 60 * 60)) linear infinite; +} +@keyframes clock-time { + to { + transform : rotate(calc(var(--hand-rotate-deg-func) * (var(--time) + (12 * 60 * 60)))); + } +} \ No newline at end of file diff --git a/src/apps-top/wall-clock/utils.js b/src/apps-top/wall-clock/utils.js new file mode 100644 index 0000000..57d94e3 --- /dev/null +++ b/src/apps-top/wall-clock/utils.js @@ -0,0 +1,11 @@ +/** + * Get time now in seconds, time starts from 00:00 am with 12 hours format + */ +export const getTimeNowInSeconds = () => { + const date = new Date(); + const hours = (date.getHours() % 12) * 60 * 60; + const minutes = date.getMinutes() * 60; + const seconds = date.getSeconds(); + + return hours + minutes + seconds; +} \ No newline at end of file diff --git a/src/index.css b/src/index.css deleted file mode 100644 index ec2585e..0000000 --- a/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -}