+{/if}
diff --git a/src/app/components/EventComments.svelte b/src/app/components/EventComments.svelte
index 5ce801c2..7fc9d143 100644
--- a/src/app/components/EventComments.svelte
+++ b/src/app/components/EventComments.svelte
@@ -49,20 +49,37 @@
})
-
-
+
+
+
+
+
+ {nodes.length === 0
+ ? "Discussion about this post"
+ : `${$comments.length} ${$comments.length === 1 ? "comment" : "comments"}`}
+
+ {#if url && replyTo?.id !== event.id}
+
+ {/if}
- {/if}
-{/if}
+
+
+
+ {#if url && replyTo?.id === event.id}
+
+
+
+ {/if}
+ {#each nodes as node (node.comment.id)}
+
+ {/each}
+ {#if nodes.length === 0 && replyTo?.id !== event.id}
+
No comments yet.
+ {/if}
+
+
+
diff --git a/src/app/components/EventReactButtons.svelte b/src/app/components/EventReactButtons.svelte
new file mode 100644
index 00000000..0cf5df5c
--- /dev/null
+++ b/src/app/components/EventReactButtons.svelte
@@ -0,0 +1,35 @@
+
+
+{#if ENABLE_ZAPS && !hideZap}
+
+
+
+{/if}
+
+
+
diff --git a/src/app/components/ReadingProgress.svelte b/src/app/components/ReadingProgress.svelte
new file mode 100644
index 00000000..6fe644ed
--- /dev/null
+++ b/src/app/components/ReadingProgress.svelte
@@ -0,0 +1,47 @@
+
+
+
diff --git a/src/app/components/ZapButton.svelte b/src/app/components/ZapButton.svelte
index eb39aca8..39b9e9ce 100644
--- a/src/app/components/ZapButton.svelte
+++ b/src/app/components/ZapButton.svelte
@@ -19,6 +19,8 @@
children: Snippet
replaceState?: boolean
class?: string
+ "data-tip"?: string
+ "aria-label"?: string
}
const {url, event, children, replaceState, ...props}: Props = $props()
diff --git a/src/app/routes.ts b/src/app/routes.ts
index 984a833f..8e828090 100644
--- a/src/app/routes.ts
+++ b/src/app/routes.ts
@@ -134,6 +134,26 @@ export const makeClassifiedPath = (url: string, address?: string) =>
export const makeArticlePath = (url: string, address?: string) =>
makeSpacePath(url, "articles", address)
+// shareToChat is separate from h because the space-level chat has no room to scope an article to
+export const makeArticleCreatePath = (
+ url: string,
+ {h, shareToChat}: {h?: string; shareToChat?: boolean} = {},
+) => {
+ const params = new URLSearchParams()
+
+ if (h) {
+ params.set("h", h)
+ }
+
+ if (shareToChat) {
+ params.set("shareToChat", "1")
+ }
+
+ const query = params.toString()
+
+ return makeSpacePath(url, "articles", "create") + (query ? "?" + query : "")
+}
+
export const makeCalendarPath = (url: string, address?: string) =>
makeSpacePath(url, "calendar", address)
diff --git a/src/app/title.ts b/src/app/title.ts
index 11880e38..41735fd5 100644
--- a/src/app/title.ts
+++ b/src/app/title.ts
@@ -20,6 +20,7 @@ const staticTitles = new Map
([
["/spaces/[relay]/threads", "Threads"],
["/spaces/[relay]/classifieds", "Classifieds"],
["/spaces/[relay]/articles", "Articles"],
+ ["/spaces/[relay]/articles/create", "Write an Article"],
["/spaces/[relay]/calendar", "Calendar"],
["/spaces/[relay]/goals", "Goals"],
["/spaces/[relay]/polls", "Polls"],
diff --git a/src/lib/components/EmojiButton.svelte b/src/lib/components/EmojiButton.svelte
index ca7aa495..c0c48d38 100644
--- a/src/lib/components/EmojiButton.svelte
+++ b/src/lib/components/EmojiButton.svelte
@@ -7,12 +7,12 @@
import type {TippyController} from "@lib/components/Tippy.svelte"
import EmojiPicker from "@lib/components/EmojiPicker.svelte"
- const {tippyParams = {}, ...props} = $props()
+ const {tippyParams = {}, onEmoji, class: className, children, ...restProps} = $props()
const open = () => tippy?.show()
const onClick = (emoji: NativeEmoji) => {
- props.onEmoji(emoji)
+ onEmoji(emoji)
tippy?.hide()
}
@@ -33,13 +33,13 @@
-