import React, { useState } from 'react';
import { Copy, Check } from 'lucide-react';
import type { ReactNode } from 'react';
interface KeyValueItem {
key: string;
value: ReactNode;
copyable?: boolean;
}
interface KeyValueListProps {
items: KeyValueItem[];
layout?: 'horizontal' | 'vertical';
className?: string;
}
export default function KeyValueList({
items,
layout = 'horizontal',
className = ''
}: KeyValueListProps) {
return (
{items.map((item, idx) => (
))}
);
}
function KeyValueRow({ item, layout }: { item: KeyValueItem; layout: 'horizontal' | 'vertical' }) {
const [copied, setCopied] = useState(false);
const handleCopy = async () => {
if (typeof item.value === 'string') {
await navigator.clipboard.writeText(item.value);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
}
};
const containerClasses = layout === 'horizontal'
? 'grid grid-cols-[auto_1fr] gap-2 items-center'
: 'flex flex-col gap-1';
const keyClasses = layout === 'horizontal'
? 'text-muted-foreground font-medium'
: 'text-xs uppercase tracking-wider text-muted-foreground font-semibold';
return (
{item.key}
{item.value}
{item.copyable && typeof item.value === 'string' && (
)}
);
}