From 559a52f46f8e76553a83b867ecc9d7bfdec0c86e Mon Sep 17 00:00:00 2001 From: filemon Date: Wed, 20 May 2026 20:42:39 -0300 Subject: [PATCH 001/148] Fix wallet recovery warning contrast in light mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The amber warning alert used bg-amber-500/5 (5% opacity — nearly invisible) and text-amber-900. The faint background combined with potential tailwind-merge ambiguity between the Alert variant's text-foreground and the override text-amber-900 resulted in poor readability in light mode. Align with the established BitcoinPublicDisclaimer pattern: - bg-amber-500/5 → bg-amber-50 (solid visible amber tint) - text-amber-900 → text-amber-950 (darkest amber for max contrast) - border-amber-500/50 → border-amber-300/60 + dark:border-amber-500/30 - dark:bg-amber-950/50 for a distinct dark-mode background - Icon: !text-amber-500 → !text-amber-600 dark:!text-amber-400 No wallet logic, sweep behavior, or component structure changed. --- src/pages/WalletRecoveryPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/WalletRecoveryPage.tsx b/src/pages/WalletRecoveryPage.tsx index 5bae66ce..e511c9db 100644 --- a/src/pages/WalletRecoveryPage.tsx +++ b/src/pages/WalletRecoveryPage.tsx @@ -261,8 +261,8 @@ export function WalletRecoveryPage() { className="font-mono text-sm" /> - - + + Only paste a recovery phrase you trust. Anyone with this phrase can spend the funds. After the sweep completes, delete it from any place you copied it from. From 4df6197a9ad36ccb5d34fa2b1e86fd82209f3e20 Mon Sep 17 00:00:00 2001 From: lemon Date: Wed, 20 May 2026 23:19:55 -0700 Subject: [PATCH 002/148] Add globe backdrop to feed --- src/components/Feed.tsx | 276 +++++++++++++++++++++++----------------- 1 file changed, 156 insertions(+), 120 deletions(-) diff --git a/src/components/Feed.tsx b/src/components/Feed.tsx index 668b09af..b897fff4 100644 --- a/src/components/Feed.tsx +++ b/src/components/Feed.tsx @@ -3,6 +3,7 @@ import { useNavigate } from 'react-router-dom'; import { useInView } from 'react-intersection-observer'; import { usePageRefresh } from '@/hooks/usePageRefresh'; import { ComposeBox } from '@/components/ComposeBox'; +import { HeroGlobe } from '@/components/HeroGlobe'; import { LandingHero } from '@/components/LandingHero'; import { NoteCard } from '@/components/NoteCard'; import { PullToRefresh } from '@/components/PullToRefresh'; @@ -20,6 +21,7 @@ import { useSavedFeeds } from '@/hooks/useSavedFeeds'; import { useResolveTabFilter } from '@/hooks/useResolveTabFilter'; import { useWorldFeed } from '@/hooks/useWorldFeed'; import { shouldHideFeedEvent } from '@/lib/feedUtils'; +import { HOPE_PALETTE } from '@/lib/hopePalette'; import { isEventMuted } from '@/lib/muteHelpers'; import { SubHeaderBar } from '@/components/SubHeaderBar'; import { TabButton } from '@/components/TabButton'; @@ -47,6 +49,30 @@ interface FeedProps { feedId?: string; } +function FeedGlobeBackground() { + const [hueIndex, setHueIndex] = useState(0); + + useEffect(() => { + const id = window.setInterval(() => { + setHueIndex((i) => (i + 1) % HOPE_PALETTE.length); + }, 9_000); + return () => window.clearInterval(id); + }, []); + + return ( + ); } /** Renders a saved search feed using useTabFeed (TanStack Query cached, infinite scroll). */ -function SavedFeedContent({ feed }: { feed: SavedFeed }) { +function SavedFeedContent({ feed, cardClassName }: { feed: SavedFeed; cardClassName?: string }) { const { ref: scrollRef, inView } = useInView({ threshold: 0, rootMargin: '400px' }); const { user } = useCurrentUser(); const { muteItems } = useMuteList(); @@ -435,7 +470,7 @@ function SavedFeedContent({ feed }: { feed: SavedFeed }) { return (
{Array.from({ length: 5 }).map((_, i) => ( - + ))}
); @@ -457,6 +492,7 @@ function SavedFeedContent({ feed }: { feed: SavedFeed }) { key={item.repostedBy ? `repost-${item.repostedBy}-${item.event.id}` : item.event.id} event={item.event} repostedBy={item.repostedBy} + className={cardClassName} /> ))} {hasNextPage && ( @@ -474,9 +510,9 @@ function SavedFeedContent({ feed }: { feed: SavedFeed }) { ); } -function NoteCardSkeleton() { +function NoteCardSkeleton({ className }: { className?: string }) { return ( -
+
From f6947aca9b42f9698bad7b5dc6796919ccdfca0d Mon Sep 17 00:00:00 2001 From: lemon Date: Wed, 20 May 2026 23:21:36 -0700 Subject: [PATCH 003/148] Refine feed globe backdrop --- src/components/Feed.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/Feed.tsx b/src/components/Feed.tsx index b897fff4..e929a422 100644 --- a/src/components/Feed.tsx +++ b/src/components/Feed.tsx @@ -3,6 +3,7 @@ import { useNavigate } from 'react-router-dom'; import { useInView } from 'react-intersection-observer'; import { usePageRefresh } from '@/hooks/usePageRefresh'; import { ComposeBox } from '@/components/ComposeBox'; +import { HeroAtmosphere } from '@/components/HeroAtmosphere'; import { HeroGlobe } from '@/components/HeroGlobe'; import { LandingHero } from '@/components/LandingHero'; import { NoteCard } from '@/components/NoteCard'; @@ -59,12 +60,15 @@ function FeedGlobeBackground() { return () => window.clearInterval(id); }, []); + const activeHue = HOPE_PALETTE[hueIndex]; + return ( -