Files
grimoire/src/components/EventFooter.tsx
Alejandro 2ad3f90174 Improve mobile UX with larger touch targets (#223)
- Add useIsMobile hook for viewport detection
- TabBar: larger height (48px), disable reorder on mobile, hide workspace numbers
- Header buttons: larger touch targets for SpellbookDropdown, UserMenu, LayoutControls
- Window toolbar: larger buttons (40px) on mobile
- Mosaic dividers: wider (12px) on mobile for easier dragging
- CommandLauncher: larger items, footer text, hide kbd hints on mobile
- Editor suggestions: responsive widths, min-height 44px touch targets
- EventFooter: larger kind/relay buttons on mobile
- CodeCopyButton: larger padding and icon on mobile
- MembersDropdown: larger trigger and list items on mobile

All changes use mobile-first Tailwind (base styles for mobile, md: for desktop)
to meet Apple HIG 44px minimum touch target recommendation.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 12:19:31 +01:00

91 lines
3.1 KiB
TypeScript

import { NostrEvent } from "@/types/nostr";
import { KindBadge } from "./KindBadge";
import { Wifi } from "lucide-react";
import { getSeenRelays } from "applesauce-core/helpers/relays";
import { useGrimoire } from "@/core/state";
import { getKindName } from "@/constants/kinds";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuLabel,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { RelayLink } from "./nostr/RelayLink";
interface EventFooterProps {
event: NostrEvent;
}
/**
* EventFooter - Subtle footer for events showing kind and relay information
* Left: Kind badge (clickable to open KIND command)
* Right: Relay count dropdown
*/
export function EventFooter({ event }: EventFooterProps) {
const { addWindow } = useGrimoire();
// Get relays this event was seen on
const seenRelaysSet = getSeenRelays(event);
const relays = seenRelaysSet ? Array.from(seenRelaysSet) : [];
const kindName = getKindName(event.kind);
const handleKindClick = () => {
// Open KIND command to show NIP documentation for this kind
addWindow("kind", { number: event.kind });
};
return (
<div className="pt-2">
{/* Footer Bar */}
<div className="flex items-center justify-between text-xs text-muted-foreground">
{/* Left: Kind Badge */}
<button
onClick={handleKindClick}
className="group flex items-center gap-2 md:gap-1.5 min-h-[44px] md:min-h-0 px-1 -mx-1 cursor-crosshair hover:text-foreground transition-colors"
title={`View documentation for kind ${event.kind}`}
>
<KindBadge
kind={event.kind}
variant="compact"
iconClassname="text-muted-foreground group-hover:text-foreground transition-colors size-4 md:size-3"
/>
<span className="text-xs md:text-[10px] md:leading-[10px]">
{kindName}
</span>
</button>
{/* Right: Relay Dropdown */}
{relays.length > 0 && (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<button
className="flex items-center gap-2 md:gap-1 min-h-[44px] md:min-h-0 px-1 -mx-1 cursor-pointer hover:text-foreground transition-colors"
title={`Seen on ${relays.length} relay${relays.length > 1 ? "s" : ""}`}
>
<Wifi className="size-4 md:size-3" />
<span className="text-xs md:text-[10px] md:leading-[10px]">
{relays.length}
</span>
</button>
</DropdownMenuTrigger>
<DropdownMenuContent
align="end"
className="max-h-64 overflow-y-auto p-1"
>
<DropdownMenuLabel>Seen on</DropdownMenuLabel>
{relays.map((relay) => (
<RelayLink
key={relay}
url={relay}
showInboxOutbox={false}
className="px-2 py-1 rounded-sm"
/>
))}
</DropdownMenuContent>
</DropdownMenu>
)}
</div>
</div>
);
}