File size: 2,173 Bytes
0bd62e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<script>

	import { spring } from "svelte/motion";



	let count = 0;



	const displayed_count = spring();

	$: displayed_count.set(count);

	$: offset = modulo($displayed_count, 1);



	/**

	 * @param {number} n

	 * @param {number} m

	 */

	function modulo(n, m) {

		// handle negative numbers

		return ((n % m) + m) % m;

	}

</script>

<div class="counter">
	<button

		on:click={() => (count -= 1)}
		aria-label="Decrease the counter by one"
	>
		<svg aria-hidden="true" viewBox="0 0 1 1">
			<path d="M0,0.5 L1,0.5" />
		</svg>
	</button>

	<div class="counter-viewport">
		<div

			class="counter-digits"

			style="transform: translate(0, {100 * offset}%)"

		>
			<strong class="hidden" aria-hidden="true"

				>{Math.floor($displayed_count + 1)}</strong
			>
			<strong>{Math.floor($displayed_count)}</strong>
		</div>
	</div>

	<button

		on:click={() => (count += 1)}
		aria-label="Increase the counter by one"
	>
		<svg aria-hidden="true" viewBox="0 0 1 1">
			<path d="M0,0.5 L1,0.5 M0.5,0 L0.5,1" />
		</svg>
	</button>
</div>

<style>

	.counter {

		display: flex;

		border-top: 1px solid rgba(0, 0, 0, 0.1);

		border-bottom: 1px solid rgba(0, 0, 0, 0.1);

		margin: 1rem 0;

	}



	.counter button {

		width: 2em;

		padding: 0;

		display: flex;

		align-items: center;

		justify-content: center;

		border: 0;

		background-color: transparent;

		touch-action: manipulation;

		font-size: 2rem;

	}



	.counter button:hover {

		background-color: var(--color-bg-1);

	}



	svg {

		width: 25%;

		height: 25%;

	}



	path {

		vector-effect: non-scaling-stroke;

		stroke-width: 2px;

		stroke: #444;

	}



	.counter-viewport {

		width: 8em;

		height: 4em;

		overflow: hidden;

		text-align: center;

		position: relative;

	}



	.counter-viewport strong {

		position: absolute;

		display: flex;

		width: 100%;

		height: 100%;

		font-weight: 400;

		color: var(--color-theme-1);

		font-size: 4rem;

		align-items: center;

		justify-content: center;

	}



	.counter-digits {

		position: absolute;

		width: 100%;

		height: 100%;

	}



	.hidden {

		top: -100%;

		user-select: none;

	}

</style>