This repository has been archived by the owner on Dec 18, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSelectEmojis.svelte
97 lines (86 loc) · 3.04 KB
/
SelectEmojis.svelte
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
<script lang="ts">
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuTrigger
} from "@/components/ui/dropdown-menu"
import LazyComponent from "@/components/LazyComponent.svelte"
import { getEditorContext } from "@/states/toolbar"
import { emojis } from "@/utils/editor-presets"
import SvgEmoji from "@/icons/toolbars/SvgEmoji.svelte"
const ctx = getEditorContext()
const insertEmoji = (emoji: string) => {
ctx.editor.chain().focus().insertContent(emoji).run()
}
// TODO consider more efficient emoji-picker https://github.com/ealush/emoji-picker-react
// TODO deploy a static assets server to replace https://fonts.gstatic.com/s/e/notoemoji/latest/
function rgi(codepoints: number[]) {
return codepoints.map(codepoint => codepoint.toString(16).padStart(4, "0")).join("_")
}
function render(codepoints: number[]) {
return codepoints.map(codepoint => String.fromCodePoint(codepoint)).join("")
}
</script>
<DropdownMenu>
<DropdownMenuTrigger>
<SvgEmoji/>
</DropdownMenuTrigger>
<DropdownMenuContent class="p-2 overflow-y-auto snap-mandatory">
<div class="emoji_grid">
{#each emojis as meta}
<div class="grid__group">
<h1 class="grid__group-title">{meta.group}</h1>
<div class="grid__group-emojis">
{#each meta.emoji as { base, shortcodes }, i}
<LazyComponent class="size-9" priority={i}>
<button class="size-full emoji__button"
title={shortcodes.join(" ")}
onclick={() => insertEmoji(render(base))}>
<img class="grid__emoji"
src="https://fonts.gstatic.com/s/e/notoemoji/latest/{rgi(base)}/emoji.svg"
loading="lazy" alt={render(base)}/>
<!--{render(base)}-->
</button>
</LazyComponent>
{/each}
</div>
</div>
{/each}
</div>
</DropdownMenuContent>
</DropdownMenu>
<style>
.emoji_grid {
height: 320px;
overflow: auto;
padding: 12px;
width: 370px;
}
.grid__group-title {
font-size: 12px;
margin: 0 0 1em;
text-transform: uppercase;
}
.grid__group-emojis {
display: grid;
grid-template-columns: repeat(9, 1fr);
content-visibility: auto;
gap: 0;
}
.emoji__button {
border: 0;
align-items: center;
display: inline-flex;
justify-content: center;
}
.emoji__button:hover {
background: rgba(0, 0, 0, .07);
cursor: pointer;
}
.emoji__button:focus {
outline: 2px solid hsl(var(--primary));
}
.grid__emoji {
max-width: 28px;
}
</style>