|
4 | 4 | startOfDay,
|
5 | 5 | startOfHour,
|
6 | 6 | startOfMonth,
|
7 |
| - startOfWeek, |
8 |
| - startOfYear |
| 7 | + startOfISOWeek, |
| 8 | + startOfYear, |
| 9 | + sub, |
| 10 | + isLeapYear |
9 | 11 | } from 'date-fns';
|
| 12 | + import Dot from '../components/dot.svelte'; |
10 | 13 | import { browser } from '$app/environment';
|
11 | 14 |
|
12 | 15 | function changeBg() {
|
|
25 | 28 | year: 365 * 24 * 60 * 60 // non-leap year
|
26 | 29 | };
|
27 | 30 |
|
| 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 | +
|
28 | 52 | let dots = $derived.by(() => {
|
29 | 53 | const secondsInUnit = secondsPer[unit];
|
30 | 54 | const secondsInRange = secondsPer[timerange];
|
|
57 | 81 | } else if (timerange == 'day') {
|
58 | 82 | start = startOfDay(date);
|
59 | 83 | } else if (timerange == 'week') {
|
60 |
| - start = startOfWeek(date); |
| 84 | + start = startOfISOWeek(date); |
61 | 85 | } else if (timerange == 'month') {
|
62 |
| - start = startOfMonth(date); |
| 86 | + start = sub(startOfMonth(date), { days: 1 }); |
63 | 87 | } else if (timerange == 'year') {
|
64 |
| - start = startOfYear(date); |
| 88 | + start = sub(startOfYear(date), { days: 1 }); |
65 | 89 | }
|
66 | 90 | let diff = differenceInSeconds(date, start);
|
67 | 91 | nowDots = Math.floor(diff / secondsPer[unit]);
|
|
75 | 99 | }
|
76 | 100 | });
|
77 | 101 |
|
| 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 | +
|
78 | 111 | let rows = $derived(Math.ceil(dots / cols));
|
79 | 112 | let lastRow = $derived(dots % cols);
|
80 | 113 | $inspect(nowDots);
|
81 | 114 | </script>
|
82 | 115 |
|
83 |
| -<div class="bg-bg h-screen w-screen p-50"> |
| 116 | +{#snippet grid()} |
84 | 117 | <div class="flex flex-col gap-1">
|
85 | 118 | {#each rows != Infinity ? { length: rows } : { length: 1 }, row}
|
86 | 119 | <div class="flex flex-row gap-1">
|
87 | 120 | {#each cols != null ? { length: cols } : { length: 1 }, dot}
|
88 | 121 | {#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} /> |
94 | 123 | {: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} /> |
100 | 125 | {/if}
|
101 | 126 | {/each}
|
102 | 127 | </div>
|
103 | 128 | {/each}
|
104 | 129 | </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} |
105 | 146 |
|
106 | 147 | <br />
|
107 | 148 |
|
|
0 commit comments