diff --git a/package.json b/package.json
index 33b6026..e2e6237 100644
--- a/package.json
+++ b/package.json
@@ -34,6 +34,7 @@
"react-dom": "^18.2.0",
"react-helmet": "^6.1.0",
"react-intersection-observer": "^9.5.1",
+ "react-markdown": "^8.0.7",
"react-router-dom": "^6.13.0",
"react-tag-input-component": "^2.0.2",
"semantic-sdp": "^3.26.2",
diff --git a/public/icons.svg b/public/icons.svg
index 1571504..965d0ec 100644
--- a/public/icons.svg
+++ b/public/icons.svg
@@ -54,5 +54,8 @@
{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..463cfbd
--- /dev/null
+++ b/src/element/emoji-pack.css
@@ -0,0 +1,32 @@
+.emoji-pack-title {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+}
+
+.emoji-pack-title a {
+ font-size: 14px;
+}
+
+.emoji-pack-emojis {
+ margin-top: 12px;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 4px;
+}
+
+.emoji-definition {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ flex: 1;
+}
+
+.emoji-name {
+ font-size: 10px;
+}
+
+.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..59b5139
--- /dev/null
+++ b/src/element/emoji-pack.tsx
@@ -0,0 +1,29 @@
+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