diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2022-08-05 23:51:15 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2022-08-05 23:51:15 +0900 |
| commit | 2cd70b80a21de9bf072af726449480c8d229440c (patch) | |
| tree | 7e74e2155857802a515d4917c6ed30d9f93ebd7d /packages/client/src/components | |
| parent | feat(client): improve widget (diff) | |
| download | sharkey-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.vue | 86 |
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(() => { |