content-explorer/ui/components/cell-renderers.tsx
tegwick d92eb25f92 Map records to generic browser rows.
CONTENT-WP-0002-T03 renders manifest columns through a pure row mapper and replaceable cell renderers.

Assistant: grok
Assistant-Session: 01a1346c-fdff-7741-b1af-b7283661554b
2026-10-13 23:01:09 +02:00

39 lines
1.2 KiB
TypeScript

import type { ReactNode } from "react";
import type { BrowserRow, CellValue } from "@/lib/browser-row";
/**
* Generic cell renderers. Callers replace any key or cell kind.
* OnCo's table cells for molecules, flags, and domain icons are not included.
*/
export type CellRenderer = (cell: CellValue, row: BrowserRow) => ReactNode;
export function renderGenericCell(cell: CellValue): ReactNode {
if (cell.kind === "text") return cell.text;
if (cell.kind === "link") {
return <a className="underline" href={cell.href}>{cell.label}</a>;
}
return (
<span className="inline-flex flex-wrap gap-1">
{cell.values.map((value) => (
<span key={value} className="chip">{value}</span>
))}
</span>
);
}
export const genericCellRenderers: Record<string, CellRenderer> = {
text: (cell) => renderGenericCell(cell),
link: (cell) => renderGenericCell(cell),
chips: (cell) => renderGenericCell(cell),
};
export function renderCell(
key: string,
row: BrowserRow,
registry: Record<string, CellRenderer> = genericCellRenderers,
): ReactNode {
const cell = row.cols[key];
if (!cell) return null;
const render = registry[key] ?? registry[cell.kind] ?? renderGenericCell;
return render(cell, row);
}