summaryrefslogtreecommitdiff
path: root/packages/client/src/widgets/digital-clock.vue
diff options
context:
space:
mode:
Diffstat (limited to 'packages/client/src/widgets/digital-clock.vue')
-rw-r--r--packages/client/src/widgets/digital-clock.vue79
1 files changed, 79 insertions, 0 deletions
diff --git a/packages/client/src/widgets/digital-clock.vue b/packages/client/src/widgets/digital-clock.vue
new file mode 100644
index 0000000000..9d32e8b9fe
--- /dev/null
+++ b/packages/client/src/widgets/digital-clock.vue
@@ -0,0 +1,79 @@
+<template>
+<div class="mkw-digitalClock _monospace" :class="{ _panel: !props.transparent }" :style="{ fontSize: `${props.fontSize}em` }">
+ <span>
+ <span v-text="hh"></span>
+ <span :style="{ visibility: showColon ? 'visible' : 'hidden' }">:</span>
+ <span v-text="mm"></span>
+ <span :style="{ visibility: showColon ? 'visible' : 'hidden' }">:</span>
+ <span v-text="ss"></span>
+ <span :style="{ visibility: showColon ? 'visible' : 'hidden' }" v-if="props.showMs">:</span>
+ <span v-text="ms" v-if="props.showMs"></span>
+ </span>
+</div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue';
+import define from './define';
+import * as os from '@/os';
+
+const widget = define({
+ name: 'digitalClock',
+ props: () => ({
+ transparent: {
+ type: 'boolean',
+ default: false,
+ },
+ fontSize: {
+ type: 'number',
+ default: 1.5,
+ step: 0.1,
+ },
+ showMs: {
+ type: 'boolean',
+ default: true,
+ },
+ })
+});
+
+export default defineComponent({
+ extends: widget,
+ data() {
+ return {
+ clock: null,
+ hh: null,
+ mm: null,
+ ss: null,
+ ms: null,
+ showColon: true,
+ };
+ },
+ created() {
+ this.tick();
+ this.$watch(() => this.props.showMs, () => {
+ if (this.clock) clearInterval(this.clock);
+ this.clock = setInterval(this.tick, this.props.showMs ? 10 : 1000);
+ }, { immediate: true });
+ },
+ beforeUnmount() {
+ clearInterval(this.clock);
+ },
+ methods: {
+ tick() {
+ const now = new Date();
+ this.hh = now.getHours().toString().padStart(2, '0');
+ this.mm = now.getMinutes().toString().padStart(2, '0');
+ this.ss = now.getSeconds().toString().padStart(2, '0');
+ this.ms = Math.floor(now.getMilliseconds() / 10).toString().padStart(2, '0');
+ this.showColon = now.getSeconds() % 2 === 0;
+ }
+ }
+});
+</script>
+
+<style lang="scss" scoped>
+.mkw-digitalClock {
+ padding: 16px 0;
+ text-align: center;
+}
+</style>