diff --git a/public/healthz.json b/public/healthz.json
index d2f0770..ba89415 100644
--- a/public/healthz.json
+++ b/public/healthz.json
@@ -2,7 +2,7 @@
"status": "ok",
"service": "aitherboard",
"version": "0.1.1",
- "buildTime": "2026-02-05T23:07:17.455Z",
+ "buildTime": "2026-02-06T07:27:23.473Z",
"gitCommit": "unknown",
- "timestamp": 1770332837455
+ "timestamp": 1770362843473
}
\ No newline at end of file
diff --git a/src/app.css b/src/app.css
index de520b5..3e2dbf5 100644
--- a/src/app.css
+++ b/src/app.css
@@ -286,8 +286,8 @@ main {
}
.emoji-grayscale {
- filter: grayscale(100%);
- opacity: 0.7;
+ filter: grayscale(100%) brightness(1.3);
+ opacity: 0.5;
}
/* Common button styles */
diff --git a/src/lib/components/EventMenu.svelte b/src/lib/components/EventMenu.svelte
index 04b3c80..256c5a8 100644
--- a/src/lib/components/EventMenu.svelte
+++ b/src/lib/components/EventMenu.svelte
@@ -23,9 +23,10 @@
interface Props {
event: NostrEvent;
showContentActions?: boolean; // Show pin/bookmark/highlight for notes with content
+ onReply?: () => void; // Callback for reply action
}
- let { event, showContentActions = false }: Props = $props();
+ let { event, showContentActions = false, onReply }: Props = $props();
let menuOpen = $state(false);
let jsonModalOpen = $state(false);
@@ -43,8 +44,7 @@
// Unique ID for this menu instance
let menuId = $derived(event.id);
- // Check if this is a note with content (kind 1 or kind 11)
- let isContentNote = $derived(event.kind === KIND.SHORT_TEXT_NOTE || event.kind === KIND.DISCUSSION_THREAD);
+ // Note: Removed isContentNote check - all events should have the same menu (except profile pages/cards)
// Check if user is logged in
let isLoggedIn = $derived(sessionManager.isLoggedIn());
@@ -413,7 +413,13 @@
{/if}
- {#if isLoggedIn && showContentActions && isContentNote}
+ {#if isLoggedIn && onReply}
+
+
+ {/if}
+ {#if isLoggedIn && showContentActions}
{/if}
+
+ {#if totalPages > 1}
+
+ {/if}
{/if}
@@ -260,4 +533,88 @@
min-width: 100px;
text-align: center;
}
+
+ .filters-section {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ margin-bottom: 1rem;
+ }
+
+ .type-filter-section {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ }
+
+ .type-filter-label {
+ font-size: 0.875rem;
+ color: var(--fog-text, #1f2937);
+ font-weight: 500;
+ }
+
+ :global(.dark) .type-filter-label {
+ color: var(--fog-dark-text, #f9fafb);
+ }
+
+ .type-filter-select {
+ padding: 0.5rem 0.75rem;
+ border: 1px solid var(--fog-border, #e5e7eb);
+ border-radius: 0.375rem;
+ background: var(--fog-post, #ffffff);
+ color: var(--fog-text, #1f2937);
+ font-size: 0.875rem;
+ cursor: pointer;
+ min-width: 200px;
+ font-family: inherit;
+ }
+
+ .type-filter-select:focus {
+ outline: none;
+ border-color: var(--fog-accent, #64748b);
+ box-shadow: 0 0 0 3px rgba(100, 116, 139, 0.1);
+ }
+
+ :global(.dark) .type-filter-select {
+ border-color: var(--fog-dark-border, #374151);
+ background: var(--fog-dark-post, #1f2937);
+ color: var(--fog-dark-text, #f9fafb);
+ }
+
+ :global(.dark) .type-filter-select:focus {
+ border-color: var(--fog-dark-accent, #94a3b8);
+ box-shadow: 0 0 0 3px rgba(148, 163, 184, 0.1);
+ }
+
+ .search-filter-section {
+ width: 100%;
+ }
+
+ .bookmark-item-wrapper {
+ position: relative;
+ }
+
+ .bookmark-indicator-wrapper {
+ position: absolute;
+ top: 0.5rem;
+ left: 0.5rem;
+ z-index: 10;
+ pointer-events: none;
+ }
+
+ .bookmark-item-wrapper :global(.Feed-post) {
+ padding-left: 2.5rem; /* Make room for the icon */
+ }
+
+ .bookmark-emoji {
+ display: inline-block;
+ font-size: 1.25rem;
+ line-height: 1;
+ filter: grayscale(100%);
+ transition: filter 0.2s;
+ }
+
+ .bookmark-emoji:not(.grayscale) {
+ filter: grayscale(0%);
+ }
diff --git a/src/routes/discussions/+page.svelte b/src/routes/discussions/+page.svelte
index d26af16..4bbec71 100644
--- a/src/routes/discussions/+page.svelte
+++ b/src/routes/discussions/+page.svelte
@@ -1,10 +1,16 @@
@@ -119,42 +45,86 @@
/Find
-
-
-
-
- Find User
- Enter a user ID (NIP-05, hex pubkey, npub, or nprofile)
+ Search Events
+ Search for events by ID, pubkey, NIP-05, or content. Use the kind filter to narrow results.
-
@@ -205,69 +175,245 @@
color: var(--fog-dark-text-light, #9ca3af);
}
- .input-group {
+ .search-container {
display: flex;
- gap: 0.5rem;
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ .search-bar-wrapper {
+ width: 100%;
+ }
+
+ .filter-and-button-wrapper {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ @media (min-width: 640px) {
+ .filter-and-button-wrapper {
+ flex-direction: row;
+ align-items: flex-end;
+ }
}
- .user-input {
+ .kind-filter-wrapper {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
flex: 1;
+ }
+
+ @media (min-width: 640px) {
+ .kind-filter-wrapper {
+ flex-direction: row;
+ align-items: center;
+ flex: 1;
+ }
+ }
+
+ .kind-filter-label {
+ font-size: 0.875rem;
+ color: var(--fog-text, #1f2937);
+ font-weight: 500;
+ white-space: nowrap;
+ }
+
+ :global(.dark) .kind-filter-label {
+ color: var(--fog-dark-text, #f9fafb);
+ }
+
+ .kind-filter-select {
padding: 0.75rem;
border: 1px solid var(--fog-border, #e5e7eb);
- border-radius: 0.25rem;
+ border-radius: 0.375rem;
background: var(--fog-post, #ffffff);
- color: var(--fog-text, #475569);
+ color: var(--fog-text, #1f2937);
font-size: 0.875rem;
- font-family: monospace;
+ cursor: pointer;
+ width: 100%;
+ font-family: inherit;
+ }
+
+ @media (min-width: 640px) {
+ .kind-filter-select {
+ width: auto;
+ min-width: 200px;
+ }
+ }
+
+ .kind-filter-select:focus {
+ outline: none;
+ border-color: var(--fog-accent, #64748b);
+ box-shadow: 0 0 0 3px rgba(100, 116, 139, 0.1);
}
- :global(.dark) .user-input {
+ :global(.dark) .kind-filter-select {
border-color: var(--fog-dark-border, #374151);
background: var(--fog-dark-post, #1f2937);
- color: var(--fog-dark-text, #cbd5e1);
+ color: var(--fog-dark-text, #f9fafb);
}
- .user-input:disabled {
- opacity: 0.6;
- cursor: not-allowed;
+ :global(.dark) .kind-filter-select:focus {
+ border-color: var(--fog-dark-accent, #94a3b8);
+ box-shadow: 0 0 0 3px rgba(148, 163, 184, 0.1);
}
- .find-button {
+ .search-button {
padding: 0.75rem 1.5rem;
background: var(--fog-accent, #64748b);
color: var(--fog-text, #f1f5f9);
border: none;
- border-radius: 0.25rem;
+ border-radius: 0.375rem;
cursor: pointer;
font-size: 0.875rem;
font-weight: 500;
- font-family: monospace;
+ font-family: inherit;
+ white-space: nowrap;
+ transition: all 0.2s;
+ min-width: 100px;
+ }
+
+ @media (min-width: 640px) {
+ .search-button {
+ min-width: auto;
+ }
}
- :global(.dark) .find-button {
+ :global(.dark) .search-button {
background: var(--fog-dark-accent, #94a3b8);
+ color: var(--fog-dark-text, #1f2937);
}
- .find-button:hover:not(:disabled) {
+ .search-button:hover:not(:disabled) {
opacity: 0.9;
+ transform: translateY(-1px);
+ }
+
+ .search-button:active:not(:disabled) {
+ transform: translateY(0);
}
- .find-button:disabled {
+ .search-button:disabled {
opacity: 0.6;
cursor: not-allowed;
}
- .error-message {
- margin-top: 1rem;
- padding: 0.75rem;
- background: var(--fog-danger-light, #fee2e2);
- color: var(--fog-danger, #dc2626);
- border-radius: 0.25rem;
+
+ .results-section {
+ margin-top: 2rem;
+ border: 1px solid var(--fog-border, #e5e7eb);
+ border-radius: 0.5rem;
+ padding: 2rem;
+ background: var(--fog-post, #ffffff);
+ }
+
+ :global(.dark) .results-section {
+ border-color: var(--fog-dark-border, #374151);
+ background: var(--fog-dark-post, #1f2937);
+ }
+
+ .results-section h2 {
+ margin: 0 0 1.5rem 0;
+ font-size: 1.25rem;
+ font-weight: 600;
+ color: var(--fog-text, #475569);
+ }
+
+ :global(.dark) .results-section h2 {
+ color: var(--fog-dark-text, #cbd5e1);
+ }
+
+ .results-group {
+ margin-bottom: 2rem;
+ }
+
+ .results-group:last-child {
+ margin-bottom: 0;
+ }
+
+ .results-group h3 {
+ margin: 0 0 1rem 0;
+ font-size: 1rem;
+ font-weight: 500;
+ color: var(--fog-text-light, #6b7280);
+ }
+
+ :global(.dark) .results-group h3 {
+ color: var(--fog-dark-text-light, #9ca3af);
+ }
+
+ .profile-results {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ .profile-result-card {
+ padding: 1rem;
+ border: 1px solid var(--fog-border, #e5e7eb);
+ border-radius: 0.375rem;
+ background: var(--fog-post, #ffffff);
+ text-decoration: none;
+ transition: all 0.2s;
+ }
+
+ :global(.dark) .profile-result-card {
+ border-color: var(--fog-dark-border, #374151);
+ background: var(--fog-dark-post, #1f2937);
+ }
+
+ .profile-result-card:hover {
+ border-color: var(--fog-accent, #64748b);
+ transform: translateY(-1px);
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ }
+
+ :global(.dark) .profile-result-card:hover {
+ border-color: var(--fog-dark-accent, #94a3b8);
+ }
+
+ .event-results {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ .event-result-card {
+ display: block;
+ border: 1px solid var(--fog-border, #e5e7eb);
+ border-radius: 0.375rem;
+ background: var(--fog-post, #ffffff);
+ overflow: hidden;
+ transition: all 0.2s;
+ text-decoration: none;
+ color: inherit;
+ }
+
+ :global(.dark) .event-result-card {
+ border-color: var(--fog-dark-border, #374151);
+ background: var(--fog-dark-post, #1f2937);
+ }
+
+ .event-result-card:hover {
+ border-color: var(--fog-accent, #64748b);
+ transform: translateY(-1px);
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ }
+
+ :global(.dark) .event-result-card:hover {
+ border-color: var(--fog-dark-accent, #94a3b8);
+ }
+
+ .no-results {
+ padding: 2rem;
+ text-align: center;
+ color: var(--fog-text-light, #6b7280);
font-size: 0.875rem;
}
- :global(.dark) .error-message {
- background: var(--fog-dark-danger-light, #7f1d1d);
- color: var(--fog-dark-danger, #ef4444);
+ :global(.dark) .no-results {
+ color: var(--fog-dark-text-light, #9ca3af);
}
diff --git a/src/routes/replaceable/[d_tag]/+page.svelte b/src/routes/replaceable/[d_tag]/+page.svelte
index 2591eb9..ef48d02 100644
--- a/src/routes/replaceable/[d_tag]/+page.svelte
+++ b/src/routes/replaceable/[d_tag]/+page.svelte
@@ -1,19 +1,17 @@
@@ -117,11 +109,11 @@
{#each events as event (event.id)}
openInDrawer(event)}
+ onclick={() => navigateToEvent(event)}
onkeydown={(e) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
- openInDrawer(event);
+ navigateToEvent(event);
}
}}
role="button"
@@ -135,10 +127,6 @@
-{#if drawerOpen && drawerEvent}
-
-{/if}
-