// Inline chip referencing a model element. // Renders four visual styles via CSS (pill / color / underline / bracket). // Ported from docs/design-source/socrata/project/text-canvas.jsx (Chip). // M1: static. M2: becomes a TipTap node-view. import type { ChipKind } from "../../lib/fixtures/aristotle"; export type MarkupStyle = "pill" | "color" | "underline" | "bracket"; const KIND_LABEL: Record = { block: "block", property: "property", association: "assoc", requirement: "req", }; function kindGlyph(kind: ChipKind): string { switch (kind) { case "block": return "▢"; case "property": return "·"; case "association": return "→"; case "requirement": return "§"; } } interface ChipProps { kind: ChipKind; id: string; label: string; markupStyle: MarkupStyle; focused?: boolean; onHover?: (id: string | null) => void; onClick?: (id: string, kind: ChipKind) => void; } export function Chip({ kind, id, label, markupStyle, focused, onHover, onClick }: ChipProps) { const cls = `chip chip-${kind} chip-style-${markupStyle}${focused ? " chip-focus" : ""}`; const handlers = { onMouseEnter: () => onHover?.(id), onMouseLeave: () => onHover?.(null), onClick: () => onClick?.(id, kind), }; if (markupStyle === "bracket") { return ( [ {KIND_LABEL[kind]}: {label} ] ); } if (markupStyle === "underline") { return ( {kindGlyph(kind)} {label} ); } // pill (default) and color both render as filled chips. return ( {kindGlyph(kind)} {label} ); }