import { Search } from "lucide-react"; import type { ReactNode } from "react"; import { FeedEmpty, FeedError, FeedLoading, TweetSkeletonRows, } from "./FeedState"; import { ConversationSurfaceScope } from "#/lib/conversation-surface"; import { feedClass, pageHeaderClass, pageHeaderRowClass, pageSubtitleClass, pageTitleClass, searchFieldIconClass, searchFieldInputClass, searchFieldShellClass, } from "#/lib/ui"; export function TimelineFeedHeader({ title, subtitles, action, controls, }: { title: string; subtitles: ReactNode; action?: ReactNode; controls?: ReactNode; }) { return (

{title}

{subtitles}
{action}
{controls}
); } export function TimelineHeaderSubtitle({ children }: { children: ReactNode }) { return

{children}

; } export function TimelineSearchField({ value, onChange, placeholder, }: { value: string; onChange: (value: string) => void; placeholder: string; }) { return (
); } export function TimelineFeedShell({ header, notice, loading, loadingLabel, loadingDetail, error, errorTitle, onRetry, empty, emptyLabel, emptyDetail, children, hasMore, loadingMore, onLoadMore, }: { header: ReactNode; notice?: ReactNode; loading: boolean; loadingLabel: string; loadingDetail: string; error: string | null; errorTitle: string; onRetry: () => void; empty: boolean; emptyLabel: string; emptyDetail: string; children: ReactNode; hasMore: boolean; loadingMore: boolean; onLoadMore: () => void; }) { return ( <> {header} {notice}
{loading ? ( ) : error ? ( Retry } message={error} title={errorTitle} /> ) : empty ? ( ) : null} {children} {!loading && !error && hasMore ? (
) : null}
); }