summaryrefslogtreecommitdiff
path: root/packages/client/src/components
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-08-05 23:51:15 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2022-08-05 23:51:15 +0900
commit2cd70b80a21de9bf072af726449480c8d229440c (patch)
tree7e74e2155857802a515d4917c6ed30d9f93ebd7d /packages/client/src/components
parentfeat(client): improve widget (diff)
downloadsharkey-2cd70b80a21de9bf072af726449480c8d229440c.tar.gz
sharkey-2cd70b80a21de9bf072af726449480c8d229440c.tar.bz2
sharkey-2cd70b80a21de9bf072af726449480c8d229440c.zip
enhance(client): improve clock widgets
Diffstat (limited to 'packages/client/src/components')
-rw-r--r--packages/client/src/components/analog-clock.vue86
1 files changed, 61 insertions, 25 deletions
diff --git a/packages/client/src/components/analog-clock.vue b/packages/client/src/components/analog-clock.vue
index 18dd1e3f41..2ea7680dd3 100644
--- a/packages/client/src/components/analog-clock.vue
+++ b/packages/client/src/components/analog-clock.vue
@@ -1,13 +1,29 @@
<template>
<svg class="mbcofsoe" viewBox="0 0 10 10" preserveAspectRatio="none">
- <circle v-for="(angle, i) in graduations"
- :key="i"
- :cx="5 + (Math.sin(angle) * (5 - graduationsPadding))"
- :cy="5 - (Math.cos(angle) * (5 - graduationsPadding))"
- :r="i % 5 == 0 ? 0.125 : 0.05"
- :fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"
+ <circle
+ v-for="(angle, i) in graduations"
+ :key="i"
+ :cx="5 + (Math.sin(angle) * (5 - graduationsPadding))"
+ :cy="5 - (Math.cos(angle) * (5 - graduationsPadding))"
+ :r="i % 5 == 0 ? 0.125 : 0.05"
+ :fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"
/>
+ <template v-if="props.numbers">
+ <text
+ v-for="(angle, i) in texts"
+ :x="5 + (Math.sin(angle) * (5 - textsPadding))"
+ :y="5 - (Math.cos(angle) * (5 - textsPadding))"
+ text-anchor="middle"
+ dominant-baseline="middle"
+ font-family="Verdana"
+ font-size="0.75"
+ fill="currentColor"
+ >
+ {{ i === 0 ? (props.twentyfour ? '24' : '12') : i }}
+ </text>
+ </template>
+
<line
:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
:y1="5 + (Math.cos(sAngle) * (sHandLengthRatio * handsTailLength))"
@@ -44,22 +60,50 @@
import { ref, computed, onMounted, onBeforeUnmount } from 'vue';
import tinycolor from 'tinycolor2';
-withDefaults(defineProps<{
- thickness: number;
+const graduationsPadding = 0.5;
+const textsPadding = 0.5;
+const handsPadding = 1;
+const handsTailLength = 0.7;
+const hHandLengthRatio = 0.75;
+const mHandLengthRatio = 1;
+const sHandLengthRatio = 1;
+const graduations = (() => {
+ const angles: number[] = [];
+ for (let i = 0; i < 60; i++) {
+ const angle = Math.PI * i / 30;
+ angles.push(angle);
+ }
+
+ return angles;
+})();
+
+const props = withDefaults(defineProps<{
+ numbers?: boolean;
+ thickness?: number;
+ offset?: number;
+ twentyfour?: boolean;
}>(), {
+ numbers: false,
thickness: 0.1,
+ offset: 0 - new Date().getTimezoneOffset(),
+ twentyfour: false,
+});
+
+const texts = computed(() => {
+ const angles: number[] = [];
+ const times = props.twentyfour ? 24 : 12;
+ for (let i = 0; i < times; i++) {
+ const angle = Math.PI * i / (times / 2);
+ angles.push(angle);
+ }
+ return angles;
});
const now = ref(new Date());
+now.value.setMinutes(now.value.getMinutes() + (new Date().getTimezoneOffset() + props.offset));
+
const enabled = ref(true);
-const graduationsPadding = ref(0.5);
-const handsPadding = ref(1);
-const handsTailLength = ref(0.7);
-const hHandLengthRatio = ref(0.75);
-const mHandLengthRatio = ref(1);
-const sHandLengthRatio = ref(1);
const computedStyle = getComputedStyle(document.documentElement);
-
const dark = computed(() => tinycolor(computedStyle.getPropertyValue('--bg')).isDark());
const majorGraduationColor = computed(() => dark.value ? 'rgba(255, 255, 255, 0.3)' : 'rgba(0, 0, 0, 0.3)');
const minorGraduationColor = computed(() => dark.value ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)');
@@ -69,21 +113,13 @@ const hHandColor = computed(() => tinycolor(computedStyle.getPropertyValue('--ac
const s = computed(() => now.value.getSeconds());
const m = computed(() => now.value.getMinutes());
const h = computed(() => now.value.getHours());
-const hAngle = computed(() => Math.PI * (h.value % 12 + (m.value + s.value / 60) / 60) / 6);
+const hAngle = computed(() => Math.PI * (h.value % (props.twentyfour ? 24 : 12) + (m.value + s.value / 60) / 60) / (props.twentyfour ? 12 : 6));
const mAngle = computed(() => Math.PI * (m.value + s.value / 60) / 30);
const sAngle = computed(() => Math.PI * s.value / 30);
-const graduations = computed(() => {
- const angles: number[] = [];
- for (let i = 0; i < 60; i++) {
- const angle = Math.PI * i / 30;
- angles.push(angle);
- }
-
- return angles;
-});
function tick() {
now.value = new Date();
+ now.value.setMinutes(now.value.getMinutes() + (new Date().getTimezoneOffset() + props.offset));
}
onMounted(() => {