diff --git a/src/const.ts b/src/const.ts
index ca60be4..7930080 100644
--- a/src/const.ts
+++ b/src/const.ts
@@ -2,6 +2,8 @@ import { EventKind } from "@snort/system";
export const LIVE_STREAM = 30_311 as EventKind;
export const LIVE_STREAM_CHAT = 1_311 as EventKind;
+export const EMOJI_PACK = 30_030 as EventKind;
+export const USER_EMOJIS = 10_030 as EventKind;
export const GOAL = 9041 as EventKind;
export const USER_CARDS = 17_777 as EventKind;
export const CARD = 37_777 as EventKind;
diff --git a/src/element/Address.tsx b/src/element/Address.tsx
new file mode 100644
index 0000000..05bcb6c
--- /dev/null
+++ b/src/element/Address.tsx
@@ -0,0 +1,19 @@
+import { type NostrLink } from "@snort/system";
+
+import { useEvent } from "hooks/event";
+import { EMOJI_PACK } from "const";
+import { EmojiPack } from "element/emoji-pack";
+
+interface AddressProps {
+ link: NostrLink;
+}
+
+export function Address({ link }: AddressProps) {
+ const event = useEvent(link);
+
+ if (event?.kind === EMOJI_PACK) {
+ return
{link.id}
;
+}
diff --git a/src/element/address.css b/src/element/address.css
new file mode 100644
index 0000000..e69de29
diff --git a/src/element/chat-message.tsx b/src/element/chat-message.tsx
index c0fdc49..9c7801b 100644
--- a/src/element/chat-message.tsx
+++ b/src/element/chat-message.tsx
@@ -58,7 +58,7 @@ export function ChatMessage({
const login = useLogin();
const profile = useUserProfile(
System,
- inView?.isIntersecting ? ev.pubkey : undefined
+ inView?.isIntersecting ? ev.pubkey : undefined,
);
const zapTarget = profile?.lud16 ?? profile?.lud06;
const zaps = useMemo(() => {
@@ -178,16 +178,16 @@ export function ChatMessage({
style={
isTablet
? {
- display: showZapDialog || isHovering ? "flex" : "none",
- }
+ display: showZapDialog || isHovering ? "flex" : "none",
+ }
: {
- position: "fixed",
- top: topOffset ? topOffset - 12 : 0,
- left: leftOffset ? leftOffset - 32 : 0,
- opacity: showZapDialog || isHovering ? 1 : 0,
- pointerEvents:
- showZapDialog || isHovering ? "auto" : "none",
- }
+ position: "fixed",
+ top: topOffset ? topOffset - 12 : 0,
+ left: leftOffset ? leftOffset - 32 : 0,
+ opacity: showZapDialog || isHovering ? 1 : 0,
+ pointerEvents:
+ showZapDialog || isHovering ? "auto" : "none",
+ }
}
>
{zapTarget && (
diff --git a/src/element/emoji-pack.css b/src/element/emoji-pack.css
new file mode 100644
index 0000000..00663ec
--- /dev/null
+++ b/src/element/emoji-pack.css
@@ -0,0 +1,20 @@
+.emoji-pack-title {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+}
+
+.emoji-pack-title a {
+ font-size: 14px;
+}
+
+.emoji-pack-emojis {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 4px;
+}
+
+.emoji-pack h4 {
+ margin: 0;
+}
diff --git a/src/element/emoji-pack.tsx b/src/element/emoji-pack.tsx
new file mode 100644
index 0000000..3455463
--- /dev/null
+++ b/src/element/emoji-pack.tsx
@@ -0,0 +1,24 @@
+import "./emoji-pack.css";
+import { type NostrEvent } from "@snort/system";
+
+import { Mention } from "element/mention";
+import { findTag } from "utils";
+
+export function EmojiPack({ ev }: { ev: NostrEvent }) {
+ const name = findTag(ev, "d");
+ const emoji = ev.tags.filter((e) => e.at(0) === "emoji");
+ return (
+ {ev.content}
}{transformText(children, tags)}
, + a: (props) => { + return