Skip to content

Commit bb8c0b0

Browse files
committed
highlight current dot, move dot into own component
1 parent 2fee8e7 commit bb8c0b0

File tree

2 files changed

+68
-16
lines changed

2 files changed

+68
-16
lines changed

src/components/dot.svelte

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script>
2+
let { dotNum, nowDots } = $props();
3+
</script>
4+
5+
{#if dotNum < nowDots}
6+
<div class="bg-text dot size-6 rounded-full"></div>
7+
{:else if dotNum == nowDots}
8+
<div class="bg-primary dot size-6 rounded-full"></div>
9+
{:else}
10+
<div class="bg-inactive dot size-6 rounded-full"></div>
11+
{/if}

src/routes/+page.svelte

Lines changed: 57 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
startOfDay,
55
startOfHour,
66
startOfMonth,
7-
startOfWeek,
8-
startOfYear
7+
startOfISOWeek,
8+
startOfYear,
9+
sub,
10+
isLeapYear
911
} from 'date-fns';
12+
import Dot from '../components/dot.svelte';
1013
import { browser } from '$app/environment';
1114
1215
function changeBg() {
@@ -25,6 +28,27 @@
2528
year: 365 * 24 * 60 * 60 // non-leap year
2629
};
2730
31+
let daysInMonth = $state([
32+
31,
33+
isLeapYear(new Date()) ? 29 : 28,
34+
31,
35+
30,
36+
31,
37+
30,
38+
31,
39+
31,
40+
30,
41+
31,
42+
30,
43+
31
44+
]);
45+
setInterval(
46+
() => {
47+
daysInMonth[1] = isLeapYear(new Date()) ? 29 : 28;
48+
},
49+
1000 * 60 * 60 * 24
50+
);
51+
2852
let dots = $derived.by(() => {
2953
const secondsInUnit = secondsPer[unit];
3054
const secondsInRange = secondsPer[timerange];
@@ -57,11 +81,11 @@
5781
} else if (timerange == 'day') {
5882
start = startOfDay(date);
5983
} else if (timerange == 'week') {
60-
start = startOfWeek(date);
84+
start = startOfISOWeek(date);
6185
} else if (timerange == 'month') {
62-
start = startOfMonth(date);
86+
start = sub(startOfMonth(date), { days: 1 });
6387
} else if (timerange == 'year') {
64-
start = startOfYear(date);
88+
start = sub(startOfYear(date), { days: 1 });
6589
}
6690
let diff = differenceInSeconds(date, start);
6791
nowDots = Math.floor(diff / secondsPer[unit]);
@@ -75,33 +99,50 @@
7599
}
76100
});
77101
102+
function calcAmountOfDots(row, dot) {
103+
let dots = 0;
104+
for (const i of Array.from(Array(row).keys())) {
105+
dots += daysInMonth[i];
106+
}
107+
dots += dot + 1;
108+
return dots;
109+
}
110+
78111
let rows = $derived(Math.ceil(dots / cols));
79112
let lastRow = $derived(dots % cols);
80113
$inspect(nowDots);
81114
</script>
82115

83-
<div class="bg-bg h-screen w-screen p-50">
116+
{#snippet grid()}
84117
<div class="flex flex-col gap-1">
85118
{#each rows != Infinity ? { length: rows } : { length: 1 }, row}
86119
<div class="flex flex-row gap-1">
87120
{#each cols != null ? { length: cols } : { length: 1 }, dot}
88121
{#if lastRow == 0}
89-
{#if row * cols + dot + 1 <= nowDots}
90-
<div class="bg-primary dot size-6 rounded-full"></div>
91-
{:else}
92-
<div class="bg-inactive dot size-6 rounded-full"></div>
93-
{/if}
122+
<Dot dotNum={row * cols + dot + 1} {nowDots} />
94123
{:else if dot + 1 <= lastRow || row + 1 != rows}
95-
{#if row * cols + dot + 1 <= nowDots}
96-
<div class="bg-primary dot size-6 rounded-full"></div>
97-
{:else}
98-
<div class="bg-inactive dot size-6 rounded-full"></div>
99-
{/if}
124+
<Dot dotNum={row * cols + dot + 1} {nowDots} />
100125
{/if}
101126
{/each}
102127
</div>
103128
{/each}
104129
</div>
130+
{/snippet}
131+
132+
<div class="bg-bg h-screen w-screen p-50">
133+
{#if timerange === 'year' && colsName === 'month'}
134+
<div class="flex flex-col gap-1">
135+
{#each { length: 12 }, row}
136+
<div class="flex flex-row gap-1">
137+
{#each { length: daysInMonth[row] }, dot}
138+
<Dot dotNum={calcAmountOfDots(row, dot)} {nowDots} />
139+
{/each}
140+
</div>
141+
{/each}
142+
</div>
143+
{:else}
144+
{@render grid()}
145+
{/if}
105146

106147
<br />
107148

0 commit comments

Comments
 (0)