"use client"; import { type NodeProps } from "@xyflow/react"; import { Crosshair } from "lucide-react"; import { GraphNodeShell } from "@/components/attack-paths/graph/nodes/graph-node-shell"; import { GRAPH_OUTCOME_BORDER_COLOR, GRAPH_OUTCOME_FILL_COLOR, } from "@/lib/attack-paths"; import { OUTCOME_PROPS } from "@/lib/attack-paths/group-graph"; import { OUTCOME_NODE_DIMENSIONS } from "@/lib/attack-paths/node-dimensions"; import { getNodeLabelDisplay } from "@/lib/attack-paths/node-label-lines"; import type { GraphNode } from "@/types/attack-paths"; interface OutcomeNodeData { graphNode: GraphNode; [key: string]: unknown; } const NODE_WIDTH = OUTCOME_NODE_DIMENSIONS.WIDTH; const NODE_HEIGHT = OUTCOME_NODE_DIMENSIONS.HEIGHT; const NAME_MAX_CHARS = OUTCOME_NODE_DIMENSIONS.LABEL_MAX_CHARS; const NAME_MAX_LINES = OUTCOME_NODE_DIMENSIONS.LABEL_MAX_LINES; const BADGE_RADIUS = 24; const BADGE_CENTER_X = NODE_WIDTH / 2; const BADGE_CENTER_Y = 26; const ICON_SIZE = 26; const ICON_X = BADGE_CENTER_X - ICON_SIZE / 2; const ICON_Y = BADGE_CENTER_Y - ICON_SIZE / 2; const TEXT_X = BADGE_CENTER_X; const KICKER_Y = 64; const LABEL_Y = 78; const LABEL_LINE_HEIGHT = 13; export const OutcomeNode = ({ data, selected }: NodeProps) => { const { graphNode } = data as OutcomeNodeData; const label = String(graphNode.properties[OUTCOME_PROPS.LABEL] ?? "Outcome"); const partial = Boolean(graphNode.properties[OUTCOME_PROPS.PARTIAL]); const name = getNodeLabelDisplay(label, NAME_MAX_CHARS, NAME_MAX_LINES); return ( {partial ? "LATENT OUTCOME" : "OUTCOME"} {name.lines.map((line, index) => ( {line} ))} ); };