summaryrefslogtreecommitdiffstats
path: root/src/ui/layouts/EmojiGrid.tsx
blob: 5dc9266adb294b69254b6c1da366aba85102925c (plain) (blame)
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
import type { HTMLAttributes } from "corvos/plugins/jsx.ts";

export type Props = HTMLAttributes<"ul"> & {
	id: string;
	sprite: {
		variants: { size: number; space: number }[];
		wrap: number;
	};
	count: number;
};

export const EmojiGrid = ({ id, sprite, count, class: cls, ...props }: Props) => {
	const size = sprite.variants[0]?.size ?? 48;
	const space = sprite.variants[0]?.space ?? 2;
	const { wrap } = sprite;

	const src = `/emojis/${id}/sprite48.avif`;
	const srcset = `/emojis/${id}/sprite48.avif 1x, /emojis/${id}/sprite96.avif 2x`;

	const offsetX = (i: number) => -1 * (size + space) * (i % wrap);
	const offsetY = (i: number) => -1 * (size + space) * Math.floor(i / wrap);

	return (
		<ul class:list={["l-emoji-grid", cls]} style={{ "--emoji-size": `${size}px` }} {...props}>
			{[...Array(count).keys()].map((i) => (
				<li>
					<img
						alt=""
						class="l-emoji-grid__emoji"
						src={src}
						srcset={srcset}
						width={size}
						height={size}
						style={{ "object-position": `${offsetX(i)}px ${offsetY(i)}px` }}
					/>
				</li>
			))}
		</ul>
	);
};