+
{onSubHeaderRefresh != null &&
}
+ {mergeFilterWithTabsRow ? (
+
+ ) : null}
)
if (isMainFeed && isWispTrendingOnlyFeed) {
return (
-
{kindRowOptions}
+
{kindRowOptions}
)
}
return (
@@ -324,13 +332,12 @@ const NormalFeed = forwardRef
{
if (!isMainFeed || !setSubHeader) return
if (mergeFilterWithTabsRow) {
- setSubHeader(
-
- )
+ setSubHeader({tabsElement}
)
} else {
setSubHeader(tabsElement)
}
@@ -376,15 +375,7 @@ const NormalFeed = forwardRef
{renderTabsInFeed &&
(mergeFilterWithTabsRow ? (
-
+ {tabsElement}
) : (
tabsElement
))}
diff --git a/src/components/Note/index.tsx b/src/components/Note/index.tsx
index 7b592839..ffbe7b3b 100644
--- a/src/components/Note/index.tsx
+++ b/src/components/Note/index.tsx
@@ -693,6 +693,7 @@ export default function Note({
className="shrink-0 text-sm text-muted-foreground"
short={isSmallScreen}
/>
+
) : isSyntheticRssParent ? (
<>
@@ -746,6 +747,7 @@ export default function Note({
className="shrink-0"
short={isSmallScreen}
/>
+
diff --git a/src/components/NoteList/index.tsx b/src/components/NoteList/index.tsx
index a1437751..44a0d75a 100644
--- a/src/components/NoteList/index.tsx
+++ b/src/components/NoteList/index.tsx
@@ -4,7 +4,8 @@ import {
ExtendedKind,
FAST_READ_RELAY_URLS,
FIRST_RELAY_RESULT_GRACE_MS,
- PROFILE_MEDIA_TAB_KINDS,
+ HOME_GALLERY_TAB_KINDS,
+ HOME_GALLERY_TAB_KIND_SET,
SINGLE_RELAY_KINDLESS_EOSE_TIMEOUT_MS,
SINGLE_RELAY_KINDLESS_REQ_LIMIT
} from '@/constants'
@@ -1369,6 +1370,10 @@ const NoteList = forwardRef(
if (extraShouldHideEvent?.(evt)) return true
+ if (homeFeedListMode === 'media' && !HOME_GALLERY_TAB_KIND_SET.has(evt.kind)) {
+ return true
+ }
+
if (
homeFeedActiveSeenOnAllowlist &&
homeFeedListMode === 'posts' &&
@@ -2607,7 +2612,7 @@ const NoteList = forwardRef(
}
try {
- const hits = client.eventService.listSessionEventsByKinds([...PROFILE_MEDIA_TAB_KINDS], {
+ const hits = client.eventService.listSessionEventsByKinds([...HOME_GALLERY_TAB_KINDS], {
limit: 800
})
mergeLayer(hits as Event[], 'gallery_session_local')
@@ -2619,7 +2624,7 @@ const NoteList = forwardRef(
try {
const since = dayjs().subtract(120, 'day').unix()
const rows = await indexedDb.scanEventArchiveByKinds({
- kinds: [...PROFILE_MEDIA_TAB_KINDS],
+ kinds: [...HOME_GALLERY_TAB_KINDS],
since,
maxRowsScanned: 28_000,
maxMatches: 220
@@ -3111,7 +3116,7 @@ const NoteList = forwardRef(
...(runtimeSnapshot.rawCount === 0
? {
emptyHint:
- 'All sub-batches returned 0 events: relays may not index these kinds for this author, the query may have timed out before slow relays EOSEd, or posts are kind 1 with links (this tab uses native media kinds only: picture, NIP-71 video regular/addressable, voice).'
+ 'All sub-batches returned 0 events: relays may not index these kinds for this author, the query may have timed out before slow relays EOSEd, or posts are kind 1 with links (Gallery uses kinds 20, 21, 22, 34235 only).'
}
: {})
})
@@ -4485,7 +4490,7 @@ const NoteList = forwardRef(
useFeedFilterTabRowPortal && feedClientFilterTabRowHost
const feedClientFilterPanelSurfaceClass = feedClientFilterPanelPortalMode
- ? 'absolute top-full right-0 z-50 mt-1 w-[min(100vw-1rem,28rem)] max-w-[calc(100vw-1rem)] space-y-3 rounded-lg border border-border bg-background p-3 shadow-lg'
+ ? 'space-y-3 border-b border-border/80 bg-background/95 px-2 py-3 backdrop-blur supports-[backdrop-filter]:bg-background/80'
: 'space-y-3 border-t border-border/60 px-2 py-3'
const feedClientFilterSectionClass = 'space-y-2 rounded-md border border-border/60 bg-muted/25 p-2.5'
@@ -4685,10 +4690,7 @@ const NoteList = forwardRef(
) : null
const feedClientFilterChrome = feedClientFilterPanelPortalMode ? (
-
- {feedClientFilterToggleButton}
- {feedClientFilterPanel}
-
+ feedClientFilterToggleButton
) : (
<>
{feedClientFilterToggleButton}
@@ -4696,6 +4698,10 @@ const NoteList = forwardRef(
>
)
+ /** Tab-row portal: toggle lives in the header; panel expands in-flow above the list. */
+ const feedClientFilterPanelInList =
+ feedClientFilterPanelPortalMode ? feedClientFilterPanel : null
+
const feedClientFilterBarEmbedded = (
{feedClientFilterChrome}
@@ -4892,6 +4898,7 @@ const NoteList = forwardRef(
) : null}
{showFeedClientFilter ? feedClientFilterBar : null}
+ {feedClientFilterPanelInList}
{list}
@@ -4906,6 +4913,7 @@ const NoteList = forwardRef(
) : null}
{showFeedClientFilter ? feedClientFilterBar : null}
+ {feedClientFilterPanelInList}
{list}
)}
diff --git a/src/components/RefreshButton/index.tsx b/src/components/RefreshButton/index.tsx
index 57d84c0b..e29454c0 100644
--- a/src/components/RefreshButton/index.tsx
+++ b/src/components/RefreshButton/index.tsx
@@ -46,7 +46,7 @@ export function RefreshButton({
onClick()
setTimeout(() => setRefreshing(false), 500)
}}
- className="text-muted-foreground focus:text-foreground [&_svg]:size-3 h-8 px-2 text-xs"
+ className="h-8 shrink-0 px-1.5 text-muted-foreground focus:text-foreground [&_svg]:size-3"
>
{refreshing ? (
diff --git a/src/components/Tabs/index.tsx b/src/components/Tabs/index.tsx
index 0b1b2d17..f219edd3 100644
--- a/src/components/Tabs/index.tsx
+++ b/src/components/Tabs/index.tsx
@@ -1,5 +1,5 @@
import { cn } from '@/lib/utils'
-import { useDeepBrowsing } from '@/providers/DeepBrowsingProvider'
+import { useDeepBrowsing } from '@/providers/DeepBrowsingProvider'
import { ReactNode, useCallback, useEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
@@ -40,7 +40,7 @@ export default function Tabs({
const activeTab = tabRefs.current[activeIndex]
const tabsContainer = tabsContainerRef.current
const { offsetWidth, offsetLeft, offsetHeight } = activeTab
- const padding = 24 // 12px padding on each side
+ const padding = Math.min(24, Math.max(8, offsetWidth * 0.12))
// Get the container's top position relative to the viewport
const containerTop = tabsContainer.getBoundingClientRect().top
@@ -124,15 +124,15 @@ export default function Tabs({
threshold ? '-translate-y-[calc(100%+12rem)]' : ''
)}
>
-
+
{tabs.map((tab, index) => (
))}
- {options &&
{options}
}
+ {options ? (
+
{options}
+ ) : null}
)
}
diff --git a/src/components/ZapDialog/PostPaymentMessagePrompt.tsx b/src/components/ZapDialog/PostPaymentMessagePrompt.tsx
index 21eb38e8..8fe5cbca 100644
--- a/src/components/ZapDialog/PostPaymentMessagePrompt.tsx
+++ b/src/components/ZapDialog/PostPaymentMessagePrompt.tsx
@@ -140,7 +140,7 @@ export default function PostPaymentMessagePrompt({
{t('Post payment prompt label')}
) : null}
-
{body}
+
{body}
{step === 'choice' ? (
{choiceActions}
) : null}
@@ -152,7 +152,7 @@ export default function PostPaymentMessagePrompt({
return (