dominoclock/src/DominoClock.ts

74 lines
1.8 KiB
TypeScript

import { LitElement, css, html } from "lit";
import { customElement, queryAll } from "lit/decorators.js";
import "./DominoFace.ts";
function times() {
const now = new Date();
const rawHours = now.getHours();
return {
hour: rawHours > 12 ? rawHours - 12 : rawHours,
minute: Math.floor(now.getUTCMinutes() / 5),
second: Math.floor(now.getUTCSeconds() / 5),
};
}
@customElement("domino-clock")
export class DominoClock extends LitElement {
static styles = css`
:host {
--dominoclock-default-direction: row;
--dominoclock-default-face-gap: 0.25rem;
}
.dominoclock {
display: flex;
flex-direction: var(--dominoclock-direction, var(--dominoclock-default-direction, row));
gap: var(--dominoclock-face-gap, var(--dominoclock-default-face-gap, 0.25rem));
}
`;
@queryAll("domino-face") faces: HTMLCollection;
timer: number;
constructor() {
super();
this.timer = 0;
this.paint = this.paint.bind(this);
}
paint() {
const update = times();
Array.from(this.faces).forEach(face => {
const name = face.getAttribute("name");
face.setAttribute("time", `${update[name]}`);
});
this.timer = window.setTimeout(this.paint, 250);
}
connectedCallback() {
if (super.connectedCallback) {
super.connectedCallback();
}
this.timer = window.setTimeout(this.paint, 250);
}
disconnectedCallback() {
window.clearTimeout(this.timer);
if (super.disconnectedCallback) {
super.disconnectedCallback();
}
}
render() {
const update = times();
return html` <div class="dominoclock">
<domino-face name="hour" time=${update.hour}></domino-face>
<domino-face name="minute" time=${update.minute}></domino-face>
<domino-face name="second" time=${update.second}></domino-face>
</div>`;
}
}
export default DominoClock;