"use client"; import { useMemo } from "react"; import type { TextRendererProps } from "./types"; const VERTICAL_ALIGN_MAP: Record = { top: "flex-start", middle: "center", bottom: "flex-end", }; interface ConditionalStyleRule { value: string; backgroundColor?: string; fontColor?: string; } function resolveConditionalStyles( component: TextRendererProps["component"], displayValue: string, ): { backgroundColor?: string; fontColor?: string } { const rules = component.conditionalStyles as ConditionalStyleRule[] | undefined; if (!rules || !Array.isArray(rules) || rules.length === 0) { return {}; } const normalizedValue = displayValue.trim(); const matched = rules.find((r) => r.value === normalizedValue); if (!matched) return {}; return { backgroundColor: matched.backgroundColor, fontColor: matched.fontColor, }; } export function TextRenderer({ component, displayValue }: TextRendererProps) { const isOverflowHidden = component.textOverflow === "clip" || component.textOverflow === "ellipsis"; const conditionalOverrides = useMemo( () => resolveConditionalStyles(component, displayValue), [component, displayValue], ); const bgColor = conditionalOverrides.backgroundColor || component.backgroundColor || undefined; const fgColor = conditionalOverrides.fontColor || component.fontColor || "#000000"; return (
0 ? `${component.borderWidth}px solid ${component.borderColor || "#d1d5db"}` : undefined, borderRadius: component.borderRadius ? `${component.borderRadius}px` : undefined, overflow: "hidden", }} >
{displayValue}
); }