- Remove tw-animate-css import + dead src/components/ui shadcn tree - Convert 7 orphaned components (moderation, analysis, guild-selector, voice/activity-timeline, shared/empty+error) to new primitives - Add missing moderation/view.tsx; analysis uses SearchPanel directly - globals.css now uses new signal-driven ops-console tokens - tsc --noEmit clean, next build green (11 routes), local smoke 200
36 lines
1018 B
TypeScript
36 lines
1018 B
TypeScript
"use client";
|
|
|
|
import type { AttachmentRef } from "@/lib/types";
|
|
import { cn } from "@/lib/utils";
|
|
|
|
export function AttachmentsGrid({
|
|
attachments,
|
|
onOpen,
|
|
}: {
|
|
attachments: AttachmentRef[];
|
|
onOpen: (url: string) => void;
|
|
}) {
|
|
if (attachments.length === 0) return null;
|
|
const images = attachments.filter((a) => /image/i.test(a.contentType ?? ""));
|
|
if (images.length === 0) return null;
|
|
return (
|
|
<div className="mt-2 grid grid-cols-2 gap-2 sm:grid-cols-3">
|
|
{images.map((a, i) => (
|
|
<button
|
|
key={`${a.url}-${i}`}
|
|
type="button"
|
|
onClick={() => onOpen(a.url)}
|
|
className="group relative aspect-video overflow-hidden rounded-[var(--radius-r-control)] border border-[var(--color-hairline)]"
|
|
>
|
|
<img
|
|
src={a.url}
|
|
alt={a.name}
|
|
loading="lazy"
|
|
className="size-full object-cover transition-transform duration-200 group-hover:scale-105"
|
|
/>
|
|
</button>
|
|
))}
|
|
</div>
|
|
);
|
|
}
|