@viswa-test/test-citation 0.0.390 → 0.0.391
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/features/CognitiveCompare/CitationAnchor.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CitationAnchor.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CitationRenderer.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CitationRenderer.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitivePopup.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitivePopup.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CompareContext.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CompareContext.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
- package/dist/cjs/features/PdfViewer/PdfToolbar.js +1 -1
- package/dist/cjs/features/PdfViewer/PdfToolbar.js.map +1 -1
- package/dist/cjs/features/PdfViewer/PdfViewer.css.js +1 -1
- package/dist/cjs/features/PdfViewer/PdfViewer.js +1 -1
- package/dist/cjs/features/PdfViewer/PdfViewer.js.map +1 -1
- package/dist/cjs/features/PdfViewer/rotationManager.js +1 -1
- package/dist/cjs/features/PdfViewer/rotationManager.js.map +1 -1
- package/dist/cjs/features/PdfViewer/usePdfHighlight.js +1 -1
- package/dist/cjs/features/PdfViewer/usePdfHighlight.js.map +1 -1
- package/dist/cjs/features/PdfViewer/zoomStateManager.js +2 -0
- package/dist/cjs/features/PdfViewer/zoomStateManager.js.map +1 -0
- package/dist/cjs/features/SegmentReviewComponents/CognitiveScoreBadge.js +1 -1
- package/dist/cjs/features/SegmentReviewComponents/CognitiveScoreBadge.js.map +1 -1
- package/dist/cjs/features/SegmentReviewComponents/reviewStepAdapters.js +1 -1
- package/dist/cjs/features/SegmentReviewComponents/reviewStepAdapters.js.map +1 -1
- package/dist/features/CognitiveCompare/CitationAnchor.js +1 -1
- package/dist/features/CognitiveCompare/CitationAnchor.js.map +1 -1
- package/dist/features/CognitiveCompare/CitationRenderer.js +1 -1
- package/dist/features/CognitiveCompare/CitationRenderer.js.map +1 -1
- package/dist/features/CognitiveCompare/CognitiveCompare.js +1 -1
- package/dist/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
- package/dist/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
- package/dist/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
- package/dist/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
- package/dist/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
- package/dist/features/CognitiveCompare/CognitivePopup.js +1 -1
- package/dist/features/CognitiveCompare/CognitivePopup.js.map +1 -1
- package/dist/features/CognitiveCompare/CompareContext.js +1 -1
- package/dist/features/CognitiveCompare/CompareContext.js.map +1 -1
- package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
- package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
- package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
- package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
- package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
- package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
- package/dist/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
- package/dist/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
- package/dist/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
- package/dist/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
- package/dist/features/CognitiveCompare/components/SectionAccordion.js +1 -1
- package/dist/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
- package/dist/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
- package/dist/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
- package/dist/features/CognitiveCompare/components/SvgConnectors.js +1 -1
- package/dist/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
- package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/useCompareData.js +1 -1
- package/dist/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
- package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
- package/dist/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
- package/dist/features/PdfViewer/PdfToolbar.js +1 -1
- package/dist/features/PdfViewer/PdfToolbar.js.map +1 -1
- package/dist/features/PdfViewer/PdfViewer.css.js +1 -1
- package/dist/features/PdfViewer/PdfViewer.js +1 -1
- package/dist/features/PdfViewer/PdfViewer.js.map +1 -1
- package/dist/features/PdfViewer/rotationManager.js +1 -1
- package/dist/features/PdfViewer/rotationManager.js.map +1 -1
- package/dist/features/PdfViewer/usePdfHighlight.js +1 -1
- package/dist/features/PdfViewer/usePdfHighlight.js.map +1 -1
- package/dist/features/PdfViewer/zoomStateManager.js +2 -0
- package/dist/features/PdfViewer/zoomStateManager.js.map +1 -0
- package/dist/features/SegmentReviewComponents/CognitiveScoreBadge.js +1 -1
- package/dist/features/SegmentReviewComponents/CognitiveScoreBadge.js.map +1 -1
- package/dist/features/SegmentReviewComponents/reviewStepAdapters.js +1 -1
- package/dist/features/SegmentReviewComponents/reviewStepAdapters.js.map +1 -1
- package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts +0 -2
- package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts +1 -8
- package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts +3 -12
- package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts +0 -12
- package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitivePopup.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CompareContext.d.ts +2 -9
- package/dist/types/features/CognitiveCompare/CompareContext.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/Guidelines/components/GuidelinePanel.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/Guidelines/components/WebGptPanel.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts +1 -14
- package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/LHSSectionRow.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/RHSSectionRow.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/SectionAccordion.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/SubSectionAccordion.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts +3 -2
- package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts +1 -2
- package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useLinesCalculator.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useSideBySide.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/PdfToolbar.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/PdfViewer.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/rotationManager.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/usePdfHighlight.d.ts +1 -2
- package/dist/types/features/PdfViewer/usePdfHighlight.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/zoomStateManager.d.ts +21 -0
- package/dist/types/features/PdfViewer/zoomStateManager.d.ts.map +1 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CognitiveCompare.js","sources":["../../../src/features/CognitiveCompare/CognitiveCompare.tsx"],"sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n} from \"react\";\nimport {\n Box,\n Typography,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n Snackbar,\n Alert,\n Tooltip,\n Tabs,\n Tab,\n} from \"@mui/material\";\nimport { ChevronDown, EllipsisVertical } from \"lucide-react\";\n\nimport { ButtonCognitiveIcon } from \"../../assests/svg/ButtonCognitiveIcon\";\nimport OverlayLoader from \"./OverlayComponent\";\nimport {\n safeStringify,\n hasValue,\n generateColorPalette,\n debounce,\n DEVIATION_BADGE_SEPARATOR,\n getBentArrowPath,\n smoothScrollTo,\n isMissingStr,\n extractDeviationScore,\n getFirstDeviationColor,\n getFirstDeviationOutputValue,\n recursivelyFindSubSectionIdxById,\n scrollAndHighlightClause,\n resetClauseHighlight,\n findKeyPathByNodeId,\n waitForElementVisible,\n hasMeaningfulRedlineTags,\n scrollAndWait,\n waitForScrollIdle\n} from \"./CognitiveComparehelpers\";\nimport {\n CognitiveDecisioningEntry,\n CognitiveCompareProps,\n StyleVariant,\n ComparisonConfig,\n SectionBlock,\n SectionPopupState,\n CachedBadgePosition,\n DivRefMap\n} from \"./CognitiveCompareTypes\";\nimport {\n DEFAULT_FIELD_CONFIG,\n DEFAULT_COMPARISON_CONFIG,\n SHARED_MARKDOWN_STYLES,\n} from \"./CognitiveCompareConfig\";\nimport { DEFAULT_DEVIAION_COLOR, DEFAULT_COMPONENT_HEADER_TEXT, EMPTY_SUMMARY_POPUP_STATE } from \"./CognitiveCompareConstants\";\nimport CognitivePopup from \"./CognitivePopup\";\nimport MoreFunctionsPopup from \"./MoreFunctionsPopup\";\nimport BouncingDotsLoader from \"./LoaderComponent\";\nimport ThreeDotsLoader from \"./components/ThreeDotsLoader\";\nimport { MemoizedMarkdown } from \"./hooks/memoizedMarkdown\";\nimport { useCognitiveTreeData } from \"./hooks/useCompareData\";\nimport { useComparePopups } from \"./hooks/useComparePopups\";\nimport { useSectionRefs } from \"./hooks/useSectionRefs\";\nimport { useAccordionState } from \"./hooks/useAccordionState\";\nimport { useDeviationNavigation } from \"./hooks/useDeviationNavigation\";\nimport { useOnDemandCitationCache } from \"./hooks/useOnDemandCitationCache\";\nimport CompareHeader from \"./components/CompareHeader\";\nimport SectionAccordion from \"./components/SectionAccordion\";\nimport SubSectionAccordion from \"./components/SubSectionAccordion\";\nimport LHSSectionRow from \"./components/LHSSectionRow\";\nimport RHSSectionRow from \"./components/RHSSectionRow\";\nimport CognitiveSummaryPopup from \"./components/CognitiveSummaryPopup\";\nimport ConnectedLinesComp from \"./components/connectedLines\";\nimport { CompareContextProvider } from \"./CompareContext\";\nimport { useStyleHelpers } from \"./hooks/useStyles\";\nimport { useResizeHandler } from \"./hooks/useResizeHandler\";\nimport { useLinesCalculator } from \"./hooks/useLinesCalculator\";\nimport { useSideBySide } from \"./hooks/useSideBySide\";\nimport SvgConnectors from \"./components/SvgConnectors\";\nimport GuidelinePanel from \"./Guidelines/components/GuidelinePanel\";\nimport WebGptPanel from \"./Guidelines/components/WebGptPanel\";\nimport { GuidelineSkeleton } from \"./components/GuidelineSkeletonLoader\";\nimport { getVisibleGuidelineTargets } from \"./Guidelines/utils/guidelineTargets\";\nimport { hasGptCitationObjects } from \"./Guidelines/utils/hasGptCitationObjects\";\n// import GuidelinePanel from \"./components/GuidelinePanel\"; // ── NEW IMPORT ──\n\nconst CognitiveCompare = ({\n componentHeaderText = DEFAULT_COMPONENT_HEADER_TEXT,\n treeData,\n comparisonConfig,\n leftColumnTitleText,\n rightColumnTitleText,\n markdownStyles,\n resetTrigger,\n displayConfig = {\n isHeaderVisible: true,\n isToggleVisible: true,\n maintainRelativeOrder: false,\n isLoading: true,\n showDeviationBadges: false,\n enableDeviationSchemaBackwardCompatibility: false,\n displayEmailNotifier: true,\n isStreamingEnabled: false\n },\n onMaintainRelativeOrderChange,\n popupConfig,\n deviationData = {},\n deviationNodeIdToView,\n resetDeviationNodeId,\n isProposingFix = false,\n proposingFixNodeId,\n isRedlineFlow,\n badgeStyleOverride,\n guidelinesData, // ── NEW PROP ──\n isGuidelineMode: isGuidelineModeFromParent,\n gptWebCitationConfig,\n onDemandCitationConfig,\n}: CognitiveCompareProps) => {\n const [maintainRelativeOrder, setMaintainRelativeOrder] = useState(displayConfig.maintainRelativeOrder);\n const expandLevels = displayConfig?.expandLevels ?? 0; // how deep to auto-expand\n const shouldExpandAll = !!displayConfig?.expandAllSections; // expand everything\n const shouldShowDeviationBadges =\n !!maintainRelativeOrder || !!displayConfig?.showDeviationBadges;\n const [isToggling, setIsToggling] = useState(false);\n const [errorToast, setErrorToast] = useState<string | null>(null);\n const [isDeviationBackwardCompatible] = useState(\n treeData?.newEvaluationResult ??\n displayConfig?.enableDeviationSchemaBackwardCompatibility ??\n true\n );\n\n const [connectedSections, setConnectedSections] = useState<Set<number | string>>(new Set());\n const [connectedLines, setConnectedLines] = useState<Record<string, any>[]>([]);\n const [scrollSyncLocked, setScrollSyncLocked] = useState(false);\n const [guidelinesTab, setGuidelinesTab] = useState(0);\n\n const svgContainerRef = useRef<SVGSVGElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const leftHeaderRef = useRef<HTMLDivElement>(null);\n const rightHeaderRef = useRef<HTMLDivElement>(null);\n const pendingClauseScrollRef = useRef<string | null>(null);\n const isAnimatingRef = useRef(false);\n const animationTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pathRefs = useRef<Record<string, SVGPathElement | null>>({});\n const cachedConnectedPositions = useRef<CachedBadgePosition[]>([]);\n const calculateLinesRef = useRef<() => void>(() => { });\n const resizeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const handleResizeRef = useRef<() => void>(() => { });\n\n const stableDeviationDataStr = useMemo(\n () => JSON.stringify(deviationData || {}),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(deviationData)]\n);\nconst stableDeviationData = useMemo(\n () => (deviationData || {}) as Record<string, any>,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [stableDeviationDataStr]\n);\n const hasWebGptCitations = useMemo(\n () => hasGptCitationObjects(stableDeviationData),\n [stableDeviationData],\n );\n const cognitiveMap = useMemo<Record<string, CognitiveDecisioningEntry>>(\n () => treeData?.cognitive_decisioning || {},\n [treeData],\n );\n\n const resolvedMarkdownStyles = useMemo(\n () => ({ ...SHARED_MARKDOWN_STYLES, ...markdownStyles }),\n [markdownStyles],\n );\n\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const ruleComponentRef = useRef<HTMLDivElement>(null);\n const rightContainerRef = useRef<HTMLDivElement>(null);\n const rhsTopSpacerRef = useRef<HTMLDivElement>(null);\n const rhsBottomSpacerRef = useRef<HTMLDivElement>(null);\n const lhsTopSpacerRef = useRef<HTMLDivElement>(null);\n const lhsBottomSpacerRef = useRef<HTMLDivElement>(null);\n const leftContainerRef = useRef<HTMLDivElement>(null);\n\n const pendingScrollTargetRef = useRef<number | null>(null);\n const pendingScrollCallbackRef = useRef<(() => void) | null>(null);\n \n\n const {\n cognitivePopup,\n setCognitivePopup,\n moreFunctions,\n setMoreFunctions,\n position,\n setPosition,\n activeBadgeId,\n summaryPopup,\n setSummaryPopup,\n closeSummaryPopup,\n setActiveBadgeId,\n popupRef,\n handleOpenCognitiveCompare,\n openCognitivePopupFromState,\n closeCognitivePopup,\n closeMoreFunctionsPopup,\n } = useComparePopups(scrollContainerRef);\n\n // Merges caller overrides with defaults so UI thresholds/colors are always fully populated.\n const resolvedComparisonConfig = useMemo<ComparisonConfig>(\n () => ({\n fields: comparisonConfig?.fields ?? DEFAULT_FIELD_CONFIG,\n thresholds: {\n high:\n comparisonConfig?.thresholds?.high ??\n DEFAULT_COMPARISON_CONFIG.thresholds.high,\n medium:\n comparisonConfig?.thresholds?.medium ??\n DEFAULT_COMPARISON_CONFIG.thresholds.medium,\n exact:\n comparisonConfig?.thresholds?.exact ??\n DEFAULT_COMPARISON_CONFIG.thresholds.exact,\n },\n }),\n [comparisonConfig],\n );\n\n\n const [localHighlightField, setLocalHighlightField] = useState<string | null>(\n null,\n );\n const jsonLeftTitle =\n treeData?.documents?.[treeData?.input_index_map?.[\"0\"]]?.title;\n const jsonRightTitle =\n treeData?.documents?.[treeData?.input_index_map?.[\"1\"]]?.title;\n const leftColumnTitle: string = safeStringify(\n leftColumnTitleText || jsonLeftTitle || \"Uploaded Contract\",\n );\n\n const jsonLeftTitleTrimmed = treeData?.documents?.[treeData?.input_index_map?.[\"0\"]]?.metadata?.file_name;\n const leftTitleTrimmed = safeStringify(jsonLeftTitleTrimmed);\n\n const jsonRightTitleTrimmed = treeData?.documents?.[treeData?.input_index_map?.[\"1\"]]?.metadata?.file_name;\n const rightTitleTrimmed = safeStringify(jsonRightTitleTrimmed);\n const rightColumnTitle: string = safeStringify(\n rightColumnTitleText || jsonRightTitle || \"Reference Template\",\n );\n const {\n isGuidelineMode, // ── EXTRACT ──\n activeProposed,\n existingRule,\n proposedSections,\n existingSections,\n visibleFields,\n parentDeviationRecord,\n deviationNumberRegistry,\n deviationParentRegistry,\n parseError\n } = useCognitiveTreeData(\n treeData as Record<string, any>,\n maintainRelativeOrder as boolean,\n stableDeviationData,\n resolvedComparisonConfig,\n isDeviationBackwardCompatible,\n guidelinesData, // ── NEW ──\n isGuidelineModeFromParent\n );\n\n useEffect(() => {\n if (parseError) setErrorToast(`Failed to load comparison: ${parseError}`);\n }, [parseError]);\n\n const hasSectionAccordions =\n proposedSections.length > 0 || existingSections.length > 0;\n\n const redlineLayoutSignature = useMemo(() => {\n if (!isRedlineFlow) return \"off\";\n let count = 0;\n let totalLen = 0;\n\n const walk = (sections?: SectionBlock[]) => {\n if (!Array.isArray(sections)) return;\n sections.forEach((section) => {\n const content = section?.content || \"\";\n if (hasMeaningfulRedlineTags(content)) {\n count += 1;\n totalLen += String(content).length;\n }\n if (section?.subsections?.length) {\n walk(section.subsections as SectionBlock[]);\n }\n });\n };\n\n walk(proposedSections as SectionBlock[]);\n walk(existingSections as SectionBlock[]);\n\n return `${count}:${totalLen}`;\n }, [isRedlineFlow, proposedSections, existingSections]);\n\n useEffect(() => {\n if (!proposedSections.length && !existingSections.length) return;\n\n if (shouldExpandAll) {\n const nextSections: Record<string, boolean> = {};\n const nextSubSections: Record<string, boolean> = {};\n\n const expandAll = (sections: SectionBlock[], side: \"left\" | \"right\") => {\n sections.forEach((sec, idx) => {\n const key = maintainRelativeOrder ? `${side}-${idx}` : String(idx);\n nextSections[key] = true;\n\n const expandSubsRecursively = (subsections: SectionBlock[], parentPath: string) => {\n subsections?.forEach((sub, subIdx) => {\n const subPath = `${parentPath}-${subIdx}`;\n nextSubSections[subPath] = true;\n if (sub.subsections?.length) {\n expandSubsRecursively(sub.subsections as SectionBlock[], subPath);\n }\n });\n };\n\n if (sec.subsections?.length) {\n expandSubsRecursively(sec.subsections as SectionBlock[], String(idx));\n }\n });\n };\n\n expandAll(proposedSections as SectionBlock[], \"left\");\n expandAll(existingSections as SectionBlock[], \"right\");\n\n setExpandedSections(nextSections);\n setExpandedSubSections(nextSubSections);\n\n } else if (expandLevels > 0) {\n const nextSections: Record<string, boolean> = {};\n const nextSubSections: Record<string, boolean> = {};\n\n const expandToDepth = (\n sections: SectionBlock[],\n side: \"left\" | \"right\",\n maxDepth: number\n ) => {\n sections.forEach((sec, idx) => {\n if (maxDepth >= 1) {\n const key = maintainRelativeOrder ? `${side}-${idx}` : String(idx);\n nextSections[key] = true;\n }\n\n const expandSubsToDepth = (\n subsections: SectionBlock[],\n parentPath: string,\n currentDepth: number\n ) => {\n if (currentDepth > maxDepth) return;\n subsections?.forEach((sub, subIdx) => {\n const subPath = `${parentPath}-${subIdx}`;\n nextSubSections[subPath] = true;\n if (sub.subsections?.length) {\n expandSubsToDepth(sub.subsections as SectionBlock[], subPath, currentDepth + 1);\n }\n });\n };\n\n if (sec.subsections?.length && maxDepth >= 2) {\n expandSubsToDepth(sec.subsections as SectionBlock[], String(idx), 2);\n }\n });\n };\n\n expandToDepth(proposedSections as SectionBlock[], \"left\", expandLevels);\n expandToDepth(existingSections as SectionBlock[], \"right\", expandLevels);\n\n setExpandedSections(nextSections);\n setExpandedSubSections(nextSubSections);\n }\n}, [shouldExpandAll, expandLevels, proposedSections, existingSections, maintainRelativeOrder]);\n \n const {\n leftRefs,\n rightRefs,\n sectionLeftRefs,\n sectionRightRefs,\n lhsBadgeRefs,\n rhsBadgeRefs,\n sectionRightRowRefs,\n subSectionLeftRefs,\n subSectionRightRefs,\n sectionRowRefs,\n getSectionRowRef,\n getSubSectionRef,\n getBadgeRef,\n } = useSectionRefs(\n visibleFields.map(({ key }) => key),\n Math.max(proposedSections.length, existingSections.length),\n );\n\n const { isSideBySide, isArrowVisible, setIsSideBySide, setIsArrowVisible, isResizing, setIsResizing, isSideBySideLoading, setIsSideBySideLoading, activeSideBySideSection, setActiveSideBySideSection, scrollLock, sideBySideCacheRef, isSideBySideRef, activeSideBySideRightSectionRef, activeSideBySideSectionRef, sideBySideLineRef, highlightedClauseRefs, clearClauseHighlight, applyAlignmentPadding, resetSideBySide, activateSideBySide } = useSideBySide({\n isGuidelineMode,\n maintainRelativeOrder,\n proposedSections,\n existingSections,\n leftContainerRef, rightContainerRef, scrollContainerRef,\n sectionLeftRefs, sectionRightRefs,\n subSectionLeftRefs, subSectionRightRefs,\n lhsBadgeRefs, rhsBadgeRefs,\n sectionRowRefs, sectionRightRowRefs,\n rhsTopSpacerRef, rhsBottomSpacerRef, lhsTopSpacerRef, lhsBottomSpacerRef,\n calculateLinesRef,\n setConnectedSections, setConnectedLines, cachedConnectedPositions,\n closeMoreFunctionsPopup, setErrorToast, moreFunctions, closeSummaryPopup\n });\n const activateSideBySideRef = useRef(activateSideBySide);\n useEffect(() => {\n activateSideBySideRef.current = activateSideBySide;\n }, [activateSideBySide]);\n\n const {\n expandedSections,\n setExpandedSections,\n expandedSubSections,\n setExpandedSubSections,\n handleSubSectionToggle,\n toggleSection,\n forceExpandCrossWiredSections,\n } = useAccordionState({\n maintainRelativeOrder: !!maintainRelativeOrder,\n proposedSections,\n existingSections,\n activeSideBySideSection,\n connectedSections,\n resetSideBySide,\n setConnectedSections,\n setConnectedLines,\n cachedConnectedPositions,\n svgContainerRef,\n isAnimatingRef,\n animationTimerRef,\n calculateLinesRef,\n sectionLeftRefs,\n sectionRightRefs,\n subSectionLeftRefs,\n subSectionRightRefs,\n });\n\n const alignActiveSections = () => {\n if (activeSideBySideSection == null) return;\n\n const leftEl =\n sectionLeftRefs.current[activeSideBySideSection]?.current;\n\n const rightEl =\n sectionRightRefs.current[activeSideBySideSection]?.current;\n\n const rightContainer = rightContainerRef.current;\n\n if (!leftEl || !rightEl || !rightContainer) return;\n\n const leftRect = leftEl.getBoundingClientRect();\n const rightRect = rightEl.getBoundingClientRect();\n const containerRect = rightContainer.getBoundingClientRect();\n\n // desired position inside RHS container\n const desiredTopInsideContainer =\n leftRect.top - containerRect.top;\n\n const currentTopInsideContainer =\n rightRect.top - containerRect.top;\n\n const delta =\n currentTopInsideContainer - desiredTopInsideContainer;\n\n rightContainer.scrollBy({\n top: delta,\n behavior: \"smooth\",\n });\n };\n\n const toggleScrollSyncLocked = useCallback(\n (e?: React.MouseEvent) => {\n e?.stopPropagation();\n\n setScrollSyncLocked((prev) => {\n const nextLocked = !prev;\n\n if (nextLocked) {\n // wait for React to finish updates\n requestAnimationFrame(() => {\n alignActiveSections();\n });\n }\n\n return nextLocked;\n });\n },\n [alignActiveSections]\n );\n useEffect(() => {\n if (!isRedlineFlow) return;\n if (redlineLayoutSignature === \"off\" || redlineLayoutSignature === \"0:0\") return;\n sideBySideCacheRef.current = null;\n cachedConnectedPositions.current = [];\n requestAnimationFrame(() => {\n calculateLinesRef.current?.();\n });\n }, [isRedlineFlow, redlineLayoutSignature]);\n\n // --- NEW: Centralized Unified Numbering System ---\n const unifiedNumbering = useMemo(() => {\n const leftNums = new Map<string, number>();\n const rightNums = new Map<string, string>();\n let counter = 1;\n\n if (!maintainRelativeOrder) {\n const maxLen = Math.max(proposedSections.length, existingSections.length);\n for (let i = 0; i < maxLen; i++) {\n const leftSec = proposedSections[i] as any;\n const rightSec = existingSections[i] as any;\n if (leftSec) {\n leftNums.set(leftSec.id, counter);\n if (rightSec) rightNums.set(rightSec.id, String(counter));\n counter++;\n } else if (rightSec) {\n rightNums.set(rightSec.id, String(counter++));\n }\n }\n } else {\n // 1. Assign sequential numbers to all Proposed (Left) sections\n proposedSections.forEach((sec: any) => {\n const isEmpty = !sec.title && !sec.content;\n if (isEmpty) return; // Skip hidden sections from eating a number\n\n if (sec.id) leftNums.set(sec.id, counter++);\n });\n\n // 2. Map existing (Right) sections\n existingSections.forEach((sec: any) => {\n if (!sec.id) return;\n \n const isEmpty = !sec.title && !sec.content;\n if (isEmpty) return; \n\n const mappedLhs = proposedSections.filter((l: any) => l.refIndexes?.includes(sec.selfIndex));\n\n if (mappedLhs.length > 0) {\n // If mapped, inherit the Left section's number(s) to match identically\n const nums = mappedLhs.map((l: any) => leftNums.get(l.id)).filter(Boolean);\n rightNums.set(sec.id, nums.join(\", \"));\n } else {\n // If orphan, continue the global counter so it's strictly unique\n rightNums.set(sec.id, String(counter++));\n }\n });\n }\n return { leftNums, rightNums };\n }, [proposedSections, existingSections, maintainRelativeOrder]);\n\n const analysisData = existingRule.analysis;\n const overallSummaryRaw = safeStringify(\n analysisData?.rule_difference_comparison?.summary?.overall_summary,\n );\n const reasoningMatch = overallSummaryRaw.match(\n /<ai_reasoning>([\\s\\S]*?)<\\/ai_reasoning>/i,\n );\n const hasReasoning = !!reasoningMatch;\n\n const rootDeviationId = treeData?.base_root_id ?? '-1'\n const rootNode = treeData?.[rootDeviationId]\n const rootEvaluationResult = !isDeviationBackwardCompatible\n ? (deviationData && deviationData?.[rootDeviationId]?.evaluation_result?.[0]) ??\n treeData?.nodes?.[rootDeviationId]?.evaluation_result?.[0] ??\n null\n : (deviationData && deviationData?.[rootDeviationId]?.evaluation_result) ??\n treeData?.nodes?.[rootDeviationId]?.evaluation_result ??\n null;\n const rootDeviationScore = extractDeviationScore(rootEvaluationResult);\n \n let rootDeviationStyle = generateColorPalette(\n rootEvaluationResult?.evaluation_outputs?.metadata?.label_color ?? DEFAULT_DEVIAION_COLOR,\n );\n\n if (badgeStyleOverride) {\n const override = badgeStyleOverride(rootDeviationScore as string | null | undefined);\n \n if (override) {\n rootDeviationStyle = {\n ...rootDeviationStyle,\n badgeBg: override.bg,\n badgeText: override.text,\n badgeBorder: override.border,\n };\n }\n }\nconst resetSideBySideRef = useRef(resetSideBySide);\nuseEffect(() => { resetSideBySideRef.current = resetSideBySide; }, [resetSideBySide]);\n\nconst closeCognitivePopupRef = useRef(closeCognitivePopup);\nuseEffect(() => { closeCognitivePopupRef.current = closeCognitivePopup; }, [closeCognitivePopup]);\nconst openMoreFunctionsPopupStable = useCallback(\n (e: React.MouseEvent, baseSec: SectionBlock, isOrphan: boolean, refSec: SectionBlock, id: string | number, style?: StyleVariant | null) => \n openMoreFunctionsPopupRef.current(e, baseSec, isOrphan, refSec, id, style),\n []\n);\n\nconst handleOpenSummaryPopupStable = useCallback(\n (e: React.MouseEvent, actionId: string, isOrphan: boolean, summary: any, displayImpact?: boolean) => \n handleOpenSummaryPopupRef.current(e, actionId, isOrphan, summary, displayImpact),\n []\n);\n\nconst handleCloseSummaryPopupStable = useCallback(() => handleCloseSummaryPopupRef.current(), []);\n\nconst toggleSectionStable = useCallback(\n (idx: number, columnKey: \"left\" | \"right\") => toggleSectionRef.current(idx, columnKey), \n []\n);\n\nconst handleSubSectionToggleStable = useCallback(\n (keyPath: string) => handleSubSectionToggleRef.current(keyPath), \n []\n);\n\nconst renderSubSectionAccordionStable = useCallback(\n (args: any) => renderSubSectionAccordionRef.current(args), \n []\n);\n\nconst resetSideBySideStable = useCallback(() => resetSideBySideContextRef.current(), []);\n\n const resetAll = useCallback(() => {\n clearClauseHighlight();\n resetSideBySideRef.current?.();\n setScrollSyncLocked(false);\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n setLines([]);\n setOverallConnector(null);\n setSummaryPopup(EMPTY_SUMMARY_POPUP_STATE);\n closeCognitivePopupRef.current?.();\n\n requestAnimationFrame(() => {\n calculateLinesRef.current?.();\n });\n }, []);\n const resetAllRef = useRef(resetAll);\n useEffect(() => {\n resetAllRef.current = resetAll;\n }, [resetAll]);\n\n useEffect(() => {\n if (resetTrigger) {\n resetAllRef.current();\n }\n }, [resetTrigger]);\n const stableDocData = useMemo(() => ({\n documents: treeData?.documents,\n input_index_map: treeData?.input_index_map,\n}), [\n JSON.stringify(treeData?.documents),\n JSON.stringify(treeData?.input_index_map),\n]);\n\n const [baseDocName, setBaseDocName] = useState<string>(\"\");\n const referenceDocName = safeStringify(jsonRightTitle);\n\n const treeDataRef = useRef(treeData);\n useEffect(() => { treeDataRef.current = treeData; \n const baseId = treeData?.input_index_map?.[0];\n const baseContractName = treeData?.documents?.[baseId]?.title;\n setBaseDocName(baseContractName);\n }, [treeData]);\n\n const cognitiveMapRef = useRef(cognitiveMap);\n useEffect(() => { cognitiveMapRef.current = cognitiveMap; }, [cognitiveMap]);\n\n const buildSectionPopupState = useCallback(\n (\n anchorEl: HTMLElement | null,\n baseSec: SectionBlock | null,\n refSec: SectionBlock | null,\n sectionIdx: number | string,\n isOrphan?: boolean,\n style?: StyleVariant | null,\n rootNode?: boolean\n ): SectionPopupState => {\n const getDeviationDataForBadge = () => {\n const fallbackEval = baseSec?.evaluationResult || refSec?.evaluationResult || null;\n // For supporting legacy data\n const getFirstDeviationEntry = (evaluationResult: any) => {\n if (!evaluationResult || typeof evaluationResult !== \"object\") return null;\n\n const fromEntries = evaluationResult?.deviation_entries;\n if (fromEntries && typeof fromEntries === \"object\") {\n const firstEntryKey = Object.keys(fromEntries).sort(\n (a, b) => Number(a) - Number(b),\n )[0];\n if (firstEntryKey && fromEntries[firstEntryKey]) return fromEntries[firstEntryKey];\n }\n\n const numericKeys = Object.keys(evaluationResult)\n .filter((k) => /^\\d+$/.test(k))\n .sort((a, b) => Number(a) - Number(b));\n if (numericKeys.length && evaluationResult[numericKeys[0]]) {\n return evaluationResult[numericKeys[0]];\n }\n\n const fromDeviations = evaluationResult?.deviations;\n if (fromDeviations && typeof fromDeviations === \"object\") {\n const firstDeviationKey = Object.keys(fromDeviations).sort(\n (a, b) => Number(a) - Number(b),\n )[0];\n if (firstDeviationKey && fromDeviations[firstDeviationKey]) {\n return fromDeviations[firstDeviationKey];\n }\n }\n\n return null;\n };\n\n const mergeWithFallbackEntry = (evaluationResult: any) => {\n const firstEntry = getFirstDeviationEntry(evaluationResult);\n if (!firstEntry) return evaluationResult;\n\n return {\n ...evaluationResult,\n deviation_summary:\n evaluationResult?.deviation_summary || firstEntry?.deviation_summary,\n deviation_title:\n evaluationResult?.deviation_title || firstEntry?.deviation_title,\n deviation_impact:\n evaluationResult?.deviation_impact || firstEntry?.deviation_impact,\n deviation_explanation:\n evaluationResult?.deviation_explanation || firstEntry?.deviation_explanation,\n evaluation_outputs:\n evaluationResult?.evaluation_outputs || firstEntry?.evaluation_outputs,\n cognitive_decisioning:\n evaluationResult?.cognitive_decisioning || firstEntry?.cognitive_decisioning,\n };\n };\n\n const isDeviationBadge =\n typeof sectionIdx === \"string\" &&\n sectionIdx.includes(DEVIATION_BADGE_SEPARATOR);\n\n if (!isDeviationBadge) return mergeWithFallbackEntry(fallbackEval);\n\n const parts = sectionIdx.split(DEVIATION_BADGE_SEPARATOR);\n const devKey = parts[1];\n if (!devKey) return fallbackEval;\n\n const evaluationResult =\n baseSec?.evaluationResult || refSec?.evaluationResult || {};\n const deviationEntry =\n evaluationResult?.deviation_entries?.[devKey] ||\n evaluationResult?.deviations?.[devKey] ||\n null;\n\n if (!deviationEntry) return mergeWithFallbackEntry(fallbackEval);\n\n return {\n ...evaluationResult,\n ...deviationEntry,\n deviation_summary:\n deviationEntry?.deviation_summary || evaluationResult?.deviation_summary,\n deviation_title:\n deviationEntry?.deviation_title || evaluationResult?.deviation_title,\n deviation_impact:\n deviationEntry?.deviation_impact || evaluationResult?.deviation_impact,\n deviation_explanation:\n deviationEntry?.deviation_explanation || evaluationResult?.deviation_explanation,\n evaluation_outputs:\n deviationEntry?.evaluation_outputs || evaluationResult?.evaluation_outputs,\n cognitive_decisioning:\n deviationEntry?.cognitive_decisioning || evaluationResult?.cognitive_decisioning,\n };\n };\n\n const sectionId =\n safeStringify(baseSec?.id) || safeStringify(refSec?.id) || \"\";\n const sectionIdxParts =\n typeof sectionIdx === \"string\"\n ? sectionIdx.split(DEVIATION_BADGE_SEPARATOR)\n : [];\n const sourceNodeId =\n sectionIdxParts[0] ||\n safeStringify(baseSec?.nodeId) ||\n safeStringify(refSec?.nodeId) ||\n safeStringify(baseSec?.id).split(DEVIATION_BADGE_SEPARATOR)[0] ||\n safeStringify(refSec?.id).split(DEVIATION_BADGE_SEPARATOR)[0] ||\n undefined;\n const deviationKey =\n sectionIdxParts.length > 1 && sectionIdxParts[1] !== undefined\n ? sectionIdxParts[1]\n : undefined;\n const cogData =\n (sectionId ? cognitiveMapRef.current?.[sectionId] : null) ||\n baseSec?.cognitiveData ||\n refSec?.cognitiveData ||\n {\n section_id: sectionId,\n decisioning: [],\n gap: [],\n relevance_score: 0,\n };\n\n const sectionRowEl = sectionRowRefs.current[sectionIdx as any]?.current ?? null;\n\n const resolvedDeviationData = getDeviationDataForBadge();\n\n const hasDeviationContent =\n (resolvedDeviationData?.cognitive_decisioning?.decisioning_factors?.length ?? 0) > 0 ||\n (resolvedDeviationData?.cognitive_decisioning?.gaps_in_decision?.length ?? 0) > 0;\n\n const globallyLoading = displayConfig?.isLoading ?? false;\n\n // ── FIXED LOGIC: Accurately check the exact specific resolved data for the clause/deviation ──\n let hasGuidelineMatches = true;\n if (isGuidelineMode) {\n const devHighlights = resolvedDeviationData?.deviation_highlights;\n \n if (devHighlights && typeof devHighlights === \"object\") {\n // Check if ANY of the arrays inside deviation_highlights actually have content (length > 0)\n const hasAnyTextToHighlight = Object.values(devHighlights).some(\n (highlightArray: any) => Array.isArray(highlightArray) && highlightArray.length > 0\n );\n \n hasGuidelineMatches = hasAnyTextToHighlight;\n } else {\n hasGuidelineMatches = false; // Disable if deviation_highlights is completely missing\n }\n }\n\n return {\n isLoading: globallyLoading && !hasDeviationContent,\n open: true,\n sectionTitle: baseSec?.title ? baseSec?.title : 'No Counterpart',\n refSectionTitle: refSec?.title ? refSec?.title : 'No Counterpart',\n cognitiveData: cogData,\n anchorEl,\n sectionAnchorEl: sectionRowEl,\n badgeStyle: style || null,\n sectionIdx: sectionIdx as any,\n docData: stableDocData,\n deviationData: resolvedDeviationData,\n isOrphan: !!isOrphan,\n hasGuidelineMatches, // ── PASS FLAG TO POPUP ──\n sourceNodeId,\n deviationKey,\n baseContentId: baseSec?.contentId,\n compareContentIds: [\n ...(refSec?.contentId ? [refSec.contentId] : []),\n ...(baseSec?.refContentIds || []),\n ...(refSec?.refContentIds || []),\n ].filter(Boolean),\n };\n },\n [stableDocData, displayConfig?.isLoading, isGuidelineMode],\n );\n\n\n\n const openMoreFunctionsPopup = useCallback(\n (\n e: React.MouseEvent,\n baseSec: SectionBlock,\n isOrphan: boolean,\n refSec: SectionBlock,\n sectionIdx: number | string,\n style?: StyleVariant | null,\n ) => {\n e.stopPropagation();\n if (moreFunctions.open && moreFunctions.sectionIdx === sectionIdx) {\n closeMoreFunctionsPopup();\n return;\n }\n\n const initialAnchor = e.currentTarget as HTMLElement;\n let sourceSide: \"left\" | \"right\" = \"left\";\n if (rightContainerRef.current?.contains(initialAnchor)) {\n sourceSide = \"right\";\n }\n\n const getFreshAnchor = () => {\n const isSub = typeof sectionIdx === \"string\" && sectionIdx.includes(DEVIATION_BADGE_SEPARATOR);\n if (isSub) {\n const parts = (sectionIdx as string).split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n return sourceSide === \"right\"\n ? rhsBadgeRefs.current[refId]?.current\n : lhsBadgeRefs.current[refId]?.current;\n } else {\n return sourceSide === \"right\"\n ? rhsBadgeRefs.current[sectionIdx as any]?.current\n : lhsBadgeRefs.current[sectionIdx as any]?.current;\n }\n };\n clearClauseHighlight();\n if (isSideBySideRef.current) {\n resetSideBySide();\n }\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n closeCognitivePopup();\n\n if (summaryPopup.open) {\n handleCloseSummaryPopup();\n } else {\n closeSummaryPopup();\n }\n\n requestAnimationFrame(() => {\n const freshAnchor = getFreshAnchor() || initialAnchor;\n\n setMoreFunctions(\n buildSectionPopupState(\n freshAnchor,\n baseSec,\n refSec,\n sectionIdx,\n isOrphan,\n style,\n ),\n );\n });\n },\n [moreFunctions.open, moreFunctions.sectionIdx, closeMoreFunctionsPopup, closeSummaryPopup, buildSectionPopupState, /* other deps used inside */]\n );\n\n const handleConnect = useCallback(() => {\n const idx = moreFunctions.sectionIdx;\n const isOrphan = moreFunctions.isOrphan;\n\n closeMoreFunctionsPopup();\n closeSummaryPopup();\n\n if (idx === null) return;\n // if (isOrphan) {\n // setErrorToast(\"No counterpart exists to connect to.\");\n // return;\n // }\n forceExpandCrossWiredSections(idx);\n clearClauseHighlight();\n if (isSideBySideRef.current) {\n resetSideBySide();\n }\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n\n if (isGuidelineMode && idx !== null) {\n setGuidelinesTab(getGuidelineTabFromId(idx));\n }\n\n setConnectedSections((prev) => {\n if (prev.has(idx)) {\n return new Set();\n }\n return new Set([idx]);\n });\n\n setTimeout(() => {\n if (calculateLinesRef.current) {\n calculateLinesRef.current();\n }\n }, 50);\n\n }, [\n moreFunctions.sectionIdx,\n moreFunctions.isOrphan,\n closeMoreFunctionsPopup,\n closeSummaryPopup,\n resetSideBySide\n ]);\n\n const executePendingClauseScroll = useCallback(() => {\n const nodeId = pendingClauseScrollRef.current;\n if (!nodeId) return;\n pendingClauseScrollRef.current = null;\n\n const leftSectionIdx = (proposedSections as any[]).findIndex((s) => s.id === nodeId);\n const rightSectionIdx = (existingSections as any[]).findIndex((s) => s.id === nodeId);\n const leftKeyPath = leftSectionIdx === -1\n ? findKeyPathByNodeId(proposedSections as SectionBlock[], nodeId) : null;\n const rightKeyPath = rightSectionIdx === -1\n ? findKeyPathByNodeId(existingSections as SectionBlock[], nodeId) : null;\n\n const parentLeftIdx = leftSectionIdx !== -1 ? leftSectionIdx\n : leftKeyPath ? Number(leftKeyPath.split(\"-\")[0]) : -1;\n const parentRightIdx = rightSectionIdx !== -1 ? rightSectionIdx\n : rightKeyPath ? Number(rightKeyPath.split(\"-\")[0]) : -1;\n\n const resolveEl = (\n sectionIdx: number,\n keyPath: string | null,\n sideRefs: typeof sectionLeftRefs,\n subSideRefs: typeof subSectionLeftRefs,\n ): HTMLElement | null => {\n if (sectionIdx !== -1) return sideRefs.current[sectionIdx]?.current ?? null;\n if (keyPath) return subSideRefs.current[keyPath]?.current ?? null;\n return null;\n };\n\n const scrollWhenReady = (\n getEl: () => HTMLElement | null,\n container: HTMLElement,\n maxAttempts = 30,\n ) => {\n let attempts = 0;\n const tryScroll = () => {\n const el = getEl();\n if (!el || el.getBoundingClientRect().height === 0) {\n if (attempts++ < maxAttempts) requestAnimationFrame(tryScroll);\n return;\n }\n highlightedClauseRefs.current.add(el);\n scrollAndHighlightClause(el, container);\n };\n requestAnimationFrame(tryScroll);\n };\n\n if (maintainRelativeOrder) {\n if (parentLeftIdx !== -1 && leftContainerRef.current) {\n scrollWhenReady(\n () => resolveEl(leftSectionIdx, leftKeyPath, sectionLeftRefs, subSectionLeftRefs),\n leftContainerRef.current,\n );\n }\n if (parentRightIdx !== -1 && rightContainerRef.current) {\n scrollWhenReady(\n () => resolveEl(rightSectionIdx, rightKeyPath, sectionRightRefs, subSectionRightRefs),\n rightContainerRef.current,\n );\n }\n } else {\n const container = scrollContainerRef.current;\n if (!container) return;\n scrollWhenReady(\n () => parentLeftIdx !== -1\n ? resolveEl(leftSectionIdx, leftKeyPath, sectionLeftRefs, subSectionLeftRefs)\n : resolveEl(rightSectionIdx, rightKeyPath, sectionRightRefs, subSectionRightRefs),\n container,\n );\n }\n }, [\n proposedSections,\n existingSections,\n maintainRelativeOrder,\n sectionLeftRefs,\n sectionRightRefs,\n subSectionLeftRefs,\n subSectionRightRefs,\n leftContainerRef,\n rightContainerRef,\n scrollContainerRef,\n ]);\n\n const scrollToClauseAndHighlightClause = useCallback(\n (nodeId: string) => {\n if (!nodeId) return;\n\n clearClauseHighlight();\n resetSideBySide();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n closeSummaryPopup();\n closeCognitivePopup();\n\n const leftSectionIdx = (proposedSections as any[]).findIndex((s) => s.id === nodeId);\n const rightSectionIdx = (existingSections as any[]).findIndex((s) => s.id === nodeId);\n\n const leftKeyPath = leftSectionIdx === -1\n ? findKeyPathByNodeId(proposedSections as SectionBlock[], nodeId) : null;\n const rightKeyPath = rightSectionIdx === -1\n ? findKeyPathByNodeId(existingSections as SectionBlock[], nodeId) : null;\n\n if (leftSectionIdx === -1 && !leftKeyPath && rightSectionIdx === -1 && !rightKeyPath) {\n console.warn(`scrollToAndHighlightClause: nodeId \"${nodeId}\" not found`);\n return;\n }\n\n const parentLeftIdx = leftSectionIdx !== -1 ? leftSectionIdx\n : leftKeyPath ? Number(leftKeyPath.split(\"-\")[0]) : -1;\n const parentRightIdx = rightSectionIdx !== -1 ? rightSectionIdx\n : rightKeyPath ? Number(rightKeyPath.split(\"-\")[0]) : -1;\n\n pendingClauseScrollRef.current = nodeId;\n\n setExpandedSections((prev: any) => {\n const next = { ...prev };\n let changed = false;\n if (parentLeftIdx !== -1) {\n const key = maintainRelativeOrder ? `left-${parentLeftIdx}` : String(parentLeftIdx);\n if (!next[key]) { next[key] = true; changed = true; }\n }\n if (parentRightIdx !== -1) {\n const key = maintainRelativeOrder ? `right-${parentRightIdx}` : String(parentRightIdx);\n if (!next[key]) { next[key] = true; changed = true; }\n }\n return changed ? next : prev;\n });\n\n setExpandedSubSections((prev: any) => {\n const next = { ...prev };\n let changed = false;\n\n const expandPath = (path: string) => {\n const parts = path.split(\"-\");\n let current = parts[0];\n for (let i = 1; i < parts.length; i++) {\n current += `-${parts[i]}`;\n if (!next[current]) {\n next[current] = true;\n changed = true;\n }\n }\n };\n\n if (leftKeyPath) expandPath(leftKeyPath);\n if (rightKeyPath) expandPath(rightKeyPath);\n\n return changed ? next : prev;\n });\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (pendingClauseScrollRef.current === nodeId) {\n executePendingClauseScrollRef.current();\n }\n });\n }, 50);\n },\n [\n proposedSections,\n existingSections,\n maintainRelativeOrder,\n setExpandedSections,\n setExpandedSubSections,\n resetSideBySide,\n closeSummaryPopup,\n closeCognitivePopup,\n ]\n );\n const executePendingClauseScrollRef = useRef(executePendingClauseScroll);\n useEffect(() => {\n executePendingClauseScrollRef.current = executePendingClauseScroll;\n }, [executePendingClauseScroll]);\n\n const summaryGapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (localHighlightField) {\n const cfg = resolvedComparisonConfig.fields.find(\n (f) =>\n f.analysisKey === localHighlightField ||\n f.key === localHighlightField,\n );\n if (cfg) {\n const targetRef =\n leftRefs.current[cfg.key] || rightRefs.current[cfg.key];\n if (targetRef?.current)\n setTimeout(\n () =>\n targetRef.current!.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n }),\n 150,\n );\n }\n }\n }, [localHighlightField, resolvedComparisonConfig.fields]);\n\n const getFieldData = useCallback(\n (analysisKey: string) => {\n const fields = analysisData?.rule_difference_comparison?.fields as Record<\n string,\n any\n >;\n if (!fields || !fields[analysisKey]) {\n return {\n score: 0,\n relation: \"\",\n highlightsA: [],\n highlightsB: [],\n hasContent: false,\n };\n }\n const field = fields[analysisKey];\n const hasActualContent =\n field?.relation ||\n field?.highlights?.ruleA_spans?.length ||\n field?.highlights?.ruleB_spans?.length ||\n (field?.mappings && field.mappings.length > 0);\n\n if (field.mappings) {\n const mapping = field.mappings[0] || {};\n return {\n score: field.score,\n relation: mapping.relation || \"\",\n highlightsA: mapping.highlights?.ruleA_spans || [],\n highlightsB: mapping.highlights?.ruleB_spans || [],\n hasContent: !!hasActualContent,\n };\n }\n return {\n score: field.score,\n relation: field.relation || \"\",\n highlightsA: field.highlights?.ruleA_spans || [],\n highlightsB: field.highlights?.ruleB_spans || [],\n hasContent: !!hasActualContent,\n };\n },\n [analysisData],\n );\n\n const { getSectionCompareStyle, getSubSectionCompareStyle, getDeviationStyleByKey } = useStyleHelpers(\n {\n proposedSections,\n existingSections,\n maintainRelativeOrder: maintainRelativeOrder as boolean,\n cognitiveMap,\n deviationData: stableDeviationData,\n treeData,\n resolvedComparisonConfig,\n badgeStyleOverride,\n }\n )\n const { lines, setLines, overallConnector, setOverallConnector, svgDimensions, calculateLines, calculateLinesDebounced, handleColumnScroll } = useLinesCalculator({\n containerRef,\n leftContainerRef,\n rightContainerRef,\n svgContainerRef,\n pathRefs,\n leftHeaderRef, rightHeaderRef,\n proposedSections, existingSections,\n visibleFields,\n leftRefs, rightRefs,\n sectionLeftRefs, sectionRightRefs,\n subSectionLeftRefs, subSectionRightRefs,\n lhsBadgeRefs, rhsBadgeRefs,\n sectionRowRefs,\n expandedSections, expandedSubSections,\n connectedSections,\n isSideBySide, activeSideBySideSection,\n maintainRelativeOrder,\n isGuidelineMode,\n cognitiveMap,\n getSectionCompareStyle, getSubSectionCompareStyle, getDeviationStyleByKey,\n isArrowVisible,\n\n isAnimatingRef,\n isSideBySideRef,\n sideBySideCacheRef,\n sideBySideLineRef,\n activeSideBySideSectionRef,\n activeSideBySideRightSectionRef,\n connectedLines,\n setConnectedLines,\n cachedConnectedPositions,\n calculateLinesRef,\n resizeTimerRef,\n scrollLock,\n scrollSyncLocked,\n\n handleResizeRef,\n activeProposed, existingRule, analysisData,\n pendingScrollTargetRef, pendingScrollCallbackRef,\n\n resolvedComparisonConfig,\n getFieldData\n })\n\n useEffect(() => {\n if (!summaryPopup.anchorEl) return;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n calculateLinesRef.current?.();\n });\n });\n }, [summaryPopup.anchorEl, scrollSyncLocked]);\n\n const handleCollapseAll = useCallback(() => {\n clearClauseHighlight();\n setScrollSyncLocked(false);\n setExpandedSections({});\n setExpandedSubSections({});\n\n resetSideBySide();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n\n closeSummaryPopup();\n closeCognitivePopup();\n closeMoreFunctionsPopup();\n\n requestAnimationFrame(() => {\n if (calculateLinesRef.current) {\n calculateLinesRef.current();\n }\n });\n }, [\n setExpandedSections,\n setExpandedSubSections,\n resetSideBySide,\n closeSummaryPopup,\n closeCognitivePopup,\n closeMoreFunctionsPopup,\n ]);\n\n useEffect(() => {\n if (!isSideBySide && connectedSections.size === 0) {\n setScrollSyncLocked(false);\n }\n }, [isSideBySide, connectedSections]);\n\n const isAnySectionExpanded = useMemo(() => {\n return (\n Object.values(expandedSections).some(Boolean) ||\n Object.values(expandedSubSections).some(Boolean)\n );\n }, [expandedSections, expandedSubSections]);\n\n\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const prevRootWidthRef = useRef<number>(0);\n const prevScrollWidthRef = useRef<number>(0);\n const prevContainerWidthRef = useRef<number>(0);\n const { handleResize } = useResizeHandler({\n timerRef, ruleComponentRef, scrollContainerRef, containerRef, maintainRelativeOrder, proposedSections,\n existingSections, isSideBySideRef, activeSideBySideSectionRef, activeSideBySideRightSectionRef, sectionRowRefs,\n sectionRightRowRefs, sectionLeftRefs, sectionRightRefs, subSectionLeftRefs, subSectionRightRefs, lhsBadgeRefs,\n rhsBadgeRefs, leftContainerRef, rightContainerRef, calculateLinesRef, handleResizeRef, setIsResizing, setIsArrowVisible,\n sideBySideCacheRef, cachedConnectedPositions\n });\n\n useEffect(() => {\n handleResizeRef.current = handleResize;\n }, [handleResize, handleResizeRef]);\n\n\n // Stable mount-once — watches root, scrollContainer, and inner container\n // Kept at [] so it never tears down from state changes, eliminating the\n // \"reset prevWidth → spurious handleResize → isResizing stuck true\" race.\n useEffect(() => {\n const makeWidthObserver = (\n el: HTMLElement,\n prevWidthRef: React.MutableRefObject<number>,\n rafRef: React.MutableRefObject<number | null>,\n onWidthChange: () => void,\n onNoChange: () => void,\n ): ResizeObserver => {\n prevWidthRef.current = el.getBoundingClientRect().width;\n\n const observer = new ResizeObserver((entries) => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n const entry = entries[entries.length - 1];\n if (!entry) return;\n\n const newWidth =\n entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n\n if (Math.abs(newWidth - prevWidthRef.current) < 1) {\n onNoChange();\n return;\n }\n prevWidthRef.current = newWidth;\n onWidthChange();\n });\n });\n\n observer.observe(el);\n return observer;\n };\n\n // Each observer gets its own RAF ref so they don't cancel each other\n const rootRafRef: React.MutableRefObject<number | null> = { current: null };\n const scrollRafRef: React.MutableRefObject<number | null> = { current: null };\n const containerRafRef: React.MutableRefObject<number | null> = { current: null };\n\n const observers: ResizeObserver[] = [];\n const rafRefs = [rootRafRef, scrollRafRef, containerRafRef];\n\n if (ruleComponentRef.current) {\n observers.push(\n makeWidthObserver(\n ruleComponentRef.current,\n prevRootWidthRef,\n rootRafRef,\n () => handleResizeRef.current(),\n () => { },\n ),\n );\n }\n\n if (scrollContainerRef.current) {\n observers.push(\n makeWidthObserver(\n scrollContainerRef.current,\n prevScrollWidthRef,\n scrollRafRef,\n () => handleResizeRef.current(),\n () => calculateLinesRef.current(),\n ),\n );\n }\n\n if (containerRef.current) {\n observers.push(\n makeWidthObserver(\n containerRef.current,\n prevContainerWidthRef,\n containerRafRef,\n () => handleResizeRef.current(),\n () => calculateLinesRef.current(),\n ),\n );\n }\n\n return () => {\n observers.forEach((o) => o.disconnect());\n rafRefs.forEach((r) => {\n if (r.current !== null) {\n cancelAnimationFrame(r.current);\n r.current = null;\n }\n });\n };\n }, []);\n\n useEffect(() => {\n isSideBySideRef.current = isSideBySide;\n }, [isSideBySide]);\n\n useEffect(() => {\n activeSideBySideSectionRef.current = activeSideBySideSection;\n }, [activeSideBySideSection]);\n\n const getGuidelineTabFromId = useCallback((identifier: string | number) => {\n let nId = \"\";\n let dKey = \"0\";\n \n if (typeof identifier === \"number\") {\n nId = proposedSections[identifier]?.nodeId || proposedSections[identifier]?.id || \"\";\n } else {\n const parts = String(identifier).split(DEVIATION_BADGE_SEPARATOR);\n nId = parts[0];\n dKey = parts[1] || \"0\";\n }\n \n const res = stableDeviationData?.[nId]?.evaluation_result;\n const node = Array.isArray(res) ? res[parseInt(dKey, 10)] : res?.[dKey];\n \n // Open the Web/GPT tab only when this evaluation actually includes GPT citation objects.\n return node?.evaluation_outputs?.guideline_flag?.rulebook_used === false &&\n hasGptCitationObjects(node)\n ? 1\n : 0;\n }, [proposedSections, stableDeviationData]);\n\n const invalidateGuidelineConnections = useCallback(() => {\n resetSideBySide();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n }, [resetSideBySide]);\n\n const handleGuidelinesTabChange = useCallback((\n _event: React.SyntheticEvent,\n nextTab: number,\n ) => {\n if (nextTab === guidelinesTab) return;\n\n invalidateGuidelineConnections();\n setGuidelinesTab(nextTab);\n }, [guidelinesTab, invalidateGuidelineConnections]);\n\n useEffect(() => {\n if (!hasWebGptCitations && guidelinesTab !== 0) {\n invalidateGuidelineConnections();\n setGuidelinesTab(0);\n }\n }, [guidelinesTab, hasWebGptCitations, invalidateGuidelineConnections]);\n\n const alignStraightLines = useCallback((actionId: string) => {\n const lContainer = leftContainerRef.current;\n const rContainer = rightContainerRef.current;\n const targets = getVisibleGuidelineTargets(rContainer);\n \n if (!rContainer) return; // Failsafe\n\n // ── FIX: Search ONLY inside the right container, not the whole document ──\n // const rawTargets = rContainer.querySelectorAll('[id^=\"guideline-target-\"], [data-web-gpt-active=\"true\"]');\n \n // const targets = Array.from(rawTargets).filter((el) => {\n // const rect = el.getBoundingClientRect();\n // return rect.width > 0 && rect.height > 0;\n // });\n \n // Re-calculate refId from actionId to dynamically find the exact Left Badge\n const isSub = typeof actionId === \"string\" && actionId.includes(DEVIATION_BADGE_SEPARATOR);\n let refId = actionId;\n if (isSub) {\n const parts = actionId.split(DEVIATION_BADGE_SEPARATOR);\n if (parts.length >= 2) {\n refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n }\n }\n \n // Grab the Left Element safely from the ref map\n const leftEl = lhsBadgeRefs.current[refId]?.current || lhsBadgeRefs.current[actionId as any]?.current;\n\n // Because we filtered above, targets[0] is guaranteed to be the VISIBLE one!\n if (targets.length > 0 && leftEl && lContainer && rContainer) {\n const rightEl = targets[0];\n\n // 1. Reset all spacers to 0px first to measure the true intrinsic positions without fake padding\n if (lhsTopSpacerRef.current) lhsTopSpacerRef.current.style.height = '0px';\n if (rhsTopSpacerRef.current) rhsTopSpacerRef.current.style.height = '0px';\n if (lhsBottomSpacerRef.current) lhsBottomSpacerRef.current.style.height = '0px';\n if (rhsBottomSpacerRef.current) rhsBottomSpacerRef.current.style.height = '0px';\n\n // 2. Wait for the browser to register the 0px heights before measuring\n requestAnimationFrame(() => {\n const lRect = leftEl.getBoundingClientRect();\n const rRect = rightEl.getBoundingClientRect();\n const lContRect = lContainer.getBoundingClientRect();\n const rContRect = rContainer.getBoundingClientRect();\n\n // Calculate absolute Y coordinate of the center of elements relative to the top of the scrollable content\n const lContentY = lContainer.scrollTop + (lRect.top - lContRect.top) + (lRect.height / 2);\n const rContentY = rContainer.scrollTop + (rRect.top - rContRect.top) + (rRect.height / 2);\n\n // Calculate Ideal Scroll for LHS to be in the center\n const idealLTargetScroll = lContentY - (lContRect.height / 2);\n\n // ── RULE 1: No Top Spacer for LHS. If it's at the top, it stays at the top. ──\n const lTargetScroll = Math.max(0, idealLTargetScroll);\n\n // ── RULE 2: Calculate Bottom Spacer for LHS if it's at the very bottom ──\n const lMaxScrollRaw = lContainer.scrollHeight - lContainer.clientHeight;\n const lBottomSpacer = lTargetScroll > lMaxScrollRaw ? lTargetScroll - lMaxScrollRaw : 0;\n\n // Determine the EXACT visual screen Y coordinate where the LHS center will sit\n const finalScreenY = lContRect.top + lContentY - lTargetScroll;\n\n // ── RULE 3: Force RHS to match finalScreenY perfectly ──\n // Equation: finalScreenY = rContRect.top + rContentY + rTopSpacer - rTargetScroll\n let rTargetScroll = rContRect.top + rContentY - finalScreenY;\n let rTopSpacer = 0;\n\n if (rTargetScroll < 0) {\n // RHS element is too close to top. We must push it down with a top spacer.\n rTopSpacer = Math.abs(rTargetScroll);\n rTargetScroll = 0;\n }\n\n // ── RULE 4: Calculate Bottom Spacer for RHS if it's at the very bottom ──\n const rMaxScrollRaw = rContainer.scrollHeight - rContainer.clientHeight;\n const rMaxScrollWithTop = rMaxScrollRaw + rTopSpacer;\n const rBottomSpacer = rTargetScroll > rMaxScrollWithTop ? rTargetScroll - rMaxScrollWithTop : 0;\n\n // Apply Spacers\n if (lhsBottomSpacerRef.current) lhsBottomSpacerRef.current.style.height = `${lBottomSpacer}px`;\n if (rhsTopSpacerRef.current) rhsTopSpacerRef.current.style.height = `${rTopSpacer}px`;\n if (rhsBottomSpacerRef.current) rhsBottomSpacerRef.current.style.height = `${rBottomSpacer}px`;\n\n // Execute Smooth Scroll and Draw Lines\n requestAnimationFrame(() => {\n lContainer.scrollTo({ top: lTargetScroll, behavior: \"smooth\" });\n rContainer.scrollTo({ top: rTargetScroll, behavior: \"smooth\" });\n \n if (calculateLinesRef.current) {\n setTimeout(() => calculateLinesRef.current(), 50);\n }\n });\n });\n }\n }, [DEVIATION_BADGE_SEPARATOR]);\n\n\n\n\n const handleOpenSideBySide = useCallback(() => {\n const idx = moreFunctions.sectionIdx;\n const isOrphan = moreFunctions.isOrphan;\n closeSummaryPopup();\n if (idx == null) return;\n\n let sourceSide: \"left\" | \"right\" = \"left\";\n if (moreFunctions.anchorEl && rightContainerRef.current?.contains(moreFunctions.anchorEl)) {\n sourceSide = \"right\";\n }\n \n forceExpandCrossWiredSections(idx);\n\n if (isGuidelineMode) {\n setGuidelinesTab(getGuidelineTabFromId(idx));\n setConnectedSections(new Set([idx]));\n }\n \n\n activateSideBySide(idx, isOrphan, { \n sourceSide,\n onReady: () => {\n if (isGuidelineMode) {\n setTimeout(() => alignStraightLines(String(idx)), 150);\n }\n }\n });\n }, [\n activateSideBySide, \n moreFunctions.isOrphan, \n moreFunctions.sectionIdx, \n moreFunctions.anchorEl, \n closeSummaryPopup, \n forceExpandCrossWiredSections,\n isGuidelineMode,\n alignStraightLines,\n getGuidelineTabFromId\n ]);\n\n const handleCloseSummaryPopup = useCallback(() => {\n closeSummaryPopup();\n resetSideBySide();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n }, [closeSummaryPopup, resetSideBySide]);\n\n const isCurrentSectionConnected =\n moreFunctions.sectionIdx !== null &&\n connectedSections.has(moreFunctions.sectionIdx);\n\n const { showDeviationNavigation, showOpenNodeRef, adjustScrollForPopup } = useDeviationNavigation({\n proposedSections,\n existingSections,\n parentDeviationRecord,\n expandedSections,\n maintainRelativeOrder: !!maintainRelativeOrder,\n scrollContainerRef,\n leftContainerRef,\n rightContainerRef,\n lhsBadgeRefs,\n rhsBadgeRefs,\n });\n\n \n\n const handleOpenSummaryPopup = useCallback(\n (\n e: React.MouseEvent,\n actionId: string,\n isOrphan: boolean,\n summary: any,\n displayImpact?: boolean,\n ) => {\n const summaryText = typeof summary === \"string\"\n ? safeStringify(summary).trim()\n : safeStringify(summary?.deviation_summary).trim();\n\n const initialAnchor = e.currentTarget as HTMLElement;\n closeCognitivePopup();\n\n let sourceSide: \"left\" | \"right\" = \"left\";\n if (rightContainerRef.current?.contains(initialAnchor)) {\n sourceSide = \"right\";\n }\n\n const getFreshAnchor = () => {\n const isSub = typeof actionId === \"string\" && actionId.includes(DEVIATION_BADGE_SEPARATOR);\n if (isSub) {\n const parts = actionId.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n return sourceSide === \"right\"\n ? rhsBadgeRefs.current[refId]?.current\n : lhsBadgeRefs.current[refId]?.current;\n } else {\n return sourceSide === \"right\"\n ? rhsBadgeRefs.current[actionId as any]?.current\n : lhsBadgeRefs.current[actionId as any]?.current;\n }\n };\n\n if (isOrphan && !isGuidelineMode) {\n resetSideBySide();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n\n if (summaryText) {\n forceExpandCrossWiredSections(actionId);\n requestAnimationFrame(() => {\n const freshAnchor = getFreshAnchor() || initialAnchor;\n \n if (freshAnchor) {\n const rect = freshAnchor.getBoundingClientRect();\n if (rect.top > window.innerHeight * 0.8) {\n freshAnchor.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n }\n }\n\n setSummaryPopup({\n open: true,\n anchorEl: freshAnchor,\n summary,\n displayImpact,\n });\n });\n }\n return;\n }\n\n forceExpandCrossWiredSections(actionId);\n\n if (isGuidelineMode) {\n setGuidelinesTab(getGuidelineTabFromId(actionId));\n setConnectedSections(new Set([actionId]));\n }\n\n if (!summaryText) {\n setTimeout(() => {\n activateSideBySide(actionId, isOrphan, { toggleIfSame: false, sourceSide });\n \n if (isGuidelineMode) {\n setTimeout(() => alignStraightLines(actionId), 150);\n }\n }, 350);\n return;\n }\n\n setTimeout(() => {\n activateSideBySide(actionId, isOrphan, {\n toggleIfSame: false,\n sourceSide,\n onReady: () => {\n const freshAnchor = getFreshAnchor() || initialAnchor;\n \n if (isGuidelineMode) {\n setTimeout(() => alignStraightLines(actionId), 150);\n } else {\n if (freshAnchor) {\n const rect = freshAnchor.getBoundingClientRect();\n if (rect.top > window.innerHeight * 0.8 || rect.top < 100) {\n const offsetToCenter = rect.top - (window.innerHeight / 2);\n \n if (maintainRelativeOrder) {\n leftContainerRef.current?.scrollBy({ top: offsetToCenter, behavior: \"smooth\" });\n rightContainerRef.current?.scrollBy({ top: offsetToCenter, behavior: \"smooth\" });\n } else {\n scrollContainerRef.current?.scrollBy({ top: offsetToCenter, behavior: \"smooth\" });\n }\n }\n }\n }\n\n setSummaryPopup({\n open: true,\n anchorEl: freshAnchor,\n summary,\n displayImpact,\n });\n },\n });\n }, 350);\n },\n [\n activateSideBySide, \n closeCognitivePopup, \n setSummaryPopup, \n resetSideBySide, \n forceExpandCrossWiredSections, \n isGuidelineMode, \n maintainRelativeOrder,\n alignStraightLines,\n stableDeviationData\n ],\n );\n\n const deviationTargetParentId = useMemo(() => {\n if (!deviationNodeIdToView) return null;\n const targetNodeId = deviationNodeIdToView?.id?.split(\":\")[0];\n for (const nodeId in parentDeviationRecord) {\n const entries = parentDeviationRecord[nodeId] || [];\n if (entries.some((entry: any) => entry.id === targetNodeId)) {\n return nodeId;\n }\n }\n return null;\n }, [deviationNodeIdToView, parentDeviationRecord]);\n const lastDeviationTriggerRef = useRef<{\n id: string | null;\n triggerMs: number | null;\n }>({ id: null, triggerMs: null });\n const clearedForDeviationId = useRef<string | null>(null);\n\n useEffect(() => {\n if (!deviationNodeIdToView?.id) return;\n\n const triggerMs = Number(deviationNodeIdToView.trigger);\n const lastTrigger = lastDeviationTriggerRef.current;\n if (\n lastTrigger?.id === deviationNodeIdToView.id &&\n lastTrigger?.triggerMs === triggerMs\n ) return;\n\n const hasDeviationKeySuffix =\n deviationNodeIdToView.id.includes(\":\") &&\n /:\\d+$/.test(deviationNodeIdToView.id);\n\n if (!hasDeviationKeySuffix) {\n lastDeviationTriggerRef.current = { id: deviationNodeIdToView.id, triggerMs };\n scrollToClauseAndHighlightClause(deviationNodeIdToView.id);\n\n const leftSectionIdx = proposedSections.findIndex((s: any) => s.id === deviationNodeIdToView.id);\n const rightSectionIdx = existingSections.findIndex((s: any) => s.id === deviationNodeIdToView.id);\n\n if (leftSectionIdx !== -1 || rightSectionIdx !== -1) {\n setTimeout(() => {\n const targetIdx = leftSectionIdx !== -1 ? leftSectionIdx : rightSectionIdx;\n const isOrphan = leftSectionIdx === -1;\n\n // ── NEW C2G LOGIC FOR ROOT NODES ──\n if (isGuidelineMode) {\n setGuidelinesTab(getGuidelineTabFromId(targetIdx));\n }\n setConnectedSections(new Set([targetIdx]));\n\n activateSideBySideRef.current(targetIdx, isOrphan, {\n sourceSide: isOrphan ? \"right\" : \"left\",\n onReady: () => {\n if (isGuidelineMode) {\n setTimeout(() => alignStraightLines(String(targetIdx)), 150);\n }\n }\n });\n }, 400);\n }\n return;\n }\n\n const [targetNodeId, requestedDeviationKeyRaw] = deviationNodeIdToView.id.split(\":\");\n const requestedDeviationKey = requestedDeviationKeyRaw ?? \"0\";\n\n const requestKey = `${deviationNodeIdToView.id}:${triggerMs}`;\n if (clearedForDeviationId.current !== requestKey) {\n closeSummaryPopup();\n closeCognitivePopup();\n resetSideBySide();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n clearedForDeviationId.current = requestKey;\n }\n\n let cancelled = false;\n let attempts = 0;\n const maxAttempts = 30;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let layoutWatcherCleanup: (() => void) | null = null;\n let expansionDone = false;\n const waitForStableLayout = (\n getElement: () => HTMLElement | null | undefined,\n onStable: () => void\n ): (() => void) => {\n let stableFrames = 0;\n let lastTop: number | null = null;\n let lastHeight: number | null = null;\n let rafId: number;\n const startedAt = performance.now();\n\n const check = () => {\n if (cancelled) return;\n\n if (performance.now() - startedAt > 3000) {\n onStable();\n return;\n }\n\n const el = getElement();\n if (!el || el.getBoundingClientRect().height === 0) {\n rafId = requestAnimationFrame(check);\n return;\n }\n\n const rect = el.getBoundingClientRect();\n\n const top = rect.top;\n const height = rect.height;\n\n const topStable =\n lastTop !== null && Math.abs(top - lastTop) < 0.5;\n\n const heightStable =\n lastHeight !== null && Math.abs(height - lastHeight) < 0.5;\n\n if (topStable && heightStable) {\n stableFrames++;\n\n if (stableFrames >= 5) {\n onStable();\n return;\n }\n } else {\n stableFrames = 0;\n }\n\n lastTop = top;\n lastHeight = height;\n\n rafId = requestAnimationFrame(check);\n };\n\n rafId = requestAnimationFrame(check);\n return () => cancelAnimationFrame(rafId);\n };\n\n const findKeyPath = (sections: any[], targetIds: string[]): string | null => {\n const walk = (node: any, path: string): string | null => {\n if (!node) return null;\n if (\n targetIds.includes(node.id) ||\n targetIds.includes(node.nodeId) ||\n targetIds.includes(node.contentId)\n ) return path;\n if (!Array.isArray(node.subsections)) return null;\n for (let i = 0; i < node.subsections.length; i++) {\n const next = walk(node.subsections[i], `${path}-${i}`);\n if (next) return next;\n }\n return null;\n };\n for (let i = 0; i < sections.length; i++) {\n const found = walk(sections[i], String(i));\n if (found) return found;\n }\n return null;\n };\n\n const tryConnect = () => {\n if (cancelled) return;\n\n const markProcessed = () => {\n lastDeviationTriggerRef.current = {\n id: deviationNodeIdToView.id,\n triggerMs,\n };\n };\n\n let targetParentId: string | null = null;\n let targetChild: any = null;\n for (const nodeId in parentDeviationRecord) {\n const child = parentDeviationRecord[nodeId].find(\n (entry: any) =>\n entry.id === targetNodeId ||\n entry.nodeId === targetNodeId ||\n entry.contentId === targetNodeId ||\n entry.evaluationResult?.nodeId === targetNodeId,\n );\n if (child) {\n targetParentId = nodeId;\n targetChild = child;\n break;\n }\n }\n\n if (!targetChild || !targetParentId) {\n attempts++;\n if (attempts < maxAttempts) timer = setTimeout(tryConnect, 100);\n return;\n }\n\n const targetIds = Array.from(new Set([\n targetNodeId,\n targetChild.id,\n targetChild.nodeId,\n targetChild.contentId,\n targetChild.evaluationResult?.nodeId,\n ].filter(Boolean))) as string[];\n\n const lhsNodeIdx = proposedSections.findIndex((section) => section.id === targetParentId);\n const rhsNodeIdx = existingSections.findIndex((section) => section.id === targetParentId);\n\n const isRhsOrphan = lhsNodeIdx === -1 && rhsNodeIdx !== -1;\n\n const leftKeyPath = findKeyPath(proposedSections as any[], targetIds);\n let rightKeyPath = findKeyPath(existingSections as any[], targetIds);\n\n if (leftKeyPath && !rightKeyPath && !isRhsOrphan) {\n const parts = leftKeyPath.split(\"-\");\n let rhsIdx = Number(parts[0]);\n if (maintainRelativeOrder) {\n const rhsSelfIndex = (proposedSections as any[])[rhsIdx]?.refIndexes?.[0];\n const rhsArrayIdx = (existingSections as any[]).findIndex((s: any) => s.selfIndex === rhsSelfIndex);\n if (rhsArrayIdx !== -1) rhsIdx = rhsArrayIdx;\n }\n rightKeyPath = [rhsIdx, ...parts.slice(1)].join(\"-\");\n }\n\n if (!leftKeyPath && !rightKeyPath) {\n attempts++;\n if (attempts < maxAttempts) timer = setTimeout(tryConnect, 100);\n return;\n }\n\n const leftSectionIdx = leftKeyPath ? Number(leftKeyPath.split(\"-\")[0]) : lhsNodeIdx;\n const rightSectionIdx = rightKeyPath ? Number(rightKeyPath.split(\"-\")[0]) : rhsNodeIdx;\n const effectiveRightSectionIdx =\n rightSectionIdx >= 0\n ? rightSectionIdx\n : rightKeyPath ? Number(rightKeyPath.split(\"-\")[0]) : -1;\n\n const leftSec: any = (proposedSections as any[])[leftSectionIdx];\n const rightSec: any = (existingSections as any[])[effectiveRightSectionIdx];\n const isLeftEmpty = leftSec && !leftSec.title && !leftSec.content;\n const isRightEmpty = rightSec && !rightSec.title && !rightSec.content;\n\n const isTargetRhsOnly = (!leftKeyPath && !!rightKeyPath) || (isLeftEmpty && !isRightEmpty);\n const shouldNavigateRight = isRhsOrphan || isTargetRhsOnly;\n\n if (shouldNavigateRight) {\n const isExpanded = maintainRelativeOrder\n ? !!expandedSectionsRef.current[`right-${rightSectionIdx}`]\n : !!expandedSectionsRef.current[String(rightSectionIdx)];\n if (!isExpanded && rightSectionIdx >= 0) {\n toggleSection(rightSectionIdx, \"right\");\n timer = setTimeout(tryConnect, 200);\n return;\n }\n } else {\n const isExpanded = maintainRelativeOrder\n ? !!expandedSectionsRef.current[`left-${leftSectionIdx}`]\n : !!expandedSectionsRef.current[String(leftSectionIdx)];\n if (!isExpanded && leftSectionIdx >= 0) {\n toggleSection(leftSectionIdx, \"left\");\n timer = setTimeout(tryConnect, 200);\n return;\n }\n }\n \n const safeLeftPath = leftKeyPath || \"\";\n const safeRightPath = rightKeyPath || \"\";\n const refIdCandidates = targetIds.map(\n (id) => `${id}${DEVIATION_BADGE_SEPARATOR}${requestedDeviationKey}`,\n );\n const fallbackRefId = refIdCandidates[0];\n const getMountedBadges = () => {\n for (const candidateRefId of refIdCandidates) {\n const left = lhsBadgeRefs.current[candidateRefId]?.current || null;\n const right = rhsBadgeRefs.current[candidateRefId]?.current || null;\n if (left || right) return { refId: candidateRefId, left, right };\n }\n return { refId: fallbackRefId, left: null, right: null };\n };\n const buildActionId = (refId: string) =>\n `${refId}${DEVIATION_BADGE_SEPARATOR}${safeLeftPath}${DEVIATION_BADGE_SEPARATOR}${safeRightPath}`;\n \n if (!expansionDone) {\n forceExpandCrossWiredSections(buildActionId(fallbackRefId));\n expansionDone = true;\n attempts = 0;\n const getTargetElement = (): HTMLElement | null => {\n const { left: leftEl, right: rightEl } = getMountedBadges();\n const useRight = shouldNavigateRight || (!leftEl && !!rightEl);\n return (useRight ? rightEl : leftEl) as HTMLElement | null;\n };\n\n layoutWatcherCleanup?.();\n\n timer = setTimeout(() => {\n if (cancelled) return;\n layoutWatcherCleanup = waitForStableLayout(getTargetElement, () => {\n if (cancelled) return;\n layoutWatcherCleanup = null;\n tryConnect();\n });\n }, 300);\n\n return;\n }\n\n const {\n refId,\n left: leftElement,\n right: rightElement,\n } = getMountedBadges();\n const actionId = buildActionId(refId);\n\n // If refs still aren't attached, keep retrying\n if (!leftElement && !rightElement) {\n attempts++;\n if (attempts < maxAttempts) timer = setTimeout(tryConnect, 100);\n return;\n }\n\n const useRightTarget = shouldNavigateRight || (!leftElement && !!rightElement);\n const targetElement = useRightTarget ? rightElement : leftElement;\n\n const scrollContainer: HTMLElement | null = maintainRelativeOrder\n ? (useRightTarget ? rightContainerRef.current : leftContainerRef.current)\n : scrollContainerRef.current;\n\n if (!targetElement || !scrollContainer) {\n attempts++;\n if (attempts < maxAttempts) timer = setTimeout(tryConnect, 100);\n return;\n }\n\n const elementRect = targetElement.getBoundingClientRect();\n\n if (elementRect.height === 0) {\n attempts++;\n if (attempts < maxAttempts) timer = setTimeout(tryConnect, 100);\n return;\n }\n\n const containerRect = scrollContainer.getBoundingClientRect();\n \n const targetTop = \n elementRect.top - \n containerRect.top + \n scrollContainer.scrollTop - \n (containerRect.height / 2) + \n (elementRect.height / 2);\n\n const isTargetSub = (leftKeyPath?.includes(\"-\")) || (rightKeyPath?.includes(\"-\"));\n \n const onScrollComplete = async() => {\n if (cancelled) return;\n markProcessed();\n\n const boxShadowColor = targetElement instanceof Element\n ? window.getComputedStyle(targetElement).color\n : \"\";\n [leftElement, rightElement].forEach((el) => {\n if (!el) return;\n el.style.transition = \"box-shadow 300ms ease-in-out\";\n el.style.boxShadow = `0 0 10px ${boxShadowColor}`;\n });\n setTimeout(() => {\n [leftElement, rightElement].forEach((el) => {\n if (el) el.style.boxShadow = \"\";\n });\n }, 2000);\n\n const deviationMap = targetChild.evaluationResult?.deviations?.[requestedDeviationKey] || targetChild;\n const evalOutputs = targetChild.evaluationResult?.evaluation_outputs || targetChild.evaluation_outputs;\n const hasBothCounterparts = !!leftElement && !!rightElement;\n\n if (!hasBothCounterparts && !isGuidelineMode) {\n const freshElement = useRightTarget\n ? (rhsBadgeRefs.current[isTargetSub ? refId : (rightSectionIdx as any)]?.current || rightElement)\n : (lhsBadgeRefs.current[isTargetSub ? refId : (leftSectionIdx as any)]?.current || leftElement);\n\n adjustScrollForPopup(freshElement, () => {\n setSummaryPopup({\n open: true,\n anchorEl: freshElement,\n displayImpact: deviationNodeIdToView.displayImpact,\n summary: {\n ...deviationMap,\n evaluation_outputs: evalOutputs,\n },\n });\n }, { skipScroll: true });\n resetDeviationNodeId?.();\n return;\n }\n // Wait for any in-progress scroll to idle before activating side-by-side\n const waitWithTimeout = (p: Promise<void>, ms: number) => Promise.race([p, new Promise<void>((res) => setTimeout(res, ms))]);\n if (maintainRelativeOrder) {\n await Promise.all([\n leftContainerRef.current\n ? waitWithTimeout(waitForScrollIdle(leftContainerRef.current), 600)\n : Promise.resolve(),\n rightContainerRef.current\n ? waitWithTimeout(waitForScrollIdle(rightContainerRef.current), 600)\n : Promise.resolve(),\n ]);\n }\n\n // ── NEW C2G LOGIC: Set tab and connection for sub-nodes ──\n if (isGuidelineMode) {\n setGuidelinesTab(getGuidelineTabFromId(actionId));\n setConnectedSections(new Set([actionId]));\n }\n\n activateSideBySideRef.current(actionId, false, {\n toggleIfSame: false,\n sourceSide: isRhsOrphan ? \"right\" : \"left\", \n onReady: () => {\n markProcessed();\n const freshElement = useRightTarget\n ? (rhsBadgeRefs.current[refId]?.current || rightElement)\n : (lhsBadgeRefs.current[refId]?.current || leftElement);\n\n // ── NEW C2G LOGIC: Straight Line Math ──\n if (isGuidelineMode) {\n setTimeout(() => alignStraightLines(actionId), 150);\n } else {\n const freshLeft = lhsBadgeRefs.current[refId]?.current || leftElement;\n const freshRight = rhsBadgeRefs.current[refId]?.current || rightElement;\n\n if (freshLeft) {\n freshLeft.style.scrollMarginTop = '150px';\n freshLeft.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n if (freshRight) {\n freshRight.style.scrollMarginTop = '150px';\n freshRight.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }\n\n setSummaryPopup({\n open: true,\n anchorEl: freshElement,\n displayImpact: deviationNodeIdToView.displayImpact,\n summary: { ...deviationMap },\n });\n\n resetDeviationNodeId?.();\n },\n });\n };\n\n if (Math.abs(scrollContainer.scrollTop - targetTop) <= 2) {\n onScrollComplete();\n } else {\n // // --- USE REF TO TRACK NATIVE SCROLL COMPLETION ---\n // pendingScrollTargetRef.current = targetTop;\n // pendingScrollCallbackRef.current = onScrollComplete;\n\n // scrollContainer.scrollTo({ top: targetTop, behavior: \"smooth\" });\n\n // // Failsafe timer (800ms) just in case native scroll misses the exact 2px boundary\n // if (timer) clearTimeout(timer);\n // timer = setTimeout(() => {\n // if (pendingScrollCallbackRef.current) {\n // pendingScrollTargetRef.current = null;\n // const cb = pendingScrollCallbackRef.current;\n // pendingScrollCallbackRef.current = null;\n // cb();\n // }\n // }, 800);\n // }\n scrollAndWait(scrollContainer, targetTop, onScrollComplete);\n }\n };\n\n timer = setTimeout(tryConnect, 100);\n\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n layoutWatcherCleanup?.();\n };\n }, [\n deviationNodeIdToView?.id,\n deviationNodeIdToView?.trigger,\n deviationNodeIdToView?.displayImpact,\n parentDeviationRecord,\n proposedSections,\n existingSections,\n maintainRelativeOrder,\n setSummaryPopup,\n scrollToClauseAndHighlightClause,\n isGuidelineMode, // Added explicitly to fix exhaustive-deps\n getGuidelineTabFromId, // Added explicitly\n alignStraightLines // Added explicitly\n ]);\n\n useEffect(() => {\n if (!summaryPopup.open) return;\n const anchor = summaryPopup.anchorEl;\n if (!anchor) return;\n if (anchor.isConnected) return;\n\n // Anchor is detached — find the fresh DOM node by data attribute\n const findRefIdByContent = (refs:DivRefMap) => {\n for (const [key, ref] of Object.entries(refs)) {\n if (ref.current?.textContent === anchor.textContent) return key;\n }\n return null;\n };\n const refId = anchor.dataset?.deviationRefId || findRefIdByContent(lhsBadgeRefs.current) || findRefIdByContent(rhsBadgeRefs.current);\n // Optimization done above using map\n // const refId =\n // anchor.dataset?.deviationRefId ||\n // // fallback: scan both ref maps for a live node matching this anchor's text content\n // Object.keys(lhsBadgeRefs.current).find(\n // key => lhsBadgeRefs.current[key]?.current?.textContent === anchor.textContent\n // )\n // || Object.keys(rhsBadgeRefs.current).find(\n // key => rhsBadgeRefs.current[key]?.current?.textContent === anchor.textContent\n // );\n \n if (!refId) return;\n\n const freshAnchor =\n rhsBadgeRefs.current[refId]?.current ||\n lhsBadgeRefs.current[refId]?.current;\n\n if (!freshAnchor || !freshAnchor.isConnected) return;\n\n setSummaryPopup(prev => ({ ...prev, anchorEl: freshAnchor }));\n}, [\n summaryPopup.open,\n summaryPopup.anchorEl,\n scrollSyncLocked,\n connectedSections,\n expandedSections,\n]);\n\n const {\n open: cognitivePopupOpen,\n sectionIdx: cognitivePopupSectionIdx,\n isOrphan: cognitivePopupIsOrphan,\n badgeStyle: cognitivePopupBadgeStyle,\n anchorEl: cognitivePopupAnchorEl,\n sectionAnchorEl: cognitivePopupSectionAnchorEl,\n } = cognitivePopup;\n\n useEffect(() => {\n if(!displayConfig.isStreamingEnabled) return\n if (!cognitivePopupOpen || cognitivePopupSectionIdx == null) return;\n if (cognitivePopupSectionIdx === rootDeviationId) return;\n\n const sectionId =\n typeof cognitivePopupSectionIdx === \"string\"\n ? cognitivePopupSectionIdx.split(DEVIATION_BADGE_SEPARATOR)[0]\n : null;\n\n const findNodeRecursively = (sections: any[], targetId: string): any => {\n if (!sections || !Array.isArray(sections)) return null;\n for (const sec of sections) {\n if (sec.id === targetId) return sec;\n if (sec.subsections?.length) {\n const found = findNodeRecursively(sec.subsections, targetId);\n if (found) return found;\n }\n }\n return null;\n };\n\n const baseSecById =\n sectionId && typeof sectionId === \"string\"\n ? findNodeRecursively(proposedSections, sectionId)\n : null;\n\n const refSecById =\n sectionId && typeof sectionId === \"string\"\n ? findNodeRecursively(existingSections, sectionId)\n : null;\n\n const baseSec =\n typeof cognitivePopupSectionIdx === \"number\"\n ? proposedSections[cognitivePopupSectionIdx] || null\n : baseSecById ||\n (sectionId\n ? (treeData?.nodes?.[sectionId] as SectionBlock) ||\n (treeData?.[sectionId] as SectionBlock) ||\n null\n : null);\n\n const refSec =\n typeof cognitivePopupSectionIdx === \"number\"\n ? existingSections[cognitivePopupSectionIdx] || null\n : refSecById;\n\n const refreshedPopup = buildSectionPopupState(\n cognitivePopupAnchorEl,\n baseSec,\n refSec,\n cognitivePopupSectionIdx,\n cognitivePopupIsOrphan,\n cognitivePopupBadgeStyle,\n );\n\n setCognitivePopup((prev) => {\n if (!prev.open) return prev;\n \n const isSame =\n safeStringify(prev.cognitiveData) === safeStringify(refreshedPopup.cognitiveData) &&\n safeStringify(prev.deviationData) === safeStringify(refreshedPopup.deviationData) &&\n prev.sectionTitle === refreshedPopup.sectionTitle &&\n prev.refSectionTitle === refreshedPopup.refSectionTitle;\n \n if (isSame) return prev;\n\n return {\n ...prev,\n ...refreshedPopup,\n open: true,\n anchorEl: prev.anchorEl,\n sectionAnchorEl: prev.sectionAnchorEl,\n };\n });\n }, [\n cognitivePopupOpen,\n cognitivePopupSectionIdx,\n cognitivePopupIsOrphan,\n cognitivePopupBadgeStyle,\n cognitivePopupAnchorEl,\n cognitivePopupSectionAnchorEl,\n proposedSections,\n existingSections,\n buildSectionPopupState,\n ]);\n\n const renderSubSectionAccordion = useCallback(\n ({\n section,\n keyPath,\n depth = 0,\n columnKey = \"left\",\n parentNodeId = \"\",\n sectionOffset,\n rhsOrphanVisualIndexes,\n }: {\n section: SectionBlock;\n keyPath: string;\n depth?: number;\n columnKey?: \"left\" | \"right\";\n parentNodeId?: string;\n sectionOffset?: number;\n rhsOrphanVisualIndexes?: ReadonlyMap<string, number>;\n }): React.ReactNode => {\n return (\n <SubSectionAccordion\n section={section}\n keyPath={keyPath}\n depth={depth}\n columnKey={columnKey}\n parentNodeId={parentNodeId}\n sectionOffset={sectionOffset}\n rhsOrphanVisualIndexes={rhsOrphanVisualIndexes}\n />\n );\n },\n []);\n\n const leftRows = useMemo(() => {\n return proposedSections.map((section, idx) => {\n const isEmpty = !section?.title && !section?.content;\n const isOrphan = !section?.refIndexes || section.refIndexes.length === 0;\n if (isEmpty && isOrphan && maintainRelativeOrder) return null;\n\n return (\n <LHSSectionRow\n key={section?.layoutKey ?? section?.id ?? `left-row-${idx}`}\n section={section}\n idx={idx}\n />\n );\n });\n }, [proposedSections, maintainRelativeOrder]);\n\n const rightRows = useMemo(() => {\n return existingSections.map((section, idx) => {\n const isEmpty = !section?.title && !section?.content;\n const isOrphan = !section?.refIndexes || section.refIndexes.length === 0;\n if (isEmpty && isOrphan && maintainRelativeOrder) return null;\n\n return (\n <RHSSectionRow\n key={section?.layoutKey ?? section?.id ?? `right-row-${idx}`}\n section={section}\n idx={idx}\n />\n );\n });\n }, [existingSections, maintainRelativeOrder]);\n // Callback refs in order to keep them always open even when deviation data is getting streamed\n // These change identity often but children only ever call them — they don't\n // need to cause context consumers to re-render when they change.\n const openMoreFunctionsPopupRef = useRef(openMoreFunctionsPopup);\n useEffect(() => { openMoreFunctionsPopupRef.current = openMoreFunctionsPopup; }, [openMoreFunctionsPopup]);\n\n const expandedSectionsRef = useRef(expandedSections);\n useEffect(() => {\n expandedSectionsRef.current = expandedSections;\n }, [expandedSections]);\n\n const handleOpenSummaryPopupRef = useRef(handleOpenSummaryPopup);\n useEffect(() => { handleOpenSummaryPopupRef.current = handleOpenSummaryPopup; }, [handleOpenSummaryPopup]);\n\n const handleCloseSummaryPopupRef = useRef(handleCloseSummaryPopup);\n useEffect(() => { handleCloseSummaryPopupRef.current = handleCloseSummaryPopup; }, [handleCloseSummaryPopup]);\n\n const toggleSectionRef = useRef(toggleSection);\n useEffect(() => { toggleSectionRef.current = toggleSection; }, [toggleSection]);\n\n const handleSubSectionToggleRef = useRef(handleSubSectionToggle);\n useEffect(() => { handleSubSectionToggleRef.current = handleSubSectionToggle; }, [handleSubSectionToggle]);\n\n const renderSubSectionAccordionRef = useRef(renderSubSectionAccordion);\n useEffect(() => { renderSubSectionAccordionRef.current = renderSubSectionAccordion; }, [renderSubSectionAccordion]);\n\n const resetSideBySideContextRef = useRef(resetSideBySide);\n useEffect(() => { resetSideBySideContextRef.current = resetSideBySide; }, [resetSideBySide]);\n\n const {\n cacheVersion: onDemandCitationCacheVersion,\n getCacheKey: getOnDemandCitationCacheKey,\n getCacheEntry: getOnDemandCitationCacheEntry,\n fetchCitationContext: fetchOnDemandCitationContext,\n prefetchCitationContexts: prefetchOnDemandCitationContexts,\n abortCitationContexts: abortOnDemandCitationContexts,\n } = useOnDemandCitationCache(onDemandCitationConfig);\n \n // ── NEW: Added isGuidelineMode to Context ──\n const compareContextValue = useMemo(() => ({\n isGuidelineMode, \n maintainRelativeOrder: !!maintainRelativeOrder,\n showDeviationBadges: shouldShowDeviationBadges,\n isProposingFix,\n proposingFixNodeId,\n isRedlineFlow,\n isSideBySide,\n activeSideBySideSection,\n scrollSyncLocked,\n toggleScrollSyncLocked,\n summaryPopupAnchorEl: summaryPopup.anchorEl,\n connectedSections,\n proposedSections,\n existingSections,\n deviationNumberRegistry,\n deviationParentRegistry,\n treeData,\n displayConfig,\n resolvedMarkdownStyles,\n unifiedNumbering,\n expandedSections,\n expandedSubSections,\n setExpandedSubSections,\n getSectionCompareStyle,\n getSubSectionCompareStyle,\n getBadgeRef,\n getSectionRowRef,\n getSubSectionRef,\n sectionLeftRefs,\n sectionRightRefs,\n sectionRowRefs,\n sectionRightRowRefs,\n subSectionLeftRefs,\n subSectionRightRefs,\n lhsBadgeRefs,\n rhsBadgeRefs,\n // Stable refs to always keep them open even when deviation data is getting streamed\n openMoreFunctionsPopup: openMoreFunctionsPopupStable,\n handleOpenSummaryPopup: handleOpenSummaryPopupStable,\n openSummaryPopup: handleOpenSummaryPopupStable,\n handleCloseSummaryPopup: handleCloseSummaryPopupStable,\n toggleSection: toggleSectionStable,\n handleSubSectionToggle: handleSubSectionToggleStable,\n renderSubSectionAccordion: renderSubSectionAccordionStable,\n resetSideBySide: resetSideBySideStable,\n\n setConnectedSections,\n setConnectedLines,\n cachedConnectedPositions,\n showDeviationNavigation,\n showOpenNodeRef,\n deviationNodeIdToView: deviationNodeIdToView?.id,\n deviationTargetParentId,\n guidelinesData,\n gptWebCitationConfig,\n onDemandCitationConfig,\n onDemandCitationCacheVersion,\n getOnDemandCitationCacheKey,\n getOnDemandCitationCacheEntry,\n fetchOnDemandCitationContext,\n prefetchOnDemandCitationContexts,\n abortOnDemandCitationContexts,\n}), [\n isGuidelineMode, // ── NEW ──\n maintainRelativeOrder,\n shouldShowDeviationBadges,\n isProposingFix,\n proposingFixNodeId,\n isRedlineFlow,\n isSideBySide,\n activeSideBySideSection,\n scrollSyncLocked,\n toggleScrollSyncLocked,\n summaryPopup.anchorEl,\n connectedSections,\n proposedSections,\n existingSections,\n deviationNumberRegistry,\n displayConfig,\n resolvedMarkdownStyles,\n unifiedNumbering,\n expandedSections,\n expandedSubSections,\n setExpandedSubSections,\n getSectionCompareStyle,\n getSubSectionCompareStyle,\n getBadgeRef,\n getSectionRowRef,\n getSubSectionRef,\n // NOTE: all the volatile callbacks are intentionally REMOVED from deps.\n // They are accessed via refs (openMoreFunctionsPopupRef etc.) so changing\n // them does not invalidate the context value or re-render consumers.\n showDeviationNavigation,\n showOpenNodeRef,\n deviationNodeIdToView,\n deviationTargetParentId,\n guidelinesData,\n gptWebCitationConfig,\n onDemandCitationConfig,\n onDemandCitationCacheVersion,\n getOnDemandCitationCacheKey,\n getOnDemandCitationCacheEntry,\n fetchOnDemandCitationContext,\n prefetchOnDemandCitationContexts,\n abortOnDemandCitationContexts,\n ]);\n\n const cognitivePopupLeftTitle = safeStringify(\n cognitivePopup.sectionTitle || leftTitleTrimmed || leftColumnTitle,\n );\n const cognitivePopupRightTitle = safeStringify(\n isGuidelineMode\n ? rightTitleTrimmed || rightColumnTitle || cognitivePopup.refSectionTitle\n : cognitivePopup.refSectionTitle || rightTitleTrimmed || rightColumnTitle,\n );\n\n return (\n <CompareContextProvider value={compareContextValue}>\n <Box\n ref={ruleComponentRef}\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n bgcolor: \"#F6F7F9B2\",\n fontFamily: '\"Plus Jakarta Sans\", sans-serif',\n overflow: \"visible\", // ← always visible, was conditional on !maintainRelativeOrder\n position: \"relative\",\n }}\n >\n {isToggling && (\n <Box\n sx={{\n position: \"absolute\",\n inset: 0,\n bgcolor: \"rgba(255, 255, 255, 0.6)\",\n backdropFilter: \"blur(10px)\",\n zIndex: 9999,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"8px\",\n }}\n >\n <BouncingDotsLoader />\n </Box>\n )}\n {summaryPopup.open && (\n <CognitiveSummaryPopup\n open={summaryPopup.open}\n anchorEl={summaryPopup.anchorEl}\n containerEl={summaryGapRef.current}\n clipTopEl={leftHeaderRef.current}\n scrollContainerEl={scrollContainerRef.current}\n onClose={handleCloseSummaryPopup}\n summary={summaryPopup.summary}\n displayImpact={summaryPopup.displayImpact}\n isScrollLocked={scrollSyncLocked}\n />\n )}\n {\n <MoreFunctionsPopup\n open={moreFunctions.open}\n anchorEl={moreFunctions.anchorEl}\n maintainRelativeOrder={!!maintainRelativeOrder}\n sectionTitle={moreFunctions.sectionTitle}\n referenceSectionTitle={moreFunctions.refSectionTitle}\n onClose={closeMoreFunctionsPopup}\n onOpenCognitiveCompare={handleOpenCognitiveCompare}\n onOpenSideBySide={handleOpenSideBySide}\n onConnect={handleConnect}\n isConnected={isCurrentSectionConnected}\n isOrphan={isGuidelineMode ? false : !!moreFunctions.isOrphan} \n isGuidelineMode={isGuidelineMode}\n hasGuidelineMatches={moreFunctions.hasGuidelineMatches}\n />\n }\n\n {cognitivePopup.open && (\n <CognitivePopup\n open={cognitivePopup.open}\n popupRef={popupRef}\n position={position}\n popupConfig={popupConfig}\n onClose={() => {\n setPosition(null);\n setCognitivePopup((p) => ({ ...p, open: false }));\n setActiveBadgeId(null);\n }}\n markdownStyles={markdownStyles}\n sectionTitle={cognitivePopupLeftTitle}\n referenceSectionTitle={cognitivePopupRightTitle}\n cognitiveData={cognitivePopup.cognitiveData}\n anchorEl={cognitivePopup.anchorEl}\n sectionAnchorEl={cognitivePopup.sectionAnchorEl}\n scrollContainerEl={scrollContainerRef.current}\n badgeStyle={cognitivePopup.badgeStyle}\n docData={cognitivePopup.docData}\n deviationData={cognitivePopup.deviationData}\n isLoading={cognitivePopup.isLoading}\n sourceNodeId={cognitivePopup.sourceNodeId}\n deviationKey={cognitivePopup.deviationKey}\n baseContentId={cognitivePopup.baseContentId}\n compareContentIds={cognitivePopup.compareContentIds}\n />\n )}\n\n <Snackbar\n open={!!errorToast}\n autoHideDuration={8000}\n onClose={() => setErrorToast(null)}\n anchorOrigin={{ vertical: \"top\", horizontal: \"center\" }}\n >\n <Alert\n onClose={() => setErrorToast(null)}\n severity=\"error\"\n sx={{ width: \"100%\", whiteSpace: \"pre-line\" }}\n >\n {errorToast}\n </Alert>\n </Snackbar>\n\n <CompareHeader\n componentHeaderText={componentHeaderText}\n displayConfig={displayConfig}\n maintainRelativeOrder={maintainRelativeOrder}\n onCollapseAll={handleCollapseAll}\n showCollapseAll={isAnySectionExpanded}\n onToggleView={(isDefaultView) => {\n setIsToggling(true);\n \n setTimeout(() => {\n setMaintainRelativeOrder(!isDefaultView);\n onMaintainRelativeOrderChange?.(!isDefaultView);\n setScrollSyncLocked(false);\n resetSideBySide();\n closeSummaryPopup();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n setIsToggling(false);\n }, 600);\n });\n });\n }, 50);\n }}\n />\n\n {/* ── Main scrollable content ── */}\n <Box\n ref={scrollContainerRef}\n onScroll={handleColumnScroll}\n sx={{\n flex: 1,\n minHeight: 0,\n pt: 1.5,\n pb: 1,\n px: 3,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: maintainRelativeOrder ? \"stretch\" : \"flex-start\",\n bgcolor: \"#FFFFFF\",\n overflowY: maintainRelativeOrder ? \"visible\" : \"auto\", // ← \"visible\" not \"hidden\"\n borderTop: overallSummaryRaw && hasReasoning ? \"none\" : \"1.5px solid #EEF0F4\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n maxWidth: \"1200px\",\n minHeight: 0,\n ...(maintainRelativeOrder ? { flex: 1 } : {}), \n }}\n >\n <Box\n ref={containerRef}\n sx={{\n display: \"grid\",\n gridTemplateColumns: \"minmax(0, 1fr) 180px minmax(0, 1fr)\",\n // NOTE: WHILE INCREASING OR REDUCING THIS WIDTH CHANGE THE PADDING LEFT AND MARGIN OF THE BOX with rightContainerRef TO ENSURE MORE FUNCTIONS POPUP BUTTON IS VISIBLE IN THE VIEW TO CLICK\n // Increased gap for Cognitive AI Summary Popup\n gap: \"100px\",\n maxWidth: \"1200px\",\n width: \"100%\",\n position: \"relative\",\n minHeight: 0,\n ...(maintainRelativeOrder ? { flex: 1, overflow: \"visible\" } : {}),\n }}\n >\n {/* ── SVG connector lines & deviation badges ── */}\n <SvgConnectors\n svgContainerRef={svgContainerRef}\n svgDimensions={svgDimensions}\n isResizing={isResizing}\n overallConnector={overallConnector}\n rootDeviationStyle={rootDeviationStyle}\n lines={lines}\n isSideBySide={isSideBySide}\n activeSideBySideSection={activeSideBySideSection}\n isArrowVisible={isArrowVisible}\n maintainRelativeOrder={maintainRelativeOrder}\n proposedSections={proposedSections}\n existingSections={existingSections}\n cognitivePopup={cognitivePopup}\n activeBadgeId={activeBadgeId}\n closeCognitivePopup={closeCognitivePopup}\n setActiveBadgeId={setActiveBadgeId}\n openCognitivePopupFromState={openCognitivePopupFromState}\n buildSectionPopupState={buildSectionPopupState}\n connectedLines={connectedLines}\n isGuidelineMode={isGuidelineMode}\n pathRefs={pathRefs}\n />\n\n {/* ── Left Column ── */}\n <Box\n sx={{\n border: \"1px solid #E7E7E9\",\n borderRadius: \"8px\",\n bgcolor: \"#FFFFFF\",\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n zIndex: 2,\n filter: \"drop-shadow(0px 2px 4px #F2F2F2)\",\n ...(maintainRelativeOrder\n ? { flex: 1, overflow: \"visible\", minHeight: 0 }\n : {}),\n }}\n >\n <Box\n ref={leftHeaderRef}\n sx={{\n p: \"8px\",\n bgcolor: \"#F7F8FA\",\n borderBottom: \"1px solid #E7E7E9\",\n borderRadius: \"8px 8px 0 0\",\n display: \"flex\",\n alignItems: \"center\",\n minHeight: \"40px\",\n overflow: \"hidden\",\n minWidth: 0,\n }}\n >\n <Tooltip title={leftColumnTitle} placement=\"top\">\n <Typography\n sx={{\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#19213D\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n width: \"100%\",\n minWidth: 0,\n textAlign: \"center\",\n display: \"block\",\n }}\n >\n {leftColumnTitle}\n </Typography>\n </Tooltip>\n </Box>\n <Box\n ref={leftContainerRef}\n onScroll={handleColumnScroll}\n sx={{\n p: \"12px\",\n display: \"flex\",\n flexDirection: \"column\",\n ...(maintainRelativeOrder\n ? {\n flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n minHeight: 0,\n mr: \"-180px\",\n pr: \"192px\",\n \"&::-webkit-scrollbar\": { display: \"none\" },\n scrollbarWidth: \"none\",\n }\n : {}),\n }}\n >\n <div ref={lhsTopSpacerRef} style={{ width: \"100%\", height: \"0px\", flexShrink: 0 }} />\n {hasSectionAccordions && leftRows}\n <div ref={lhsBottomSpacerRef} style={{ width: \"100%\", height: \"0px\", flexShrink: 0 }} />\n </Box>\n </Box>\n\n {/* ── Center Column ── */}\n <Box\n ref={summaryGapRef}\n sx={{\n width: \"180px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n pt: \"15px\",\n gap: 0,\n zIndex: 20,\n pointerEvents: \"none\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n mt: 0,\n }}\n >\n <Box\n onClick={(e) => {\n e.stopPropagation();\n if (cognitivePopup.open && activeBadgeId === rootDeviationId) {\n closeCognitivePopup();\n return;\n }\n setActiveBadgeId(rootDeviationId);\n openCognitivePopupFromState(\n buildSectionPopupState(\n e.currentTarget as HTMLElement,\n {\n title: baseDocName,\n content: \"\",\n evaluationResult: rootEvaluationResult,\n cognitiveData: {\n section_id: \"\",\n decisioning: [],\n gap: [],\n relevance_score: 0,\n isMissingRationale: true,\n },\n } as any,\n {\n title: referenceDocName,\n content: \"\",\n },\n rootDeviationId,\n true,\n { ...rootDeviationStyle, label: \"\" },\n ),\n );\n }}\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"5px\",\n px: 1.5,\n py: \"5px\",\n // DO NOT CHANGE MAINTAINS ALIGNMENT IN DEV\n // IN LOCAL YOU WILL SEE THE ALIGNMENT MISPLACED BUT IN DEV IT IS CORRECT\n top: \"-8px\",\n borderRadius: \"20px\",\n bgcolor: rootDeviationStyle.badgeBg,\n color: rootDeviationStyle.badgeText,\n border: `1px solid ${rootDeviationStyle.badgeBorder}`,\n fontSize: \"12px\",\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n position: \"relative\",\n zIndex: 1,\n pointerEvents: \"auto\",\n cursor: \"pointer\",\n }}\n >\n {rootDeviationScore ?? <ThreeDotsLoader />}\n <Box\n component=\"span\"\n sx={{\n width: 14,\n height: 14,\n display: \"flex\",\n alignItems: \"center\",\n \"& svg\": { width: \"14px\", height: \"14px\" },\n }}\n >\n <ButtonCognitiveIcon />\n </Box>\n <ChevronDown\n size={11}\n style={{\n transform:\n cognitivePopup.open && activeBadgeId === rootDeviationId\n ? \"rotate(180deg)\"\n : \"rotate(0deg)\",\n transition: \"transform 0.25s ease\",\n }}\n />\n </Box>\n </Box>\n </Box>\n\n {/* ── Right Column ── */}\n <Box\n sx={{\n border: \"1px solid #E3E6EA\",\n borderRadius: \"8px\",\n bgcolor: \"#FFFFFF\",\n boxShadow: \"0px 1px 4px #F7F4FE\",\n position: \"relative\",\n zIndex: 2,\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n ...(maintainRelativeOrder\n ? { flex: 1, overflow: \"visible\", minHeight: 0 }\n : {}),\n }}\n >\n {isSideBySideLoading && <OverlayLoader sections={11} />}\n <Box\n ref={rightHeaderRef}\n // onScroll={handleColumnScroll}\n sx={{\n p: \"8px\",\n bgcolor: isGuidelineMode ? \"#F1F3F5\" : \"#F7F8FA\",\n borderBottom: \"1px solid #D7DCE2\",\n borderRadius: \"8px 8px 0 0\",\n display: \"flex\",\n alignItems: \"center\",\n flexShrink: 0,\n }}\n >\n {isGuidelineMode ? (\n <Tabs\n value={guidelinesTab}\n onChange={handleGuidelinesTabChange}\n variant=\"fullWidth\"\n TabIndicatorProps={{ sx: { display: \"none\" } }}\n sx={{\n width: \"100%\",\n minHeight: \"36px\",\n \"& .MuiTab-root\": {\n minHeight: \"36px\",\n // mx: 1,\n px: 1,\n py: 0,\n borderRadius: \"8px\",\n fontSize: \"14px\",\n lineHeight: 1,\n fontWeight: 500,\n textTransform: \"none\",\n color: \"#374151\",\n minWidth: 0,\n transition: \"background-color 160ms ease, box-shadow 160ms ease\",\n },\n \"& .Mui-selected\": {\n color: \"#374151\",\n bgcolor: \"#FFFFFF\",\n // boxShadow: \"0 2px 8px rgba(15, 23, 42, 0.18)\",\n },\n }}\n >\n <Tab\n label={\n <Tooltip title={rightColumnTitle} placement=\"top\">\n <Box\n component=\"span\"\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"block\",\n width: \"100%\",\n }}\n >\n Redline Guidelines\n </Box>\n </Tooltip>\n }\n />\n {/* webGptPanel */}\n {hasWebGptCitations && (\n <Tab\n label={\n <Tooltip title={'Web & GPT Sources'} placement=\"top\">\n <Box\n component=\"span\"\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"block\",\n width: \"100%\",\n }}\n >\n Web & GPT Sources\n </Box>\n </Tooltip>\n }\n />\n )}\n </Tabs>\n ) : (\n <Tooltip title={rightColumnTitle} placement=\"top\">\n <Typography\n sx={{\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#5928ED\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n width: \"100%\",\n minWidth: 0,\n textAlign: \"center\",\n display: \"block\",\n }}\n >\n {rightColumnTitle}\n </Typography>\n </Tooltip>\n )}\n </Box>\n <Box\n ref={rightContainerRef}\n onScroll={handleColumnScroll}\n sx={{\n p: isGuidelineMode ? \"0px\" : \"12px\",\n display: \"flex\",\n flexDirection: \"column\",\n ...(maintainRelativeOrder\n ? {\n flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n minHeight: 0,\n // CHANGE THESE TWO VALUES WHEN INCREASING OR DECREASING THE GAP OF BOTH THE COLUMNS\n ml: \"-150px\",\n pl: \"165px\",\n \"&::-webkit-scrollbar\": { display: \"none\" },\n scrollbarWidth: \"none\",\n }\n : {}),\n }}\n >\n <div\n ref={rhsTopSpacerRef}\n style={{ width: \"100%\", height: \"0px\", flexShrink: 0 }}\n />\n \n {isGuidelineMode ? (\n // 1. If guidelines data is still fetching, show the Skeleton\n !guidelinesData ? (\n <GuidelineSkeleton />\n ) : (\n // 2. Once ready, show the active tab panel\n guidelinesTab === 0 || !hasWebGptCitations ? (\n <GuidelinePanel \n guidelinesData={guidelinesData}\n deviationData={deviationData}\n connectedSections={connectedSections}\n proposedSections={proposedSections} \n />\n ) : (\n <WebGptPanel\n deviationData={deviationData}\n connectedSections={connectedSections}\n proposedSections={proposedSections} \n />\n )\n )\n ) : (\n hasSectionAccordions && rightRows\n )}\n\n <div\n ref={rhsBottomSpacerRef}\n style={{ width: \"100%\", height: \"0px\", flexShrink: 0 }}\n />\n </Box>\n </Box>\n </Box>\n </Box>\n </Box>\n </Box>\n </CompareContextProvider>\n );\n};\n\nexport { SHARED_MARKDOWN_STYLES };\nexport default CognitiveCompare;\n"],"names":["CognitiveCompare","componentHeaderText","DEFAULT_COMPONENT_HEADER_TEXT","treeData","comparisonConfig","leftColumnTitleText","rightColumnTitleText","markdownStyles","resetTrigger","displayConfig","isHeaderVisible","isToggleVisible","maintainRelativeOrder","isLoading","showDeviationBadges","enableDeviationSchemaBackwardCompatibility","displayEmailNotifier","isStreamingEnabled","onMaintainRelativeOrderChange","popupConfig","deviationData","deviationNodeIdToView","resetDeviationNodeId","isProposingFix","proposingFixNodeId","isRedlineFlow","badgeStyleOverride","guidelinesData","isGuidelineMode","isGuidelineModeFromParent","gptWebCitationConfig","onDemandCitationConfig","setMaintainRelativeOrder","useState","expandLevels","shouldExpandAll","expandAllSections","shouldShowDeviationBadges","isToggling","setIsToggling","errorToast","setErrorToast","isDeviationBackwardCompatible","newEvaluationResult","connectedSections","setConnectedSections","Set","connectedLines","setConnectedLines","scrollSyncLocked","setScrollSyncLocked","guidelinesTab","setGuidelinesTab","svgContainerRef","useRef","containerRef","leftHeaderRef","rightHeaderRef","pendingClauseScrollRef","isAnimatingRef","animationTimerRef","pathRefs","cachedConnectedPositions","calculateLinesRef","resizeTimerRef","handleResizeRef","stableDeviationDataStr","useMemo","JSON","stringify","stableDeviationData","hasWebGptCitations","hasGptCitationObjects","cognitiveMap","cognitive_decisioning","resolvedMarkdownStyles","SHARED_MARKDOWN_STYLES","scrollContainerRef","ruleComponentRef","rightContainerRef","rhsTopSpacerRef","rhsBottomSpacerRef","lhsTopSpacerRef","lhsBottomSpacerRef","leftContainerRef","pendingScrollTargetRef","pendingScrollCallbackRef","cognitivePopup","setCognitivePopup","moreFunctions","setMoreFunctions","position","setPosition","activeBadgeId","summaryPopup","setSummaryPopup","closeSummaryPopup","setActiveBadgeId","popupRef","handleOpenCognitiveCompare","openCognitivePopupFromState","closeCognitivePopup","closeMoreFunctionsPopup","useComparePopups","resolvedComparisonConfig","fields","DEFAULT_FIELD_CONFIG","thresholds","high","DEFAULT_COMPARISON_CONFIG","medium","exact","localHighlightField","setLocalHighlightField","jsonLeftTitle","documents","input_index_map","title","jsonRightTitle","leftColumnTitle","safeStringify","jsonLeftTitleTrimmed","metadata","file_name","leftTitleTrimmed","jsonRightTitleTrimmed","rightTitleTrimmed","rightColumnTitle","activeProposed","existingRule","proposedSections","existingSections","visibleFields","parentDeviationRecord","deviationNumberRegistry","deviationParentRegistry","parseError","useCognitiveTreeData","useEffect","hasSectionAccordions","length","redlineLayoutSignature","count","totalLen","walk","sections","Array","isArray","forEach","section","content","hasMeaningfulRedlineTags","String","subsections","nextSections","nextSubSections","expandAll","side","sec","idx","key","expandSubsRecursively","parentPath","sub","subIdx","subPath","setExpandedSections","setExpandedSubSections","expandToDepth","maxDepth","expandSubsToDepth","currentDepth","leftRefs","rightRefs","sectionLeftRefs","sectionRightRefs","lhsBadgeRefs","rhsBadgeRefs","sectionRightRowRefs","subSectionLeftRefs","subSectionRightRefs","sectionRowRefs","getSectionRowRef","getSubSectionRef","getBadgeRef","useSectionRefs","map","Math","max","isSideBySide","isArrowVisible","setIsSideBySide","setIsArrowVisible","isResizing","setIsResizing","isSideBySideLoading","setIsSideBySideLoading","activeSideBySideSection","setActiveSideBySideSection","scrollLock","sideBySideCacheRef","isSideBySideRef","activeSideBySideRightSectionRef","activeSideBySideSectionRef","sideBySideLineRef","highlightedClauseRefs","clearClauseHighlight","applyAlignmentPadding","resetSideBySide","activateSideBySide","useSideBySide","activateSideBySideRef","current","expandedSections","expandedSubSections","handleSubSectionToggle","toggleSection","forceExpandCrossWiredSections","useAccordionState","alignActiveSections","leftEl","rightEl","rightContainer","leftRect","getBoundingClientRect","rightRect","containerRect","desiredTopInsideContainer","top","delta","scrollBy","behavior","toggleScrollSyncLocked","useCallback","e","stopPropagation","prev","nextLocked","requestAnimationFrame","unifiedNumbering","leftNums","Map","rightNums","counter","id","set","mappedLhs","filter","l","refIndexes","includes","selfIndex","nums","get","Boolean","join","maxLen","i","leftSec","rightSec","analysisData","analysis","overallSummaryRaw","rule_difference_comparison","summary","overall_summary","hasReasoning","match","rootDeviationId","base_root_id","rootEvaluationResult","evaluation_result","nodes","rootDeviationScore","extractDeviationScore","rootDeviationStyle","generateColorPalette","evaluation_outputs","label_color","DEFAULT_DEVIAION_COLOR","override","badgeBg","bg","badgeText","text","badgeBorder","border","resetSideBySideRef","closeCognitivePopupRef","openMoreFunctionsPopupStable","baseSec","isOrphan","refSec","style","openMoreFunctionsPopupRef","handleOpenSummaryPopupStable","actionId","displayImpact","handleOpenSummaryPopupRef","handleCloseSummaryPopupStable","handleCloseSummaryPopupRef","toggleSectionStable","columnKey","toggleSectionRef","handleSubSectionToggleStable","keyPath","handleSubSectionToggleRef","renderSubSectionAccordionStable","args","renderSubSectionAccordionRef","resetSideBySideStable","resetSideBySideContextRef","resetAll","setLines","setOverallConnector","EMPTY_SUMMARY_POPUP_STATE","resetAllRef","stableDocData","baseDocName","setBaseDocName","referenceDocName","treeDataRef","baseId","baseContractName","cognitiveMapRef","buildSectionPopupState","anchorEl","sectionIdx","rootNode","sectionId","sectionIdxParts","split","DEVIATION_BADGE_SEPARATOR","sourceNodeId","nodeId","deviationKey","cogData","cognitiveData","section_id","decisioning","gap","relevance_score","sectionRowEl","resolvedDeviationData","fallbackEval","evaluationResult","mergeWithFallbackEntry","firstEntry","fromEntries","deviation_entries","firstEntryKey","Object","keys","sort","a","b","Number","numericKeys","k","test","fromDeviations","deviations","firstDeviationKey","getFirstDeviationEntry","deviation_summary","deviation_title","deviation_impact","deviation_explanation","devKey","deviationEntry","getDeviationDataForBadge","hasDeviationContent","decisioning_factors","gaps_in_decision","globallyLoading","hasGuidelineMatches","devHighlights","deviation_highlights","values","some","highlightArray","open","sectionTitle","refSectionTitle","sectionAnchorEl","badgeStyle","docData","baseContentId","contentId","compareContentIds","refContentIds","openMoreFunctionsPopup","initialAnchor","currentTarget","sourceSide","contains","handleCloseSummaryPopup","freshAnchor","parts","refId","getFreshAnchor","handleConnect","getGuidelineTabFromId","has","setTimeout","executePendingClauseScroll","leftSectionIdx","findIndex","s","rightSectionIdx","leftKeyPath","findKeyPathByNodeId","rightKeyPath","parentLeftIdx","parentRightIdx","resolveEl","sideRefs","subSideRefs","scrollWhenReady","getEl","container","maxAttempts","attempts","tryScroll","el","height","add","scrollAndHighlightClause","scrollToClauseAndHighlightClause","console","warn","next","changed","expandPath","path","executePendingClauseScrollRef","summaryGapRef","cfg","find","f","analysisKey","targetRef","scrollIntoView","block","getFieldData","score","relation","highlightsA","highlightsB","hasContent","field","hasActualContent","highlights","ruleA_spans","ruleB_spans","mappings","mapping","getSectionCompareStyle","getSubSectionCompareStyle","getDeviationStyleByKey","useStyleHelpers","lines","overallConnector","svgDimensions","calculateLines","calculateLinesDebounced","handleColumnScroll","useLinesCalculator","handleCollapseAll","size","isAnySectionExpanded","timerRef","prevRootWidthRef","prevScrollWidthRef","prevContainerWidthRef","handleResize","useResizeHandler","makeWidthObserver","prevWidthRef","rafRef","onWidthChange","onNoChange","width","observer","ResizeObserver","entries","cancelAnimationFrame","entry","newWidth","borderBoxSize","inlineSize","contentRect","abs","observe","rootRafRef","scrollRafRef","containerRafRef","observers","rafRefs","push","o","disconnect","r","identifier","nId","dKey","res","node","parseInt","guideline_flag","rulebook_used","invalidateGuidelineConnections","handleGuidelinesTabChange","_event","nextTab","alignStraightLines","lContainer","rContainer","targets","getVisibleGuidelineTargets","isSub","lRect","rRect","lContRect","rContRect","lContentY","scrollTop","rContentY","idealLTargetScroll","lTargetScroll","lMaxScrollRaw","scrollHeight","clientHeight","lBottomSpacer","finalScreenY","rTargetScroll","rTopSpacer","rMaxScrollWithTop","rBottomSpacer","scrollTo","handleOpenSideBySide","onReady","isCurrentSectionConnected","showDeviationNavigation","showOpenNodeRef","adjustScrollForPopup","useDeviationNavigation","handleOpenSummaryPopup","summaryText","trim","window","innerHeight","toggleIfSame","rect","offsetToCenter","deviationTargetParentId","targetNodeId","lastDeviationTriggerRef","triggerMs","clearedForDeviationId","trigger","lastTrigger","targetIdx","requestedDeviationKeyRaw","requestedDeviationKey","requestKey","cancelled","timer","layoutWatcherCleanup","expansionDone","findKeyPath","targetIds","found","tryConnect","markProcessed","targetParentId","targetChild","child","from","lhsNodeIdx","rhsNodeIdx","isRhsOrphan","rhsIdx","rhsSelfIndex","rhsArrayIdx","slice","effectiveRightSectionIdx","isLeftEmpty","isRightEmpty","shouldNavigateRight","expandedSectionsRef","safeLeftPath","safeRightPath","refIdCandidates","fallbackRefId","getMountedBadges","candidateRefId","left","right","buildActionId","getTargetElement","getElement","onStable","rafId","stableFrames","lastTop","lastHeight","startedAt","performance","now","check","topStable","heightStable","waitForStableLayout","leftElement","rightElement","useRightTarget","targetElement","scrollContainer","elementRect","targetTop","isTargetSub","onScrollComplete","async","boxShadowColor","Element","getComputedStyle","color","transition","boxShadow","deviationMap","evalOutputs","freshElement","skipScroll","waitWithTimeout","p","ms","Promise","race","all","waitForScrollIdle","resolve","freshLeft","freshRight","scrollMarginTop","scrollAndWait","anchor","isConnected","findRefIdByContent","refs","ref","textContent","dataset","deviationRefId","cognitivePopupOpen","cognitivePopupSectionIdx","cognitivePopupIsOrphan","cognitivePopupBadgeStyle","cognitivePopupAnchorEl","cognitivePopupSectionAnchorEl","findNodeRecursively","targetId","baseSecById","refSecById","refreshedPopup","renderSubSectionAccordion","depth","parentNodeId","sectionOffset","rhsOrphanVisualIndexes","jsx","SubSectionAccordion","leftRows","isEmpty","LHSSectionRow","layoutKey","rightRows","RHSSectionRow","cacheVersion","onDemandCitationCacheVersion","getCacheKey","getOnDemandCitationCacheKey","getCacheEntry","getOnDemandCitationCacheEntry","fetchCitationContext","fetchOnDemandCitationContext","prefetchCitationContexts","prefetchOnDemandCitationContexts","abortCitationContexts","abortOnDemandCitationContexts","useOnDemandCitationCache","compareContextValue","summaryPopupAnchorEl","openSummaryPopup","cognitivePopupLeftTitle","cognitivePopupRightTitle","CompareContextProvider","value","children","jsxs","Box","sx","display","flexDirection","bgcolor","fontFamily","overflow","inset","backdropFilter","zIndex","alignItems","justifyContent","borderRadius","BouncingDotsLoader","CognitiveSummaryPopup","containerEl","clipTopEl","scrollContainerEl","onClose","isScrollLocked","MoreFunctionsPopup","referenceSectionTitle","onOpenCognitiveCompare","onOpenSideBySide","onConnect","CognitivePopup","Snackbar","autoHideDuration","anchorOrigin","vertical","horizontal","Alert","severity","whiteSpace","CompareHeader","onCollapseAll","showCollapseAll","onToggleView","isDefaultView","onScroll","flex","minHeight","pt","pb","px","overflowY","borderTop","maxWidth","gridTemplateColumns","SvgConnectors","borderBottom","minWidth","Tooltip","placement","Typography","fontSize","fontWeight","textOverflow","textAlign","overflowX","mr","pr","scrollbarWidth","flexShrink","pointerEvents","mt","onClick","isMissingRationale","label","py","cursor","ThreeDotsLoader","component","ButtonCognitiveIcon","ChevronDown","transform","OverlayLoader","Tabs","onChange","variant","TabIndicatorProps","lineHeight","textTransform","Tab","ml","pl","WebGptPanel","GuidelinePanel","GuidelineSkeleton"],"mappings":"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ACAoK,gBACAQ,2BACApJ,oBACAuL,0BACA4c,qBAAsBtlB,GAAawO,SACnC1R,qBACAsF,oBACAC,oBACAG,2BACAC,2BACApI,YACAM,iBACAkE,0BACAoK,oBACA1B,oBACAC,uBACA/C,0BACAkS,0BACAC,6BACAlR,eACAF,oBACAC,oBACAT,mBACAC,oBACAM,kBACAH,uBACAC,sBACAC,uBACAJ,gBACAC,gBAEAsN,uBAAwBtG,GACxBkQ,uBAAwB5P,GACxB8Y,iBAAkB9Y,GAClBqG,wBAAyBjG,GACzBnF,cAAeqF,GACftF,uBAAwByF,GACxByW,0BAA2BtW,GAC3BnG,gBAAiBsG,GAEjBzQ,wBACAG,qBACAc,4BACAie,2BACAC,mBACA3gB,sBAAuBA,IAAuB+N,GAC9CuT,2BACAhhB,kBACAG,wBACAC,0BACAwoB,gCACAE,+BACAE,iCACAE,gCACAE,oCACAE,mCACA,CACArpB,GACAhB,GACAyB,GACAd,GACAC,GACAC,GACAoK,GACAQ,GACApJ,GACAuL,GACA1I,GAAawO,SACb1R,GACAsF,GACAC,GACAG,GACA7H,GACAkE,GACAoK,GACA1B,GACAC,GACA/C,GACAkS,GACAC,GACAlR,GACAF,GACAC,GAIAwW,GACAC,GACA3gB,GACAshB,GACAhhB,GACAG,GACAC,GACAwoB,GACAE,GACAE,GACAE,GACAE,GACAE,KAGIK,GAA0B9jB,EAC9BjC,GAAeuS,cAAgBlQ,IAAoBL,IAE/CgkB,GAA2B/jB,EAC/B5F,GACIkG,IAAqBC,IAAoBxC,GAAewS,gBACxDxS,GAAewS,iBAAmBjQ,IAAqBC,IAI3D,OAAA+hB,EAAC0B,EAAuB,CAAAC,MAAON,GAC/BO,SAAAC,EAACC,EAAA,CACClD,IAAK5jB,GACL+mB,GAAI,CACFC,QAAS,OACTC,cAAe,SACftR,OAAQ,OACRuR,QAAS,YACTC,WAAY,kCACZC,SAAU,UACVvmB,SAAU,YAGX+lB,SAAA,CACCppB,IAAAwnB,EAAC8B,EAAA,CACCC,GAAI,CACFlmB,SAAU,WACVwmB,MAAO,EACPH,QAAS,2BACTI,eAAgB,aAChBC,OAAQ,KA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"}
|
|
1
|
+
{"version":3,"file":"CognitiveCompare.js","sources":["../../../src/features/CognitiveCompare/CognitiveCompare.tsx"],"sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n} from \"react\";\nimport {\n Box,\n Typography,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n Snackbar,\n Alert,\n Tooltip,\n Tabs,\n Tab,\n} from \"@mui/material\";\nimport { ChevronDown, EllipsisVertical } from \"lucide-react\";\n\nimport { ButtonCognitiveIcon } from \"../../assests/svg/ButtonCognitiveIcon\";\nimport OverlayLoader from \"./OverlayComponent\";\nimport {\n safeStringify,\n hasValue,\n generateColorPalette,\n debounce,\n DEVIATION_BADGE_SEPARATOR,\n getBentArrowPath,\n smoothScrollTo,\n isMissingStr,\n extractDeviationScore,\n getFirstDeviationColor,\n getFirstDeviationOutputValue,\n recursivelyFindSubSectionIdxById,\n scrollAndHighlightClause,\n resetClauseHighlight,\n findKeyPathByNodeId,\n waitForElementVisible,\n hasMeaningfulRedlineTags,\n scrollAndWait,\n waitForScrollIdle\n} from \"./CognitiveComparehelpers\";\nimport {\n CognitiveDecisioningEntry,\n CognitiveCompareProps,\n DeviationAnalysisStatus,\n StyleVariant,\n ComparisonConfig,\n SectionBlock,\n SectionPopupState,\n CachedBadgePosition,\n DivRefMap\n} from \"./CognitiveCompareTypes\";\nimport {\n DEFAULT_FIELD_CONFIG,\n DEFAULT_COMPARISON_CONFIG,\n SHARED_MARKDOWN_STYLES,\n} from \"./CognitiveCompareConfig\";\nimport { DEFAULT_DEVIAION_COLOR, DEFAULT_COMPONENT_HEADER_TEXT, EMPTY_SUMMARY_POPUP_STATE } from \"./CognitiveCompareConstants\";\nimport CognitivePopup from \"./CognitivePopup\";\nimport MoreFunctionsPopup from \"./MoreFunctionsPopup\";\nimport BouncingDotsLoader from \"./LoaderComponent\";\nimport ThreeDotsLoader from \"./components/ThreeDotsLoader\";\nimport { MemoizedMarkdown } from \"./hooks/memoizedMarkdown\";\nimport { useCognitiveTreeData } from \"./hooks/useCompareData\";\nimport { useComparePopups } from \"./hooks/useComparePopups\";\nimport { useSectionRefs } from \"./hooks/useSectionRefs\";\nimport { useAccordionState } from \"./hooks/useAccordionState\";\nimport { useDeviationNavigation } from \"./hooks/useDeviationNavigation\";\nimport CompareHeader from \"./components/CompareHeader\";\nimport SectionAccordion from \"./components/SectionAccordion\";\nimport SubSectionAccordion from \"./components/SubSectionAccordion\";\nimport LHSSectionRow from \"./components/LHSSectionRow\";\nimport RHSSectionRow from \"./components/RHSSectionRow\";\nimport CognitiveSummaryPopup from \"./components/CognitiveSummaryPopup\";\nimport ConnectedLinesComp from \"./components/connectedLines\";\nimport { CompareContextProvider } from \"./CompareContext\";\nimport { useStyleHelpers } from \"./hooks/useStyles\";\nimport { useResizeHandler } from \"./hooks/useResizeHandler\";\nimport { useLinesCalculator } from \"./hooks/useLinesCalculator\";\nimport { useSideBySide } from \"./hooks/useSideBySide\";\nimport SvgConnectors from \"./components/SvgConnectors\";\nimport GuidelinePanel from \"./Guidelines/components/GuidelinePanel\";\nimport WebGptPanel from \"./Guidelines/components/WebGptPanel\";\n// import GuidelinePanel from \"./components/GuidelinePanel\"; // ── NEW IMPORT ──\n\nconst CognitiveCompare = ({\n componentHeaderText = DEFAULT_COMPONENT_HEADER_TEXT,\n treeData,\n comparisonConfig,\n leftColumnTitleText,\n rightColumnTitleText,\n markdownStyles,\n resetTrigger,\n displayConfig = {\n isHeaderVisible: true,\n isToggleVisible: true,\n maintainRelativeOrder: false,\n isLoading: true,\n showDeviationBadges: false,\n enableDeviationSchemaBackwardCompatibility: false,\n displayEmailNotifier: true,\n isStreamingEnabled: false\n },\n deviationAnalysisStatus,\n onMaintainRelativeOrderChange,\n popupConfig,\n deviationData = {},\n deviationNodeIdToView,\n resetDeviationNodeId,\n isProposingFix = false,\n proposingFixNodeId,\n isRedlineFlow,\n badgeStyleOverride,\n guidelinesData, // ── NEW PROP ──\n gptWebCitationConfig\n}: CognitiveCompareProps) => {\n const [maintainRelativeOrder, setMaintainRelativeOrder] = useState(displayConfig.maintainRelativeOrder);\n const expandLevels = displayConfig?.expandLevels ?? 0; // how deep to auto-expand\n const shouldExpandAll = !!displayConfig?.expandAllSections; // expand everything\n const shouldShowDeviationBadges =\n !!maintainRelativeOrder || !!displayConfig?.showDeviationBadges;\n const [isToggling, setIsToggling] = useState(false);\n const [errorToast, setErrorToast] = useState<string | null>(null);\n const [isDeviationBackwardCompatible] = useState(\n treeData?.newEvaluationResult ??\n displayConfig?.enableDeviationSchemaBackwardCompatibility ??\n true\n );\n\n const [connectedSections, setConnectedSections] = useState<Set<number | string>>(new Set());\n const [connectedLines, setConnectedLines] = useState<Record<string, any>[]>([]);\n const [scrollSyncLocked, setScrollSyncLocked] = useState(false);\n const [guidelinesTab, setGuidelinesTab] = useState(0);\n const effectiveDeviationAnalysisStatus: DeviationAnalysisStatus =\n deviationAnalysisStatus ??\n (displayConfig?.isLoading ? \"deviations_streaming\" : \"complete\");\n const isDeviationGenerationInProgress =\n effectiveDeviationAnalysisStatus === \"mapping_ready\" ||\n effectiveDeviationAnalysisStatus === \"deviations_streaming\";\n\n const svgContainerRef = useRef<SVGSVGElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const leftHeaderRef = useRef<HTMLDivElement>(null);\n const rightHeaderRef = useRef<HTMLDivElement>(null);\n const pendingClauseScrollRef = useRef<string | null>(null);\n const isAnimatingRef = useRef(false);\n const animationTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pathRefs = useRef<Record<string, SVGPathElement | null>>({});\n const cachedConnectedPositions = useRef<CachedBadgePosition[]>([]);\n const calculateLinesRef = useRef<() => void>(() => { });\n const resizeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const handleResizeRef = useRef<() => void>(() => { });\n\n const stableDeviationDataStr = useMemo(\n () => JSON.stringify(deviationData || {}),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(deviationData)]\n);\nconst stableDeviationData = useMemo(\n () => (deviationData || {}) as Record<string, any>,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [stableDeviationDataStr]\n);\n const cognitiveMap = useMemo<Record<string, CognitiveDecisioningEntry>>(\n () => treeData?.cognitive_decisioning || {},\n [treeData],\n );\n\n const resolvedMarkdownStyles = useMemo(\n () => ({ ...SHARED_MARKDOWN_STYLES, ...markdownStyles }),\n [markdownStyles],\n );\n\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const ruleComponentRef = useRef<HTMLDivElement>(null);\n const rightContainerRef = useRef<HTMLDivElement>(null);\n const rhsTopSpacerRef = useRef<HTMLDivElement>(null);\n const rhsBottomSpacerRef = useRef<HTMLDivElement>(null);\n const lhsTopSpacerRef = useRef<HTMLDivElement>(null);\n const lhsBottomSpacerRef = useRef<HTMLDivElement>(null);\n const leftContainerRef = useRef<HTMLDivElement>(null);\n\n const pendingScrollTargetRef = useRef<number | null>(null);\n const pendingScrollCallbackRef = useRef<(() => void) | null>(null);\n \n\n const {\n cognitivePopup,\n setCognitivePopup,\n moreFunctions,\n setMoreFunctions,\n position,\n setPosition,\n activeBadgeId,\n summaryPopup,\n setSummaryPopup,\n closeSummaryPopup,\n setActiveBadgeId,\n popupRef,\n handleOpenCognitiveCompare,\n openCognitivePopupFromState,\n closeCognitivePopup,\n closeMoreFunctionsPopup,\n } = useComparePopups(scrollContainerRef);\n\n // Merges caller overrides with defaults so UI thresholds/colors are always fully populated.\n const resolvedComparisonConfig = useMemo<ComparisonConfig>(\n () => ({\n fields: comparisonConfig?.fields ?? DEFAULT_FIELD_CONFIG,\n thresholds: {\n high:\n comparisonConfig?.thresholds?.high ??\n DEFAULT_COMPARISON_CONFIG.thresholds.high,\n medium:\n comparisonConfig?.thresholds?.medium ??\n DEFAULT_COMPARISON_CONFIG.thresholds.medium,\n exact:\n comparisonConfig?.thresholds?.exact ??\n DEFAULT_COMPARISON_CONFIG.thresholds.exact,\n },\n }),\n [comparisonConfig],\n );\n\n\n const [localHighlightField, setLocalHighlightField] = useState<string | null>(\n null,\n );\n const jsonLeftTitle =\n treeData?.documents?.[treeData?.input_index_map?.[\"0\"]]?.title;\n const jsonRightTitle =\n treeData?.documents?.[treeData?.input_index_map?.[\"1\"]]?.title;\n const leftColumnTitle: string = safeStringify(\n leftColumnTitleText || jsonLeftTitle || \"Uploaded Contract\",\n );\n\n const jsonLeftTitleTrimmed = treeData?.documents?.[treeData?.input_index_map?.[\"0\"]]?.metadata?.file_name;\n const leftTitleTrimmed = safeStringify(jsonLeftTitleTrimmed);\n\n const jsonRightTitleTrimmed = treeData?.documents?.[treeData?.input_index_map?.[\"1\"]]?.metadata?.file_name;\n const rightTitleTrimmed = safeStringify(jsonRightTitleTrimmed);\n const rightColumnTitle: string = safeStringify(\n rightColumnTitleText || jsonRightTitle || \"Reference Template\",\n );\n const {\n isGuidelineMode, // ── EXTRACT ──\n activeProposed,\n existingRule,\n proposedSections,\n existingSections,\n visibleFields,\n parentDeviationRecord,\n deviationNumberRegistry,\n deviationParentRegistry,\n parseError\n } = useCognitiveTreeData(\n treeData as Record<string, any>,\n maintainRelativeOrder as boolean,\n stableDeviationData,\n resolvedComparisonConfig,\n isDeviationBackwardCompatible,\n guidelinesData // ── NEW ──\n );\n\n useEffect(() => {\n if (parseError) setErrorToast(`Failed to load comparison: ${parseError}`);\n }, [parseError]);\n\n const hasSectionAccordions =\n proposedSections.length > 0 || existingSections.length > 0;\n\n const redlineLayoutSignature = useMemo(() => {\n if (!isRedlineFlow) return \"off\";\n let count = 0;\n let totalLen = 0;\n\n const walk = (sections?: SectionBlock[]) => {\n if (!Array.isArray(sections)) return;\n sections.forEach((section) => {\n const content = section?.content || \"\";\n if (hasMeaningfulRedlineTags(content)) {\n count += 1;\n totalLen += String(content).length;\n }\n if (section?.subsections?.length) {\n walk(section.subsections as SectionBlock[]);\n }\n });\n };\n\n walk(proposedSections as SectionBlock[]);\n walk(existingSections as SectionBlock[]);\n\n return `${count}:${totalLen}`;\n }, [isRedlineFlow, proposedSections, existingSections]);\n\n useEffect(() => {\n if (!proposedSections.length && !existingSections.length) return;\n\n if (shouldExpandAll) {\n const nextSections: Record<string, boolean> = {};\n const nextSubSections: Record<string, boolean> = {};\n\n const expandAll = (sections: SectionBlock[], side: \"left\" | \"right\") => {\n sections.forEach((sec, idx) => {\n const key = maintainRelativeOrder ? `${side}-${idx}` : String(idx);\n nextSections[key] = true;\n\n const expandSubsRecursively = (subsections: SectionBlock[], parentPath: string) => {\n subsections?.forEach((sub, subIdx) => {\n const subPath = `${parentPath}-${subIdx}`;\n nextSubSections[subPath] = true;\n if (sub.subsections?.length) {\n expandSubsRecursively(sub.subsections as SectionBlock[], subPath);\n }\n });\n };\n\n if (sec.subsections?.length) {\n expandSubsRecursively(sec.subsections as SectionBlock[], String(idx));\n }\n });\n };\n\n expandAll(proposedSections as SectionBlock[], \"left\");\n expandAll(existingSections as SectionBlock[], \"right\");\n\n setExpandedSections(nextSections);\n setExpandedSubSections(nextSubSections);\n\n } else if (expandLevels > 0) {\n const nextSections: Record<string, boolean> = {};\n const nextSubSections: Record<string, boolean> = {};\n\n const expandToDepth = (\n sections: SectionBlock[],\n side: \"left\" | \"right\",\n maxDepth: number\n ) => {\n sections.forEach((sec, idx) => {\n if (maxDepth >= 1) {\n const key = maintainRelativeOrder ? `${side}-${idx}` : String(idx);\n nextSections[key] = true;\n }\n\n const expandSubsToDepth = (\n subsections: SectionBlock[],\n parentPath: string,\n currentDepth: number\n ) => {\n if (currentDepth > maxDepth) return;\n subsections?.forEach((sub, subIdx) => {\n const subPath = `${parentPath}-${subIdx}`;\n nextSubSections[subPath] = true;\n if (sub.subsections?.length) {\n expandSubsToDepth(sub.subsections as SectionBlock[], subPath, currentDepth + 1);\n }\n });\n };\n\n if (sec.subsections?.length && maxDepth >= 2) {\n expandSubsToDepth(sec.subsections as SectionBlock[], String(idx), 2);\n }\n });\n };\n\n expandToDepth(proposedSections as SectionBlock[], \"left\", expandLevels);\n expandToDepth(existingSections as SectionBlock[], \"right\", expandLevels);\n\n setExpandedSections(nextSections);\n setExpandedSubSections(nextSubSections);\n }\n}, [shouldExpandAll, expandLevels, proposedSections, existingSections, maintainRelativeOrder]);\n \n const {\n leftRefs,\n rightRefs,\n sectionLeftRefs,\n sectionRightRefs,\n lhsBadgeRefs,\n rhsBadgeRefs,\n sectionRightRowRefs,\n subSectionLeftRefs,\n subSectionRightRefs,\n sectionRowRefs,\n getSectionRowRef,\n getSubSectionRef,\n getBadgeRef,\n } = useSectionRefs(\n visibleFields.map(({ key }) => key),\n Math.max(proposedSections.length, existingSections.length),\n );\n\n const { isSideBySide, isArrowVisible, setIsSideBySide, setIsArrowVisible, isResizing, setIsResizing, isSideBySideLoading, setIsSideBySideLoading, activeSideBySideSection, setActiveSideBySideSection, scrollLock, sideBySideCacheRef, isSideBySideRef, activeSideBySideRightSectionRef, activeSideBySideSectionRef, sideBySideLineRef, highlightedClauseRefs, clearClauseHighlight, applyAlignmentPadding, resetSideBySide, activateSideBySide } = useSideBySide({\n isGuidelineMode,\n maintainRelativeOrder,\n proposedSections,\n existingSections,\n leftContainerRef, rightContainerRef, scrollContainerRef,\n sectionLeftRefs, sectionRightRefs,\n subSectionLeftRefs, subSectionRightRefs,\n lhsBadgeRefs, rhsBadgeRefs,\n sectionRowRefs, sectionRightRowRefs,\n rhsTopSpacerRef, rhsBottomSpacerRef, lhsTopSpacerRef, lhsBottomSpacerRef,\n calculateLinesRef,\n setConnectedSections, setConnectedLines, cachedConnectedPositions,\n closeMoreFunctionsPopup, setErrorToast, moreFunctions, closeSummaryPopup\n });\n const activateSideBySideRef = useRef(activateSideBySide);\n useEffect(() => {\n activateSideBySideRef.current = activateSideBySide;\n }, [activateSideBySide]);\n\n const {\n expandedSections,\n setExpandedSections,\n expandedSubSections,\n setExpandedSubSections,\n handleSubSectionToggle,\n toggleSection,\n forceExpandCrossWiredSections,\n } = useAccordionState({\n maintainRelativeOrder: !!maintainRelativeOrder,\n proposedSections,\n existingSections,\n activeSideBySideSection,\n connectedSections,\n resetSideBySide,\n setConnectedSections,\n setConnectedLines,\n cachedConnectedPositions,\n svgContainerRef,\n isAnimatingRef,\n animationTimerRef,\n calculateLinesRef,\n sectionLeftRefs,\n sectionRightRefs,\n subSectionLeftRefs,\n subSectionRightRefs,\n });\n\n const alignActiveSections = () => {\n if (activeSideBySideSection == null) return;\n\n const leftEl =\n sectionLeftRefs.current[activeSideBySideSection]?.current;\n\n const rightEl =\n sectionRightRefs.current[activeSideBySideSection]?.current;\n\n const rightContainer = rightContainerRef.current;\n\n if (!leftEl || !rightEl || !rightContainer) return;\n\n const leftRect = leftEl.getBoundingClientRect();\n const rightRect = rightEl.getBoundingClientRect();\n const containerRect = rightContainer.getBoundingClientRect();\n\n // desired position inside RHS container\n const desiredTopInsideContainer =\n leftRect.top - containerRect.top;\n\n const currentTopInsideContainer =\n rightRect.top - containerRect.top;\n\n const delta =\n currentTopInsideContainer - desiredTopInsideContainer;\n\n rightContainer.scrollBy({\n top: delta,\n behavior: \"smooth\",\n });\n };\n\n const toggleScrollSyncLocked = useCallback(\n (e?: React.MouseEvent) => {\n e?.stopPropagation();\n\n setScrollSyncLocked((prev) => {\n const nextLocked = !prev;\n\n if (nextLocked) {\n // wait for React to finish updates\n requestAnimationFrame(() => {\n alignActiveSections();\n });\n }\n\n return nextLocked;\n });\n },\n [alignActiveSections]\n );\n useEffect(() => {\n if (!isRedlineFlow) return;\n if (redlineLayoutSignature === \"off\" || redlineLayoutSignature === \"0:0\") return;\n sideBySideCacheRef.current = null;\n cachedConnectedPositions.current = [];\n requestAnimationFrame(() => {\n calculateLinesRef.current?.();\n });\n }, [isRedlineFlow, redlineLayoutSignature]);\n\n // --- NEW: Centralized Unified Numbering System ---\n const unifiedNumbering = useMemo(() => {\n const leftNums = new Map<string, number>();\n const rightNums = new Map<string, string>();\n let counter = 1;\n\n if (!maintainRelativeOrder) {\n const maxLen = Math.max(proposedSections.length, existingSections.length);\n for (let i = 0; i < maxLen; i++) {\n const leftSec = proposedSections[i] as any;\n const rightSec = existingSections[i] as any;\n if (leftSec) {\n leftNums.set(leftSec.id, counter);\n if (rightSec) rightNums.set(rightSec.id, String(counter));\n counter++;\n } else if (rightSec) {\n rightNums.set(rightSec.id, String(counter++));\n }\n }\n } else {\n // 1. Assign sequential numbers to all Proposed (Left) sections\n proposedSections.forEach((sec: any) => {\n const isEmpty = !sec.title && !sec.content;\n if (isEmpty) return; // Skip hidden sections from eating a number\n\n if (sec.id) leftNums.set(sec.id, counter++);\n });\n\n // 2. Map existing (Right) sections\n existingSections.forEach((sec: any) => {\n if (!sec.id) return;\n \n const isEmpty = !sec.title && !sec.content;\n if (isEmpty) return; \n\n const mappedLhs = proposedSections.filter((l: any) => l.refIndexes?.includes(sec.selfIndex));\n\n if (mappedLhs.length > 0) {\n // If mapped, inherit the Left section's number(s) to match identically\n const nums = mappedLhs.map((l: any) => leftNums.get(l.id)).filter(Boolean);\n rightNums.set(sec.id, nums.join(\", \"));\n } else {\n // If orphan, continue the global counter so it's strictly unique\n rightNums.set(sec.id, String(counter++));\n }\n });\n }\n return { leftNums, rightNums };\n }, [proposedSections, existingSections, maintainRelativeOrder]);\n\n const analysisData = existingRule.analysis;\n const overallSummaryRaw = safeStringify(\n analysisData?.rule_difference_comparison?.summary?.overall_summary,\n );\n const reasoningMatch = overallSummaryRaw.match(\n /<ai_reasoning>([\\s\\S]*?)<\\/ai_reasoning>/i,\n );\n const hasReasoning = !!reasoningMatch;\n\n const rootDeviationId = treeData?.base_root_id ?? '-1'\n const rootNode = treeData?.[rootDeviationId]\n const rootEvaluationResult = !isDeviationBackwardCompatible\n ? (deviationData && deviationData?.[rootDeviationId]?.evaluation_result?.[0]) ??\n treeData?.nodes?.[rootDeviationId]?.evaluation_result?.[0] ??\n null\n : (deviationData && deviationData?.[rootDeviationId]?.evaluation_result) ??\n treeData?.nodes?.[rootDeviationId]?.evaluation_result ??\n null;\n const rootDeviationScore = extractDeviationScore(rootEvaluationResult);\n const shouldShowRootDeviationLoader =\n isDeviationGenerationInProgress && rootEvaluationResult == null;\n const rootDeviationBadgeContent =\n shouldShowRootDeviationLoader\n ? null\n : rootDeviationScore ?? (\n effectiveDeviationAnalysisStatus === \"complete\" && rootEvaluationResult == null\n ? \"Same\"\n : null\n );\n \n let rootDeviationStyle = generateColorPalette(\n rootEvaluationResult?.evaluation_outputs?.metadata?.label_color ?? DEFAULT_DEVIAION_COLOR,\n );\n\n if (badgeStyleOverride) {\n const override = badgeStyleOverride(rootDeviationScore as string | null | undefined);\n \n if (override) {\n rootDeviationStyle = {\n ...rootDeviationStyle,\n badgeBg: override.bg,\n badgeText: override.text,\n badgeBorder: override.border,\n };\n }\n }\nconst resetSideBySideRef = useRef(resetSideBySide);\nuseEffect(() => { resetSideBySideRef.current = resetSideBySide; }, [resetSideBySide]);\n\nconst closeCognitivePopupRef = useRef(closeCognitivePopup);\nuseEffect(() => { closeCognitivePopupRef.current = closeCognitivePopup; }, [closeCognitivePopup]);\nconst openMoreFunctionsPopupStable = useCallback(\n (e: React.MouseEvent, baseSec: SectionBlock, isOrphan: boolean, refSec: SectionBlock, id: string | number, style?: StyleVariant | null) => \n openMoreFunctionsPopupRef.current(e, baseSec, isOrphan, refSec, id, style),\n []\n);\n\nconst handleOpenSummaryPopupStable = useCallback(\n (e: React.MouseEvent, actionId: string, isOrphan: boolean, summary: any, displayImpact?: boolean) => \n handleOpenSummaryPopupRef.current(e, actionId, isOrphan, summary, displayImpact),\n []\n);\n\nconst handleCloseSummaryPopupStable = useCallback(() => handleCloseSummaryPopupRef.current(), []);\n\nconst toggleSectionStable = useCallback(\n (idx: number, columnKey: \"left\" | \"right\") => toggleSectionRef.current(idx, columnKey), \n []\n);\n\nconst handleSubSectionToggleStable = useCallback(\n (keyPath: string) => handleSubSectionToggleRef.current(keyPath), \n []\n);\n\nconst renderSubSectionAccordionStable = useCallback(\n (args: any) => renderSubSectionAccordionRef.current(args), \n []\n);\n\nconst resetSideBySideStable = useCallback(() => resetSideBySideContextRef.current(), []);\n\n const resetAll = useCallback(() => {\n clearClauseHighlight();\n resetSideBySideRef.current?.();\n setScrollSyncLocked(false);\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n setLines([]);\n setOverallConnector(null);\n setSummaryPopup(EMPTY_SUMMARY_POPUP_STATE);\n closeCognitivePopupRef.current?.();\n\n requestAnimationFrame(() => {\n calculateLinesRef.current?.();\n });\n }, []);\n const resetAllRef = useRef(resetAll);\n useEffect(() => {\n resetAllRef.current = resetAll;\n }, [resetAll]);\n\n useEffect(() => {\n if (resetTrigger) {\n resetAllRef.current();\n }\n }, [resetTrigger]);\n const stableDocData = useMemo(() => ({\n documents: treeData?.documents,\n input_index_map: treeData?.input_index_map,\n}), [\n JSON.stringify(treeData?.documents),\n JSON.stringify(treeData?.input_index_map),\n]);\n\n const [baseDocName, setBaseDocName] = useState<string>(\"\");\n\n const treeDataRef = useRef(treeData);\n useEffect(() => { treeDataRef.current = treeData; \n const baseId = treeData?.input_index_map?.[0];\n const baseContractName = treeData?.documents?.[baseId]?.title;\n setBaseDocName(baseContractName);\n }, [treeData]);\n\n const cognitiveMapRef = useRef(cognitiveMap);\n useEffect(() => { cognitiveMapRef.current = cognitiveMap; }, [cognitiveMap]);\n\n const buildSectionPopupState = useCallback(\n (\n anchorEl: HTMLElement | null,\n baseSec: SectionBlock | null,\n refSec: SectionBlock | null,\n sectionIdx: number | string,\n isOrphan?: boolean,\n style?: StyleVariant | null,\n rootNode?: boolean\n ): SectionPopupState => {\n const getDeviationDataForBadge = () => {\n const fallbackEval = baseSec?.evaluationResult || refSec?.evaluationResult || null;\n // For supporting legacy data\n const getFirstDeviationEntry = (evaluationResult: any) => {\n if (!evaluationResult || typeof evaluationResult !== \"object\") return null;\n\n const fromEntries = evaluationResult?.deviation_entries;\n if (fromEntries && typeof fromEntries === \"object\") {\n const firstEntryKey = Object.keys(fromEntries).sort(\n (a, b) => Number(a) - Number(b),\n )[0];\n if (firstEntryKey && fromEntries[firstEntryKey]) return fromEntries[firstEntryKey];\n }\n\n const numericKeys = Object.keys(evaluationResult)\n .filter((k) => /^\\d+$/.test(k))\n .sort((a, b) => Number(a) - Number(b));\n if (numericKeys.length && evaluationResult[numericKeys[0]]) {\n return evaluationResult[numericKeys[0]];\n }\n\n const fromDeviations = evaluationResult?.deviations;\n if (fromDeviations && typeof fromDeviations === \"object\") {\n const firstDeviationKey = Object.keys(fromDeviations).sort(\n (a, b) => Number(a) - Number(b),\n )[0];\n if (firstDeviationKey && fromDeviations[firstDeviationKey]) {\n return fromDeviations[firstDeviationKey];\n }\n }\n\n return null;\n };\n\n const mergeWithFallbackEntry = (evaluationResult: any) => {\n const firstEntry = getFirstDeviationEntry(evaluationResult);\n if (!firstEntry) return evaluationResult;\n\n return {\n ...evaluationResult,\n deviation_summary:\n evaluationResult?.deviation_summary || firstEntry?.deviation_summary,\n deviation_title:\n evaluationResult?.deviation_title || firstEntry?.deviation_title,\n deviation_impact:\n evaluationResult?.deviation_impact || firstEntry?.deviation_impact,\n deviation_explanation:\n evaluationResult?.deviation_explanation || firstEntry?.deviation_explanation,\n evaluation_outputs:\n evaluationResult?.evaluation_outputs || firstEntry?.evaluation_outputs,\n cognitive_decisioning:\n evaluationResult?.cognitive_decisioning || firstEntry?.cognitive_decisioning,\n };\n };\n\n const isDeviationBadge =\n typeof sectionIdx === \"string\" &&\n sectionIdx.includes(DEVIATION_BADGE_SEPARATOR);\n\n if (!isDeviationBadge) return mergeWithFallbackEntry(fallbackEval);\n\n const parts = sectionIdx.split(DEVIATION_BADGE_SEPARATOR);\n const devKey = parts[1];\n if (!devKey) return fallbackEval;\n\n const evaluationResult =\n baseSec?.evaluationResult || refSec?.evaluationResult || {};\n const deviationEntry =\n evaluationResult?.deviation_entries?.[devKey] ||\n evaluationResult?.deviations?.[devKey] ||\n null;\n\n if (!deviationEntry) return mergeWithFallbackEntry(fallbackEval);\n\n return {\n ...evaluationResult,\n ...deviationEntry,\n deviation_summary:\n deviationEntry?.deviation_summary || evaluationResult?.deviation_summary,\n deviation_title:\n deviationEntry?.deviation_title || evaluationResult?.deviation_title,\n deviation_impact:\n deviationEntry?.deviation_impact || evaluationResult?.deviation_impact,\n deviation_explanation:\n deviationEntry?.deviation_explanation || evaluationResult?.deviation_explanation,\n evaluation_outputs:\n deviationEntry?.evaluation_outputs || evaluationResult?.evaluation_outputs,\n cognitive_decisioning:\n deviationEntry?.cognitive_decisioning || evaluationResult?.cognitive_decisioning,\n };\n };\n\n const sectionId =\n safeStringify(baseSec?.id) || safeStringify(refSec?.id) || \"\";\n const cogData =\n (sectionId ? cognitiveMapRef.current?.[sectionId] : null) ||\n baseSec?.cognitiveData ||\n refSec?.cognitiveData ||\n {\n section_id: sectionId,\n decisioning: [],\n gap: [],\n relevance_score: 0,\n };\n\n const sectionRowEl = sectionRowRefs.current[sectionIdx as any]?.current ?? null;\n\n const resolvedDeviationData = getDeviationDataForBadge();\n\n const hasDeviationContent =\n (resolvedDeviationData?.cognitive_decisioning?.decisioning_factors?.length ?? 0) > 0 ||\n (resolvedDeviationData?.cognitive_decisioning?.gaps_in_decision?.length ?? 0) > 0;\n\n const globallyLoading = isDeviationGenerationInProgress;\n\n // ── FIXED LOGIC: Accurately check the exact specific resolved data for the clause/deviation ──\n let hasGuidelineMatches = true;\n if (isGuidelineMode) {\n const devHighlights = resolvedDeviationData?.deviation_highlights;\n \n if (devHighlights && typeof devHighlights === \"object\") {\n // Check if ANY of the arrays inside deviation_highlights actually have content (length > 0)\n const hasAnyTextToHighlight = Object.values(devHighlights).some(\n (highlightArray: any) => Array.isArray(highlightArray) && highlightArray.length > 0\n );\n \n hasGuidelineMatches = hasAnyTextToHighlight;\n } else {\n hasGuidelineMatches = false; // Disable if deviation_highlights is completely missing\n }\n }\n\n return {\n isLoading: globallyLoading && !hasDeviationContent,\n open: true,\n sectionTitle: baseSec?.title ? baseSec?.title : 'No Counterpart',\n refSectionTitle: refSec?.title ? refSec?.title : 'No Counterpart',\n cognitiveData: cogData,\n anchorEl,\n sectionAnchorEl: sectionRowEl,\n badgeStyle: style || null,\n sectionIdx: sectionIdx as any,\n docData: stableDocData,\n deviationData: resolvedDeviationData,\n isOrphan: !!isOrphan,\n hasGuidelineMatches, // ── PASS FLAG TO POPUP ──\n };\n },\n [stableDocData, isDeviationGenerationInProgress, isGuidelineMode],\n );\n\n\n\n const openMoreFunctionsPopup = useCallback(\n (\n e: React.MouseEvent,\n baseSec: SectionBlock,\n isOrphan: boolean,\n refSec: SectionBlock,\n sectionIdx: number | string,\n style?: StyleVariant | null,\n ) => {\n e.stopPropagation();\n if (moreFunctions.open && moreFunctions.sectionIdx === sectionIdx) {\n closeMoreFunctionsPopup();\n return;\n }\n\n const initialAnchor = e.currentTarget as HTMLElement;\n let sourceSide: \"left\" | \"right\" = \"left\";\n if (rightContainerRef.current?.contains(initialAnchor)) {\n sourceSide = \"right\";\n }\n\n const getFreshAnchor = () => {\n const isSub = typeof sectionIdx === \"string\" && sectionIdx.includes(DEVIATION_BADGE_SEPARATOR);\n if (isSub) {\n const parts = (sectionIdx as string).split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n return sourceSide === \"right\"\n ? rhsBadgeRefs.current[refId]?.current\n : lhsBadgeRefs.current[refId]?.current;\n } else {\n return sourceSide === \"right\"\n ? rhsBadgeRefs.current[sectionIdx as any]?.current\n : lhsBadgeRefs.current[sectionIdx as any]?.current;\n }\n };\n clearClauseHighlight();\n if (isSideBySideRef.current) {\n resetSideBySide();\n }\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n closeCognitivePopup();\n\n if (summaryPopup.open) {\n handleCloseSummaryPopup();\n } else {\n closeSummaryPopup();\n }\n\n requestAnimationFrame(() => {\n const freshAnchor = getFreshAnchor() || initialAnchor;\n\n setMoreFunctions(\n buildSectionPopupState(\n freshAnchor,\n baseSec,\n refSec,\n sectionIdx,\n isOrphan,\n style,\n ),\n );\n });\n },\n [moreFunctions.open, moreFunctions.sectionIdx, closeMoreFunctionsPopup, closeSummaryPopup, buildSectionPopupState, /* other deps used inside */]\n );\n\n const handleConnect = useCallback(() => {\n const idx = moreFunctions.sectionIdx;\n const isOrphan = moreFunctions.isOrphan;\n\n closeMoreFunctionsPopup();\n closeSummaryPopup();\n\n if (idx === null) return;\n // if (isOrphan) {\n // setErrorToast(\"No counterpart exists to connect to.\");\n // return;\n // }\n forceExpandCrossWiredSections(idx);\n clearClauseHighlight();\n if (isSideBySideRef.current) {\n resetSideBySide();\n }\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n\n if (isGuidelineMode && idx !== null) {\n setGuidelinesTab(getGuidelineTabFromId(idx));\n }\n\n setConnectedSections((prev) => {\n if (prev.has(idx)) {\n return new Set();\n }\n return new Set([idx]);\n });\n\n setTimeout(() => {\n if (calculateLinesRef.current) {\n calculateLinesRef.current();\n }\n }, 50);\n\n }, [\n moreFunctions.sectionIdx,\n moreFunctions.isOrphan,\n closeMoreFunctionsPopup,\n closeSummaryPopup,\n resetSideBySide\n ]);\n\n const executePendingClauseScroll = useCallback(() => {\n const nodeId = pendingClauseScrollRef.current;\n if (!nodeId) return;\n pendingClauseScrollRef.current = null;\n\n const leftSectionIdx = (proposedSections as any[]).findIndex((s) => s.id === nodeId);\n const rightSectionIdx = (existingSections as any[]).findIndex((s) => s.id === nodeId);\n const leftKeyPath = leftSectionIdx === -1\n ? findKeyPathByNodeId(proposedSections as SectionBlock[], nodeId) : null;\n const rightKeyPath = rightSectionIdx === -1\n ? findKeyPathByNodeId(existingSections as SectionBlock[], nodeId) : null;\n\n const parentLeftIdx = leftSectionIdx !== -1 ? leftSectionIdx\n : leftKeyPath ? Number(leftKeyPath.split(\"-\")[0]) : -1;\n const parentRightIdx = rightSectionIdx !== -1 ? rightSectionIdx\n : rightKeyPath ? Number(rightKeyPath.split(\"-\")[0]) : -1;\n\n const resolveEl = (\n sectionIdx: number,\n keyPath: string | null,\n sideRefs: typeof sectionLeftRefs,\n subSideRefs: typeof subSectionLeftRefs,\n ): HTMLElement | null => {\n if (sectionIdx !== -1) return sideRefs.current[sectionIdx]?.current ?? null;\n if (keyPath) return subSideRefs.current[keyPath]?.current ?? null;\n return null;\n };\n\n const scrollWhenReady = (\n getEl: () => HTMLElement | null,\n container: HTMLElement,\n maxAttempts = 30,\n ) => {\n let attempts = 0;\n const tryScroll = () => {\n const el = getEl();\n if (!el || el.getBoundingClientRect().height === 0) {\n if (attempts++ < maxAttempts) requestAnimationFrame(tryScroll);\n return;\n }\n highlightedClauseRefs.current.add(el);\n scrollAndHighlightClause(el, container);\n };\n requestAnimationFrame(tryScroll);\n };\n\n if (maintainRelativeOrder) {\n if (parentLeftIdx !== -1 && leftContainerRef.current) {\n scrollWhenReady(\n () => resolveEl(leftSectionIdx, leftKeyPath, sectionLeftRefs, subSectionLeftRefs),\n leftContainerRef.current,\n );\n }\n if (parentRightIdx !== -1 && rightContainerRef.current) {\n scrollWhenReady(\n () => resolveEl(rightSectionIdx, rightKeyPath, sectionRightRefs, subSectionRightRefs),\n rightContainerRef.current,\n );\n }\n } else {\n const container = scrollContainerRef.current;\n if (!container) return;\n scrollWhenReady(\n () => parentLeftIdx !== -1\n ? resolveEl(leftSectionIdx, leftKeyPath, sectionLeftRefs, subSectionLeftRefs)\n : resolveEl(rightSectionIdx, rightKeyPath, sectionRightRefs, subSectionRightRefs),\n container,\n );\n }\n }, [\n proposedSections,\n existingSections,\n maintainRelativeOrder,\n sectionLeftRefs,\n sectionRightRefs,\n subSectionLeftRefs,\n subSectionRightRefs,\n leftContainerRef,\n rightContainerRef,\n scrollContainerRef,\n ]);\n\n const scrollToClauseAndHighlightClause = useCallback(\n (nodeId: string) => {\n if (!nodeId) return;\n\n clearClauseHighlight();\n resetSideBySide();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n closeSummaryPopup();\n closeCognitivePopup();\n\n const leftSectionIdx = (proposedSections as any[]).findIndex((s) => s.id === nodeId);\n const rightSectionIdx = (existingSections as any[]).findIndex((s) => s.id === nodeId);\n\n const leftKeyPath = leftSectionIdx === -1\n ? findKeyPathByNodeId(proposedSections as SectionBlock[], nodeId) : null;\n const rightKeyPath = rightSectionIdx === -1\n ? findKeyPathByNodeId(existingSections as SectionBlock[], nodeId) : null;\n\n if (leftSectionIdx === -1 && !leftKeyPath && rightSectionIdx === -1 && !rightKeyPath) {\n console.warn(`scrollToAndHighlightClause: nodeId \"${nodeId}\" not found`);\n return;\n }\n\n const parentLeftIdx = leftSectionIdx !== -1 ? leftSectionIdx\n : leftKeyPath ? Number(leftKeyPath.split(\"-\")[0]) : -1;\n const parentRightIdx = rightSectionIdx !== -1 ? rightSectionIdx\n : rightKeyPath ? Number(rightKeyPath.split(\"-\")[0]) : -1;\n\n pendingClauseScrollRef.current = nodeId;\n\n setExpandedSections((prev: any) => {\n const next = { ...prev };\n let changed = false;\n if (parentLeftIdx !== -1) {\n const key = maintainRelativeOrder ? `left-${parentLeftIdx}` : String(parentLeftIdx);\n if (!next[key]) { next[key] = true; changed = true; }\n }\n if (parentRightIdx !== -1) {\n const key = maintainRelativeOrder ? `right-${parentRightIdx}` : String(parentRightIdx);\n if (!next[key]) { next[key] = true; changed = true; }\n }\n return changed ? next : prev;\n });\n\n setExpandedSubSections((prev: any) => {\n const next = { ...prev };\n let changed = false;\n\n const expandPath = (path: string) => {\n const parts = path.split(\"-\");\n let current = parts[0];\n for (let i = 1; i < parts.length; i++) {\n current += `-${parts[i]}`;\n if (!next[current]) {\n next[current] = true;\n changed = true;\n }\n }\n };\n\n if (leftKeyPath) expandPath(leftKeyPath);\n if (rightKeyPath) expandPath(rightKeyPath);\n\n return changed ? next : prev;\n });\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (pendingClauseScrollRef.current === nodeId) {\n executePendingClauseScrollRef.current();\n }\n });\n }, 50);\n },\n [\n proposedSections,\n existingSections,\n maintainRelativeOrder,\n setExpandedSections,\n setExpandedSubSections,\n resetSideBySide,\n closeSummaryPopup,\n closeCognitivePopup,\n ]\n );\n const executePendingClauseScrollRef = useRef(executePendingClauseScroll);\n useEffect(() => {\n executePendingClauseScrollRef.current = executePendingClauseScroll;\n }, [executePendingClauseScroll]);\n\n const summaryGapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (localHighlightField) {\n const cfg = resolvedComparisonConfig.fields.find(\n (f) =>\n f.analysisKey === localHighlightField ||\n f.key === localHighlightField,\n );\n if (cfg) {\n const targetRef =\n leftRefs.current[cfg.key] || rightRefs.current[cfg.key];\n if (targetRef?.current)\n setTimeout(\n () =>\n targetRef.current!.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n }),\n 150,\n );\n }\n }\n }, [localHighlightField, resolvedComparisonConfig.fields]);\n\n const getFieldData = useCallback(\n (analysisKey: string) => {\n const fields = analysisData?.rule_difference_comparison?.fields as Record<\n string,\n any\n >;\n if (!fields || !fields[analysisKey]) {\n return {\n score: 0,\n relation: \"\",\n highlightsA: [],\n highlightsB: [],\n hasContent: false,\n };\n }\n const field = fields[analysisKey];\n const hasActualContent =\n field?.relation ||\n field?.highlights?.ruleA_spans?.length ||\n field?.highlights?.ruleB_spans?.length ||\n (field?.mappings && field.mappings.length > 0);\n\n if (field.mappings) {\n const mapping = field.mappings[0] || {};\n return {\n score: field.score,\n relation: mapping.relation || \"\",\n highlightsA: mapping.highlights?.ruleA_spans || [],\n highlightsB: mapping.highlights?.ruleB_spans || [],\n hasContent: !!hasActualContent,\n };\n }\n return {\n score: field.score,\n relation: field.relation || \"\",\n highlightsA: field.highlights?.ruleA_spans || [],\n highlightsB: field.highlights?.ruleB_spans || [],\n hasContent: !!hasActualContent,\n };\n },\n [analysisData],\n );\n\n const { getSectionCompareStyle, getSubSectionCompareStyle, getDeviationStyleByKey } = useStyleHelpers(\n {\n proposedSections,\n existingSections,\n maintainRelativeOrder: maintainRelativeOrder as boolean,\n cognitiveMap,\n deviationData: stableDeviationData,\n treeData,\n resolvedComparisonConfig,\n badgeStyleOverride,\n }\n )\n const { lines, setLines, overallConnector, setOverallConnector, svgDimensions, calculateLines, calculateLinesDebounced, handleColumnScroll } = useLinesCalculator({\n containerRef,\n leftContainerRef,\n rightContainerRef,\n svgContainerRef,\n pathRefs,\n leftHeaderRef, rightHeaderRef,\n proposedSections, existingSections,\n visibleFields,\n leftRefs, rightRefs,\n sectionLeftRefs, sectionRightRefs,\n subSectionLeftRefs, subSectionRightRefs,\n lhsBadgeRefs, rhsBadgeRefs,\n sectionRowRefs,\n expandedSections, expandedSubSections,\n connectedSections,\n isSideBySide, activeSideBySideSection,\n maintainRelativeOrder,\n isGuidelineMode,\n cognitiveMap,\n getSectionCompareStyle, getSubSectionCompareStyle, getDeviationStyleByKey,\n isArrowVisible,\n\n isAnimatingRef,\n isSideBySideRef,\n sideBySideCacheRef,\n sideBySideLineRef,\n activeSideBySideSectionRef,\n activeSideBySideRightSectionRef,\n connectedLines,\n setConnectedLines,\n cachedConnectedPositions,\n calculateLinesRef,\n resizeTimerRef,\n scrollLock,\n scrollSyncLocked,\n\n handleResizeRef,\n activeProposed, existingRule, analysisData,\n pendingScrollTargetRef, pendingScrollCallbackRef,\n\n resolvedComparisonConfig,\n getFieldData\n })\n\n useEffect(() => {\n if (!summaryPopup.anchorEl) return;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n calculateLinesRef.current?.();\n });\n });\n }, [summaryPopup.anchorEl, scrollSyncLocked]);\n\n const handleCollapseAll = useCallback(() => {\n clearClauseHighlight();\n setScrollSyncLocked(false);\n setExpandedSections({});\n setExpandedSubSections({});\n\n resetSideBySide();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n\n closeSummaryPopup();\n closeCognitivePopup();\n closeMoreFunctionsPopup();\n\n requestAnimationFrame(() => {\n if (calculateLinesRef.current) {\n calculateLinesRef.current();\n }\n });\n }, [\n setExpandedSections,\n setExpandedSubSections,\n resetSideBySide,\n closeSummaryPopup,\n closeCognitivePopup,\n closeMoreFunctionsPopup,\n ]);\n\n useEffect(() => {\n if (!isSideBySide && connectedSections.size === 0) {\n setScrollSyncLocked(false);\n }\n }, [isSideBySide, connectedSections]);\n\n const isAnySectionExpanded = useMemo(() => {\n return (\n Object.values(expandedSections).some(Boolean) ||\n Object.values(expandedSubSections).some(Boolean)\n );\n }, [expandedSections, expandedSubSections]);\n\n\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const prevRootWidthRef = useRef<number>(0);\n const prevScrollWidthRef = useRef<number>(0);\n const prevContainerWidthRef = useRef<number>(0);\n const { handleResize } = useResizeHandler({\n timerRef, ruleComponentRef, scrollContainerRef, containerRef, maintainRelativeOrder, proposedSections,\n existingSections, isSideBySideRef, activeSideBySideSectionRef, activeSideBySideRightSectionRef, sectionRowRefs,\n sectionRightRowRefs, sectionLeftRefs, sectionRightRefs, subSectionLeftRefs, subSectionRightRefs, lhsBadgeRefs,\n rhsBadgeRefs, leftContainerRef, rightContainerRef, calculateLinesRef, handleResizeRef, setIsResizing, setIsArrowVisible,\n sideBySideCacheRef, cachedConnectedPositions\n });\n\n useEffect(() => {\n handleResizeRef.current = handleResize;\n }, [handleResize, handleResizeRef]);\n\n\n // Stable mount-once — watches root, scrollContainer, and inner container\n // Kept at [] so it never tears down from state changes, eliminating the\n // \"reset prevWidth → spurious handleResize → isResizing stuck true\" race.\n useEffect(() => {\n const makeWidthObserver = (\n el: HTMLElement,\n prevWidthRef: React.MutableRefObject<number>,\n rafRef: React.MutableRefObject<number | null>,\n onWidthChange: () => void,\n onNoChange: () => void,\n ): ResizeObserver => {\n prevWidthRef.current = el.getBoundingClientRect().width;\n\n const observer = new ResizeObserver((entries) => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n const entry = entries[entries.length - 1];\n if (!entry) return;\n\n const newWidth =\n entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n\n if (Math.abs(newWidth - prevWidthRef.current) < 1) {\n onNoChange();\n return;\n }\n prevWidthRef.current = newWidth;\n onWidthChange();\n });\n });\n\n observer.observe(el);\n return observer;\n };\n\n // Each observer gets its own RAF ref so they don't cancel each other\n const rootRafRef: React.MutableRefObject<number | null> = { current: null };\n const scrollRafRef: React.MutableRefObject<number | null> = { current: null };\n const containerRafRef: React.MutableRefObject<number | null> = { current: null };\n\n const observers: ResizeObserver[] = [];\n const rafRefs = [rootRafRef, scrollRafRef, containerRafRef];\n\n if (ruleComponentRef.current) {\n observers.push(\n makeWidthObserver(\n ruleComponentRef.current,\n prevRootWidthRef,\n rootRafRef,\n () => handleResizeRef.current(),\n () => { },\n ),\n );\n }\n\n if (scrollContainerRef.current) {\n observers.push(\n makeWidthObserver(\n scrollContainerRef.current,\n prevScrollWidthRef,\n scrollRafRef,\n () => handleResizeRef.current(),\n () => calculateLinesRef.current(),\n ),\n );\n }\n\n if (containerRef.current) {\n observers.push(\n makeWidthObserver(\n containerRef.current,\n prevContainerWidthRef,\n containerRafRef,\n () => handleResizeRef.current(),\n () => calculateLinesRef.current(),\n ),\n );\n }\n\n return () => {\n observers.forEach((o) => o.disconnect());\n rafRefs.forEach((r) => {\n if (r.current !== null) {\n cancelAnimationFrame(r.current);\n r.current = null;\n }\n });\n };\n }, []);\n\n useEffect(() => {\n isSideBySideRef.current = isSideBySide;\n }, [isSideBySide]);\n\n useEffect(() => {\n activeSideBySideSectionRef.current = activeSideBySideSection;\n }, [activeSideBySideSection]);\n\n const getGuidelineTabFromId = useCallback((identifier: string | number) => {\n let nId = \"\";\n let dKey = \"0\";\n \n if (typeof identifier === \"number\") {\n nId = proposedSections[identifier]?.nodeId || proposedSections[identifier]?.id || \"\";\n } else {\n const parts = String(identifier).split(DEVIATION_BADGE_SEPARATOR);\n nId = parts[0];\n dKey = parts[1] || \"0\";\n }\n \n const res = stableDeviationData?.[nId]?.evaluation_result;\n const node = Array.isArray(res) ? res[parseInt(dKey, 10)] : res?.[dKey];\n \n // If explicitly false, open Web GPT Tab (1), otherwise default to Guideline Tab (0)\n return node?.evaluation_outputs?.guideline_flag?.rulebook_used === false ? 1 : 0;\n }, [proposedSections, stableDeviationData]);\n\n const alignStraightLines = useCallback((actionId: string) => {\n // Select either the Guideline highlight OR the WebGPT box\n const targets = document.querySelectorAll('[id^=\"guideline-target-\"], [data-web-gpt-active=\"true\"]');\n const lContainer = leftContainerRef.current;\n const rContainer = rightContainerRef.current;\n \n // Re-calculate refId from actionId to dynamically find the exact Left Badge\n const isSub = typeof actionId === \"string\" && actionId.includes(DEVIATION_BADGE_SEPARATOR);\n let refId = actionId;\n if (isSub) {\n const parts = actionId.split(DEVIATION_BADGE_SEPARATOR);\n if (parts.length >= 2) {\n refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n }\n }\n \n // Grab the Left Element safely from the ref map\n const leftEl = lhsBadgeRefs.current[refId]?.current || lhsBadgeRefs.current[actionId as any]?.current;\n\n if (targets.length > 0 && leftEl && lContainer && rContainer) {\n const rightEl = targets[0] as HTMLElement;\n\n // 1. Reset all spacers to 0px first to measure the true intrinsic positions without fake padding\n if (lhsTopSpacerRef.current) lhsTopSpacerRef.current.style.height = '0px';\n if (rhsTopSpacerRef.current) rhsTopSpacerRef.current.style.height = '0px';\n if (lhsBottomSpacerRef.current) lhsBottomSpacerRef.current.style.height = '0px';\n if (rhsBottomSpacerRef.current) rhsBottomSpacerRef.current.style.height = '0px';\n\n // 2. Wait for the browser to register the 0px heights before measuring\n requestAnimationFrame(() => {\n const lRect = leftEl.getBoundingClientRect();\n const rRect = rightEl.getBoundingClientRect();\n const lContRect = lContainer.getBoundingClientRect();\n const rContRect = rContainer.getBoundingClientRect();\n\n // Calculate absolute Y coordinate of the center of elements relative to the top of the scrollable content\n const lContentY = lContainer.scrollTop + (lRect.top - lContRect.top) + (lRect.height / 2);\n const rContentY = rContainer.scrollTop + (rRect.top - rContRect.top) + (rRect.height / 2);\n\n // Calculate Ideal Scroll for LHS to be in the center\n const idealLTargetScroll = lContentY - (lContRect.height / 2);\n\n // ── RULE 1: No Top Spacer for LHS. If it's at the top, it stays at the top. ──\n const lTargetScroll = Math.max(0, idealLTargetScroll);\n\n // ── RULE 2: Calculate Bottom Spacer for LHS if it's at the very bottom ──\n const lMaxScrollRaw = lContainer.scrollHeight - lContainer.clientHeight;\n const lBottomSpacer = lTargetScroll > lMaxScrollRaw ? lTargetScroll - lMaxScrollRaw : 0;\n\n // Determine the EXACT visual screen Y coordinate where the LHS center will sit\n const finalScreenY = lContRect.top + lContentY - lTargetScroll;\n\n // ── RULE 3: Force RHS to match finalScreenY perfectly ──\n // Equation: finalScreenY = rContRect.top + rContentY + rTopSpacer - rTargetScroll\n let rTargetScroll = rContRect.top + rContentY - finalScreenY;\n let rTopSpacer = 0;\n\n if (rTargetScroll < 0) {\n // RHS element is too close to top. We must push it down with a top spacer.\n rTopSpacer = Math.abs(rTargetScroll);\n rTargetScroll = 0;\n }\n\n // ── RULE 4: Calculate Bottom Spacer for RHS if it's at the very bottom ──\n const rMaxScrollRaw = rContainer.scrollHeight - rContainer.clientHeight;\n const rMaxScrollWithTop = rMaxScrollRaw + rTopSpacer;\n const rBottomSpacer = rTargetScroll > rMaxScrollWithTop ? rTargetScroll - rMaxScrollWithTop : 0;\n\n // Apply Spacers\n if (lhsBottomSpacerRef.current) lhsBottomSpacerRef.current.style.height = `${lBottomSpacer}px`;\n if (rhsTopSpacerRef.current) rhsTopSpacerRef.current.style.height = `${rTopSpacer}px`;\n if (rhsBottomSpacerRef.current) rhsBottomSpacerRef.current.style.height = `${rBottomSpacer}px`;\n\n // Execute Smooth Scroll and Draw Lines\n requestAnimationFrame(() => {\n lContainer.scrollTo({ top: lTargetScroll, behavior: \"smooth\" });\n rContainer.scrollTo({ top: rTargetScroll, behavior: \"smooth\" });\n \n if (calculateLinesRef.current) {\n setTimeout(() => calculateLinesRef.current(), 50);\n }\n });\n });\n }\n }, [DEVIATION_BADGE_SEPARATOR]);\n\n\n\n\n const handleOpenSideBySide = useCallback(() => {\n const idx = moreFunctions.sectionIdx;\n const isOrphan = moreFunctions.isOrphan;\n closeSummaryPopup();\n if (idx == null) return;\n\n let sourceSide: \"left\" | \"right\" = \"left\";\n if (moreFunctions.anchorEl && rightContainerRef.current?.contains(moreFunctions.anchorEl)) {\n sourceSide = \"right\";\n }\n \n forceExpandCrossWiredSections(idx);\n\n if (isGuidelineMode) {\n setGuidelinesTab(getGuidelineTabFromId(idx));\n setConnectedSections(new Set([idx]));\n }\n \n\n activateSideBySide(idx, isOrphan, { \n sourceSide,\n onReady: () => {\n if (isGuidelineMode) {\n setTimeout(() => alignStraightLines(String(idx)), 150);\n }\n }\n });\n }, [\n activateSideBySide, \n moreFunctions.isOrphan, \n moreFunctions.sectionIdx, \n moreFunctions.anchorEl, \n closeSummaryPopup, \n forceExpandCrossWiredSections,\n isGuidelineMode,\n alignStraightLines,\n getGuidelineTabFromId\n ]);\n\n const handleCloseSummaryPopup = useCallback(() => {\n closeSummaryPopup();\n resetSideBySide();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n }, [closeSummaryPopup, resetSideBySide]);\n\n const isCurrentSectionConnected =\n moreFunctions.sectionIdx !== null &&\n connectedSections.has(moreFunctions.sectionIdx);\n\n const { showDeviationNavigation, showOpenNodeRef, adjustScrollForPopup } = useDeviationNavigation({\n proposedSections,\n existingSections,\n parentDeviationRecord,\n expandedSections,\n maintainRelativeOrder: !!maintainRelativeOrder,\n scrollContainerRef,\n leftContainerRef,\n rightContainerRef,\n lhsBadgeRefs,\n rhsBadgeRefs,\n });\n\n \n\n const handleOpenSummaryPopup = useCallback(\n (\n e: React.MouseEvent,\n actionId: string,\n isOrphan: boolean,\n summary: any,\n displayImpact?: boolean,\n ) => {\n const summaryText = typeof summary === \"string\"\n ? safeStringify(summary).trim()\n : safeStringify(summary?.deviation_summary).trim();\n\n const initialAnchor = e.currentTarget as HTMLElement;\n closeCognitivePopup();\n\n let sourceSide: \"left\" | \"right\" = \"left\";\n if (rightContainerRef.current?.contains(initialAnchor)) {\n sourceSide = \"right\";\n }\n\n const getFreshAnchor = () => {\n const isSub = typeof actionId === \"string\" && actionId.includes(DEVIATION_BADGE_SEPARATOR);\n if (isSub) {\n const parts = actionId.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n return sourceSide === \"right\"\n ? rhsBadgeRefs.current[refId]?.current\n : lhsBadgeRefs.current[refId]?.current;\n } else {\n return sourceSide === \"right\"\n ? rhsBadgeRefs.current[actionId as any]?.current\n : lhsBadgeRefs.current[actionId as any]?.current;\n }\n };\n\n if (isOrphan && !isGuidelineMode) {\n resetSideBySide();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n\n if (summaryText) {\n forceExpandCrossWiredSections(actionId);\n requestAnimationFrame(() => {\n const freshAnchor = getFreshAnchor() || initialAnchor;\n \n if (freshAnchor) {\n const rect = freshAnchor.getBoundingClientRect();\n if (rect.top > window.innerHeight * 0.8) {\n freshAnchor.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n }\n }\n\n setSummaryPopup({\n open: true,\n anchorEl: freshAnchor,\n summary,\n displayImpact,\n });\n });\n }\n return;\n }\n\n forceExpandCrossWiredSections(actionId);\n\n if (isGuidelineMode) {\n setGuidelinesTab(getGuidelineTabFromId(actionId));\n setConnectedSections(new Set([actionId]));\n }\n\n if (!summaryText) {\n setTimeout(() => {\n activateSideBySide(actionId, isOrphan, { toggleIfSame: false, sourceSide });\n \n if (isGuidelineMode) {\n setTimeout(() => alignStraightLines(actionId), 150);\n }\n }, 350);\n return;\n }\n\n setTimeout(() => {\n activateSideBySide(actionId, isOrphan, {\n toggleIfSame: false,\n sourceSide,\n onReady: () => {\n const freshAnchor = getFreshAnchor() || initialAnchor;\n \n if (isGuidelineMode) {\n setTimeout(() => alignStraightLines(actionId), 150);\n } else {\n if (freshAnchor) {\n const rect = freshAnchor.getBoundingClientRect();\n if (rect.top > window.innerHeight * 0.8 || rect.top < 100) {\n const offsetToCenter = rect.top - (window.innerHeight / 2);\n \n if (maintainRelativeOrder) {\n leftContainerRef.current?.scrollBy({ top: offsetToCenter, behavior: \"smooth\" });\n rightContainerRef.current?.scrollBy({ top: offsetToCenter, behavior: \"smooth\" });\n } else {\n scrollContainerRef.current?.scrollBy({ top: offsetToCenter, behavior: \"smooth\" });\n }\n }\n }\n }\n\n setSummaryPopup({\n open: true,\n anchorEl: freshAnchor,\n summary,\n displayImpact,\n });\n },\n });\n }, 350);\n },\n [\n activateSideBySide, \n closeCognitivePopup, \n setSummaryPopup, \n resetSideBySide, \n forceExpandCrossWiredSections, \n isGuidelineMode, \n maintainRelativeOrder,\n alignStraightLines,\n stableDeviationData\n ],\n );\n\n const deviationTargetParentId = useMemo(() => {\n if (!deviationNodeIdToView) return null;\n const targetNodeId = deviationNodeIdToView?.id?.split(\":\")[0];\n for (const nodeId in parentDeviationRecord) {\n const entries = parentDeviationRecord[nodeId] || [];\n if (entries.some((entry: any) => entry.id === targetNodeId)) {\n return nodeId;\n }\n }\n return null;\n }, [deviationNodeIdToView, parentDeviationRecord]);\n const lastDeviationTriggerRef = useRef<{\n id: string | null;\n triggerMs: number | null;\n }>({ id: null, triggerMs: null });\n const clearedForDeviationId = useRef<string | null>(null);\n\n useEffect(() => {\n if (!deviationNodeIdToView?.id) return;\n\n const triggerMs = Number(deviationNodeIdToView.trigger);\n const lastTrigger = lastDeviationTriggerRef.current;\n if (\n lastTrigger?.id === deviationNodeIdToView.id &&\n lastTrigger?.triggerMs === triggerMs\n ) return;\n\n const hasDeviationKeySuffix =\n deviationNodeIdToView.id.includes(\":\") &&\n /:\\d+$/.test(deviationNodeIdToView.id);\n\n if (!hasDeviationKeySuffix) {\n lastDeviationTriggerRef.current = { id: deviationNodeIdToView.id, triggerMs };\n scrollToClauseAndHighlightClause(deviationNodeIdToView.id);\n\n const leftSectionIdx = proposedSections.findIndex((s: any) => s.id === deviationNodeIdToView.id);\n const rightSectionIdx = existingSections.findIndex((s: any) => s.id === deviationNodeIdToView.id);\n\n if (leftSectionIdx !== -1 || rightSectionIdx !== -1) {\n setTimeout(() => {\n const targetIdx = leftSectionIdx !== -1 ? leftSectionIdx : rightSectionIdx;\n const isOrphan = leftSectionIdx === -1;\n\n // ── NEW C2G LOGIC FOR ROOT NODES ──\n if (isGuidelineMode) {\n setGuidelinesTab(getGuidelineTabFromId(targetIdx));\n }\n setConnectedSections(new Set([targetIdx]));\n\n activateSideBySideRef.current(targetIdx, isOrphan, {\n sourceSide: isOrphan ? \"right\" : \"left\",\n onReady: () => {\n if (isGuidelineMode) {\n setTimeout(() => alignStraightLines(String(targetIdx)), 150);\n }\n }\n });\n }, 400);\n }\n return;\n }\n\n const [targetNodeId, requestedDeviationKeyRaw] = deviationNodeIdToView.id.split(\":\");\n const requestedDeviationKey = requestedDeviationKeyRaw ?? \"0\";\n\n const requestKey = `${deviationNodeIdToView.id}:${triggerMs}`;\n if (clearedForDeviationId.current !== requestKey) {\n closeSummaryPopup();\n closeCognitivePopup();\n resetSideBySide();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n clearedForDeviationId.current = requestKey;\n }\n\n let cancelled = false;\n let attempts = 0;\n const maxAttempts = 30;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let layoutWatcherCleanup: (() => void) | null = null;\n let expansionDone = false;\n const waitForStableLayout = (\n getElement: () => HTMLElement | null | undefined,\n onStable: () => void\n ): (() => void) => {\n let stableFrames = 0;\n let lastTop: number | null = null;\n let lastHeight: number | null = null;\n let rafId: number;\n const startedAt = performance.now();\n\n const check = () => {\n if (cancelled) return;\n\n if (performance.now() - startedAt > 3000) {\n onStable();\n return;\n }\n\n const el = getElement();\n if (!el || el.getBoundingClientRect().height === 0) {\n rafId = requestAnimationFrame(check);\n return;\n }\n\n const rect = el.getBoundingClientRect();\n\n const top = rect.top;\n const height = rect.height;\n\n const topStable =\n lastTop !== null && Math.abs(top - lastTop) < 0.5;\n\n const heightStable =\n lastHeight !== null && Math.abs(height - lastHeight) < 0.5;\n\n if (topStable && heightStable) {\n stableFrames++;\n\n if (stableFrames >= 5) {\n onStable();\n return;\n }\n } else {\n stableFrames = 0;\n }\n\n lastTop = top;\n lastHeight = height;\n\n rafId = requestAnimationFrame(check);\n };\n\n rafId = requestAnimationFrame(check);\n return () => cancelAnimationFrame(rafId);\n };\n\n const findKeyPath = (sections: any[], targetIds: string[]): string | null => {\n const walk = (node: any, path: string): string | null => {\n if (!node) return null;\n if (\n targetIds.includes(node.id) ||\n targetIds.includes(node.nodeId) ||\n targetIds.includes(node.contentId)\n ) return path;\n if (!Array.isArray(node.subsections)) return null;\n for (let i = 0; i < node.subsections.length; i++) {\n const next = walk(node.subsections[i], `${path}-${i}`);\n if (next) return next;\n }\n return null;\n };\n for (let i = 0; i < sections.length; i++) {\n const found = walk(sections[i], String(i));\n if (found) return found;\n }\n return null;\n };\n\n const tryConnect = () => {\n if (cancelled) return;\n\n const markProcessed = () => {\n lastDeviationTriggerRef.current = {\n id: deviationNodeIdToView.id,\n triggerMs,\n };\n };\n\n let targetParentId: string | null = null;\n let targetChild: any = null;\n for (const nodeId in parentDeviationRecord) {\n const child = parentDeviationRecord[nodeId].find(\n (entry: any) =>\n entry.id === targetNodeId ||\n entry.nodeId === targetNodeId ||\n entry.contentId === targetNodeId ||\n entry.evaluationResult?.nodeId === targetNodeId,\n );\n if (child) {\n targetParentId = nodeId;\n targetChild = child;\n break;\n }\n }\n\n if (!targetChild || !targetParentId) {\n attempts++;\n if (attempts < maxAttempts) timer = setTimeout(tryConnect, 100);\n return;\n }\n\n const targetIds = Array.from(new Set([\n targetNodeId,\n targetChild.id,\n targetChild.nodeId,\n targetChild.contentId,\n targetChild.evaluationResult?.nodeId,\n ].filter(Boolean))) as string[];\n\n const lhsNodeIdx = proposedSections.findIndex((section) => section.id === targetParentId);\n const rhsNodeIdx = existingSections.findIndex((section) => section.id === targetParentId);\n\n const isRhsOrphan = lhsNodeIdx === -1 && rhsNodeIdx !== -1;\n\n const leftKeyPath = findKeyPath(proposedSections as any[], targetIds);\n let rightKeyPath = findKeyPath(existingSections as any[], targetIds);\n\n if (leftKeyPath && !rightKeyPath && !isRhsOrphan) {\n const parts = leftKeyPath.split(\"-\");\n let rhsIdx = Number(parts[0]);\n if (maintainRelativeOrder) {\n const rhsSelfIndex = (proposedSections as any[])[rhsIdx]?.refIndexes?.[0];\n const rhsArrayIdx = (existingSections as any[]).findIndex((s: any) => s.selfIndex === rhsSelfIndex);\n if (rhsArrayIdx !== -1) rhsIdx = rhsArrayIdx;\n }\n rightKeyPath = [rhsIdx, ...parts.slice(1)].join(\"-\");\n }\n\n if (!leftKeyPath && !rightKeyPath) {\n attempts++;\n if (attempts < maxAttempts) timer = setTimeout(tryConnect, 100);\n return;\n }\n\n const leftSectionIdx = leftKeyPath ? Number(leftKeyPath.split(\"-\")[0]) : lhsNodeIdx;\n const rightSectionIdx = rightKeyPath ? Number(rightKeyPath.split(\"-\")[0]) : rhsNodeIdx;\n const effectiveRightSectionIdx =\n rightSectionIdx >= 0\n ? rightSectionIdx\n : rightKeyPath ? Number(rightKeyPath.split(\"-\")[0]) : -1;\n\n const leftSec: any = (proposedSections as any[])[leftSectionIdx];\n const rightSec: any = (existingSections as any[])[effectiveRightSectionIdx];\n const isLeftEmpty = leftSec && !leftSec.title && !leftSec.content;\n const isRightEmpty = rightSec && !rightSec.title && !rightSec.content;\n\n const isTargetRhsOnly = (!leftKeyPath && !!rightKeyPath) || (isLeftEmpty && !isRightEmpty);\n const shouldNavigateRight = isRhsOrphan || isTargetRhsOnly;\n\n if (shouldNavigateRight) {\n const isExpanded = maintainRelativeOrder\n ? !!expandedSectionsRef.current[`right-${rightSectionIdx}`]\n : !!expandedSectionsRef.current[String(rightSectionIdx)];\n if (!isExpanded && rightSectionIdx >= 0) {\n toggleSection(rightSectionIdx, \"right\");\n timer = setTimeout(tryConnect, 200);\n return;\n }\n } else {\n const isExpanded = maintainRelativeOrder\n ? !!expandedSectionsRef.current[`left-${leftSectionIdx}`]\n : !!expandedSectionsRef.current[String(leftSectionIdx)];\n if (!isExpanded && leftSectionIdx >= 0) {\n toggleSection(leftSectionIdx, \"left\");\n timer = setTimeout(tryConnect, 200);\n return;\n }\n }\n \n const safeLeftPath = leftKeyPath || \"\";\n const safeRightPath = rightKeyPath || \"\";\n const refIdCandidates = targetIds.map(\n (id) => `${id}${DEVIATION_BADGE_SEPARATOR}${requestedDeviationKey}`,\n );\n const fallbackRefId = refIdCandidates[0];\n const getMountedBadges = () => {\n for (const candidateRefId of refIdCandidates) {\n const left = lhsBadgeRefs.current[candidateRefId]?.current || null;\n const right = rhsBadgeRefs.current[candidateRefId]?.current || null;\n if (left || right) return { refId: candidateRefId, left, right };\n }\n return { refId: fallbackRefId, left: null, right: null };\n };\n const buildActionId = (refId: string) =>\n `${refId}${DEVIATION_BADGE_SEPARATOR}${safeLeftPath}${DEVIATION_BADGE_SEPARATOR}${safeRightPath}`;\n \n if (!expansionDone) {\n forceExpandCrossWiredSections(buildActionId(fallbackRefId));\n expansionDone = true;\n attempts = 0;\n const getTargetElement = (): HTMLElement | null => {\n const { left: leftEl, right: rightEl } = getMountedBadges();\n const useRight = shouldNavigateRight || (!leftEl && !!rightEl);\n return (useRight ? rightEl : leftEl) as HTMLElement | null;\n };\n\n layoutWatcherCleanup?.();\n\n timer = setTimeout(() => {\n if (cancelled) return;\n layoutWatcherCleanup = waitForStableLayout(getTargetElement, () => {\n if (cancelled) return;\n layoutWatcherCleanup = null;\n tryConnect();\n });\n }, 300);\n\n return;\n }\n\n const {\n refId,\n left: leftElement,\n right: rightElement,\n } = getMountedBadges();\n const actionId = buildActionId(refId);\n\n // If refs still aren't attached, keep retrying\n if (!leftElement && !rightElement) {\n attempts++;\n if (attempts < maxAttempts) timer = setTimeout(tryConnect, 100);\n return;\n }\n\n const useRightTarget = shouldNavigateRight || (!leftElement && !!rightElement);\n const targetElement = useRightTarget ? rightElement : leftElement;\n\n const scrollContainer: HTMLElement | null = maintainRelativeOrder\n ? (useRightTarget ? rightContainerRef.current : leftContainerRef.current)\n : scrollContainerRef.current;\n\n if (!targetElement || !scrollContainer) {\n attempts++;\n if (attempts < maxAttempts) timer = setTimeout(tryConnect, 100);\n return;\n }\n\n const elementRect = targetElement.getBoundingClientRect();\n\n if (elementRect.height === 0) {\n attempts++;\n if (attempts < maxAttempts) timer = setTimeout(tryConnect, 100);\n return;\n }\n\n const containerRect = scrollContainer.getBoundingClientRect();\n \n const targetTop = \n elementRect.top - \n containerRect.top + \n scrollContainer.scrollTop - \n (containerRect.height / 2) + \n (elementRect.height / 2);\n\n const isTargetSub = (leftKeyPath?.includes(\"-\")) || (rightKeyPath?.includes(\"-\"));\n \n const onScrollComplete = async() => {\n if (cancelled) return;\n markProcessed();\n\n const boxShadowColor = targetElement instanceof Element\n ? window.getComputedStyle(targetElement).color\n : \"\";\n [leftElement, rightElement].forEach((el) => {\n if (!el) return;\n el.style.transition = \"box-shadow 300ms ease-in-out\";\n el.style.boxShadow = `0 0 10px ${boxShadowColor}`;\n });\n setTimeout(() => {\n [leftElement, rightElement].forEach((el) => {\n if (el) el.style.boxShadow = \"\";\n });\n }, 2000);\n\n const deviationMap = targetChild.evaluationResult?.deviations?.[requestedDeviationKey] || targetChild;\n const evalOutputs = targetChild.evaluationResult?.evaluation_outputs || targetChild.evaluation_outputs;\n const hasBothCounterparts = !!leftElement && !!rightElement;\n\n if (!hasBothCounterparts && !isGuidelineMode) {\n const freshElement = useRightTarget\n ? (rhsBadgeRefs.current[isTargetSub ? refId : (rightSectionIdx as any)]?.current || rightElement)\n : (lhsBadgeRefs.current[isTargetSub ? refId : (leftSectionIdx as any)]?.current || leftElement);\n\n adjustScrollForPopup(freshElement, () => {\n setSummaryPopup({\n open: true,\n anchorEl: freshElement,\n displayImpact: deviationNodeIdToView.displayImpact,\n summary: {\n ...deviationMap,\n evaluation_outputs: evalOutputs,\n },\n });\n }, { skipScroll: true });\n resetDeviationNodeId?.();\n return;\n }\n // Wait for any in-progress scroll to idle before activating side-by-side\n const waitWithTimeout = (p: Promise<void>, ms: number) => Promise.race([p, new Promise<void>((res) => setTimeout(res, ms))]);\n if (maintainRelativeOrder) {\n await Promise.all([\n leftContainerRef.current\n ? waitWithTimeout(waitForScrollIdle(leftContainerRef.current), 600)\n : Promise.resolve(),\n rightContainerRef.current\n ? waitWithTimeout(waitForScrollIdle(rightContainerRef.current), 600)\n : Promise.resolve(),\n ]);\n }\n\n // ── NEW C2G LOGIC: Set tab and connection for sub-nodes ──\n if (isGuidelineMode) {\n setGuidelinesTab(getGuidelineTabFromId(actionId));\n setConnectedSections(new Set([actionId]));\n }\n\n activateSideBySideRef.current(actionId, false, {\n toggleIfSame: false,\n sourceSide: isRhsOrphan ? \"right\" : \"left\", \n onReady: () => {\n markProcessed();\n const freshElement = useRightTarget\n ? (rhsBadgeRefs.current[refId]?.current || rightElement)\n : (lhsBadgeRefs.current[refId]?.current || leftElement);\n\n // ── NEW C2G LOGIC: Straight Line Math ──\n if (isGuidelineMode) {\n setTimeout(() => alignStraightLines(actionId), 150);\n } else {\n const freshLeft = lhsBadgeRefs.current[refId]?.current || leftElement;\n const freshRight = rhsBadgeRefs.current[refId]?.current || rightElement;\n\n if (freshLeft) {\n freshLeft.style.scrollMarginTop = '150px';\n freshLeft.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n if (freshRight) {\n freshRight.style.scrollMarginTop = '150px';\n freshRight.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }\n\n setSummaryPopup({\n open: true,\n anchorEl: freshElement,\n displayImpact: deviationNodeIdToView.displayImpact,\n summary: { ...deviationMap },\n });\n\n resetDeviationNodeId?.();\n },\n });\n };\n\n if (Math.abs(scrollContainer.scrollTop - targetTop) <= 2) {\n onScrollComplete();\n } else {\n // // --- USE REF TO TRACK NATIVE SCROLL COMPLETION ---\n // pendingScrollTargetRef.current = targetTop;\n // pendingScrollCallbackRef.current = onScrollComplete;\n\n // scrollContainer.scrollTo({ top: targetTop, behavior: \"smooth\" });\n\n // // Failsafe timer (800ms) just in case native scroll misses the exact 2px boundary\n // if (timer) clearTimeout(timer);\n // timer = setTimeout(() => {\n // if (pendingScrollCallbackRef.current) {\n // pendingScrollTargetRef.current = null;\n // const cb = pendingScrollCallbackRef.current;\n // pendingScrollCallbackRef.current = null;\n // cb();\n // }\n // }, 800);\n // }\n scrollAndWait(scrollContainer, targetTop, onScrollComplete);\n }\n };\n\n timer = setTimeout(tryConnect, 100);\n\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n layoutWatcherCleanup?.();\n };\n }, [\n deviationNodeIdToView?.id,\n deviationNodeIdToView?.trigger,\n deviationNodeIdToView?.displayImpact,\n parentDeviationRecord,\n proposedSections,\n existingSections,\n maintainRelativeOrder,\n setSummaryPopup,\n scrollToClauseAndHighlightClause,\n isGuidelineMode, // Added explicitly to fix exhaustive-deps\n getGuidelineTabFromId, // Added explicitly\n alignStraightLines // Added explicitly\n ]);\n\n useEffect(() => {\n if (!summaryPopup.open) return;\n const anchor = summaryPopup.anchorEl;\n if (!anchor) return;\n if (anchor.isConnected) return;\n\n // Anchor is detached — find the fresh DOM node by data attribute\n const findRefIdByContent = (refs:DivRefMap) => {\n for (const [key, ref] of Object.entries(refs)) {\n if (ref.current?.textContent === anchor.textContent) return key;\n }\n return null;\n };\n const refId = anchor.dataset?.deviationRefId || findRefIdByContent(lhsBadgeRefs.current) || findRefIdByContent(rhsBadgeRefs.current);\n // Optimization done above using map\n // const refId =\n // anchor.dataset?.deviationRefId ||\n // // fallback: scan both ref maps for a live node matching this anchor's text content\n // Object.keys(lhsBadgeRefs.current).find(\n // key => lhsBadgeRefs.current[key]?.current?.textContent === anchor.textContent\n // )\n // || Object.keys(rhsBadgeRefs.current).find(\n // key => rhsBadgeRefs.current[key]?.current?.textContent === anchor.textContent\n // );\n \n if (!refId) return;\n\n const freshAnchor =\n rhsBadgeRefs.current[refId]?.current ||\n lhsBadgeRefs.current[refId]?.current;\n\n if (!freshAnchor || !freshAnchor.isConnected) return;\n\n setSummaryPopup(prev => ({ ...prev, anchorEl: freshAnchor }));\n}, [\n summaryPopup.open,\n summaryPopup.anchorEl,\n scrollSyncLocked,\n connectedSections,\n expandedSections,\n]);\n\n const {\n open: cognitivePopupOpen,\n sectionIdx: cognitivePopupSectionIdx,\n isOrphan: cognitivePopupIsOrphan,\n badgeStyle: cognitivePopupBadgeStyle,\n anchorEl: cognitivePopupAnchorEl,\n sectionAnchorEl: cognitivePopupSectionAnchorEl,\n } = cognitivePopup;\n\n useEffect(() => {\n if(!displayConfig.isStreamingEnabled) return\n if (!cognitivePopupOpen || cognitivePopupSectionIdx == null) return;\n if (cognitivePopupSectionIdx === rootDeviationId) return;\n\n const sectionId =\n typeof cognitivePopupSectionIdx === \"string\"\n ? cognitivePopupSectionIdx.split(DEVIATION_BADGE_SEPARATOR)[0]\n : null;\n\n const findNodeRecursively = (sections: any[], targetId: string): any => {\n if (!sections || !Array.isArray(sections)) return null;\n for (const sec of sections) {\n if (sec.id === targetId) return sec;\n if (sec.subsections?.length) {\n const found = findNodeRecursively(sec.subsections, targetId);\n if (found) return found;\n }\n }\n return null;\n };\n\n const baseSecById =\n sectionId && typeof sectionId === \"string\"\n ? findNodeRecursively(proposedSections, sectionId)\n : null;\n\n const refSecById =\n sectionId && typeof sectionId === \"string\"\n ? findNodeRecursively(existingSections, sectionId)\n : null;\n\n const baseSec =\n typeof cognitivePopupSectionIdx === \"number\"\n ? proposedSections[cognitivePopupSectionIdx] || null\n : baseSecById ||\n (sectionId\n ? (treeData?.nodes?.[sectionId] as SectionBlock) ||\n (treeData?.[sectionId] as SectionBlock) ||\n null\n : null);\n\n const refSec =\n typeof cognitivePopupSectionIdx === \"number\"\n ? existingSections[cognitivePopupSectionIdx] || null\n : refSecById;\n\n const refreshedPopup = buildSectionPopupState(\n cognitivePopupAnchorEl,\n baseSec,\n refSec,\n cognitivePopupSectionIdx,\n cognitivePopupIsOrphan,\n cognitivePopupBadgeStyle,\n );\n\n setCognitivePopup((prev) => {\n if (!prev.open) return prev;\n \n const isSame =\n safeStringify(prev.cognitiveData) === safeStringify(refreshedPopup.cognitiveData) &&\n safeStringify(prev.deviationData) === safeStringify(refreshedPopup.deviationData) &&\n prev.sectionTitle === refreshedPopup.sectionTitle &&\n prev.refSectionTitle === refreshedPopup.refSectionTitle;\n \n if (isSame) return prev;\n\n return {\n ...prev,\n ...refreshedPopup,\n open: true,\n anchorEl: prev.anchorEl,\n sectionAnchorEl: prev.sectionAnchorEl,\n };\n });\n }, [\n cognitivePopupOpen,\n cognitivePopupSectionIdx,\n cognitivePopupIsOrphan,\n cognitivePopupBadgeStyle,\n cognitivePopupAnchorEl,\n cognitivePopupSectionAnchorEl,\n proposedSections,\n existingSections,\n buildSectionPopupState,\n ]);\n\n const renderSubSectionAccordion = useCallback(\n ({\n section,\n keyPath,\n depth = 0,\n columnKey = \"left\",\n parentNodeId = \"\",\n sectionOffset,\n rhsOrphanVisualIndexes,\n }: {\n section: SectionBlock;\n keyPath: string;\n depth?: number;\n columnKey?: \"left\" | \"right\";\n parentNodeId?: string;\n sectionOffset?: number;\n rhsOrphanVisualIndexes?: ReadonlyMap<string, number>;\n }): React.ReactNode => {\n return (\n <SubSectionAccordion\n section={section}\n keyPath={keyPath}\n depth={depth}\n columnKey={columnKey}\n parentNodeId={parentNodeId}\n sectionOffset={sectionOffset}\n rhsOrphanVisualIndexes={rhsOrphanVisualIndexes}\n />\n );\n },\n []);\n\n const leftRows = useMemo(() => {\n return proposedSections.map((section, idx) => {\n const isEmpty = !section?.title && !section?.content;\n const isOrphan = !section?.refIndexes || section.refIndexes.length === 0;\n if (isEmpty && isOrphan && maintainRelativeOrder) return null;\n\n return (\n <LHSSectionRow\n key={section?.layoutKey ?? section?.id ?? `left-row-${idx}`}\n section={section}\n idx={idx}\n />\n );\n });\n }, [proposedSections, maintainRelativeOrder]);\n\n const rightRows = useMemo(() => {\n return existingSections.map((section, idx) => {\n const isEmpty = !section?.title && !section?.content;\n const isOrphan = !section?.refIndexes || section.refIndexes.length === 0;\n if (isEmpty && isOrphan && maintainRelativeOrder) return null;\n\n return (\n <RHSSectionRow\n key={section?.layoutKey ?? section?.id ?? `right-row-${idx}`}\n section={section}\n idx={idx}\n />\n );\n });\n }, [existingSections, maintainRelativeOrder]);\n // Callback refs in order to keep them always open even when deviation data is getting streamed\n // These change identity often but children only ever call them — they don't\n // need to cause context consumers to re-render when they change.\n const openMoreFunctionsPopupRef = useRef(openMoreFunctionsPopup);\n useEffect(() => { openMoreFunctionsPopupRef.current = openMoreFunctionsPopup; }, [openMoreFunctionsPopup]);\n\n const expandedSectionsRef = useRef(expandedSections);\n useEffect(() => {\n expandedSectionsRef.current = expandedSections;\n }, [expandedSections]);\n\n const handleOpenSummaryPopupRef = useRef(handleOpenSummaryPopup);\n useEffect(() => { handleOpenSummaryPopupRef.current = handleOpenSummaryPopup; }, [handleOpenSummaryPopup]);\n\n const handleCloseSummaryPopupRef = useRef(handleCloseSummaryPopup);\n useEffect(() => { handleCloseSummaryPopupRef.current = handleCloseSummaryPopup; }, [handleCloseSummaryPopup]);\n\n const toggleSectionRef = useRef(toggleSection);\n useEffect(() => { toggleSectionRef.current = toggleSection; }, [toggleSection]);\n\n const handleSubSectionToggleRef = useRef(handleSubSectionToggle);\n useEffect(() => { handleSubSectionToggleRef.current = handleSubSectionToggle; }, [handleSubSectionToggle]);\n\n const renderSubSectionAccordionRef = useRef(renderSubSectionAccordion);\n useEffect(() => { renderSubSectionAccordionRef.current = renderSubSectionAccordion; }, [renderSubSectionAccordion]);\n\n const resetSideBySideContextRef = useRef(resetSideBySide);\n useEffect(() => { resetSideBySideContextRef.current = resetSideBySide; }, [resetSideBySide]);\n \n // ── NEW: Added isGuidelineMode to Context ──\n const compareContextValue = useMemo(() => ({\n isGuidelineMode, \n maintainRelativeOrder: !!maintainRelativeOrder,\n showDeviationBadges: shouldShowDeviationBadges,\n isProposingFix,\n proposingFixNodeId,\n isRedlineFlow,\n isSideBySide,\n activeSideBySideSection,\n scrollSyncLocked,\n toggleScrollSyncLocked,\n summaryPopupAnchorEl: summaryPopup.anchorEl,\n connectedSections,\n proposedSections,\n existingSections,\n deviationNumberRegistry,\n deviationParentRegistry,\n treeData,\n displayConfig,\n deviationAnalysisStatus: effectiveDeviationAnalysisStatus,\n resolvedMarkdownStyles,\n unifiedNumbering,\n expandedSections,\n expandedSubSections,\n setExpandedSubSections,\n getSectionCompareStyle,\n getSubSectionCompareStyle,\n getBadgeRef,\n getSectionRowRef,\n getSubSectionRef,\n sectionLeftRefs,\n sectionRightRefs,\n sectionRowRefs,\n sectionRightRowRefs,\n subSectionLeftRefs,\n subSectionRightRefs,\n lhsBadgeRefs,\n rhsBadgeRefs,\n // Stable refs to always keep them open even when deviation data is getting streamed\n openMoreFunctionsPopup: openMoreFunctionsPopupStable,\n handleOpenSummaryPopup: handleOpenSummaryPopupStable,\n openSummaryPopup: handleOpenSummaryPopupStable,\n handleCloseSummaryPopup: handleCloseSummaryPopupStable,\n toggleSection: toggleSectionStable,\n handleSubSectionToggle: handleSubSectionToggleStable,\n renderSubSectionAccordion: renderSubSectionAccordionStable,\n resetSideBySide: resetSideBySideStable,\n\n setConnectedSections,\n setConnectedLines,\n cachedConnectedPositions,\n showDeviationNavigation,\n showOpenNodeRef,\n deviationNodeIdToView: deviationNodeIdToView?.id,\n deviationTargetParentId,\n guidelinesData,\n gptWebCitationConfig\n}), [\n isGuidelineMode, // ── NEW ──\n maintainRelativeOrder,\n shouldShowDeviationBadges,\n isProposingFix,\n proposingFixNodeId,\n isRedlineFlow,\n isSideBySide,\n activeSideBySideSection,\n scrollSyncLocked,\n toggleScrollSyncLocked,\n summaryPopup.anchorEl,\n connectedSections,\n proposedSections,\n existingSections,\n deviationNumberRegistry,\n displayConfig,\n effectiveDeviationAnalysisStatus,\n resolvedMarkdownStyles,\n unifiedNumbering,\n expandedSections,\n expandedSubSections,\n setExpandedSubSections,\n getSectionCompareStyle,\n getSubSectionCompareStyle,\n getBadgeRef,\n getSectionRowRef,\n getSubSectionRef,\n // NOTE: all the volatile callbacks are intentionally REMOVED from deps.\n // They are accessed via refs (openMoreFunctionsPopupRef etc.) so changing\n // them does not invalidate the context value or re-render consumers.\n showDeviationNavigation,\n showOpenNodeRef,\n deviationNodeIdToView,\n deviationTargetParentId,\n guidelinesData,\n gptWebCitationConfig\n ]);\n\n const cognitivePopupLeftTitle = safeStringify(\n cognitivePopup.sectionTitle || leftTitleTrimmed || leftColumnTitle,\n );\n const cognitivePopupRightTitle = safeStringify(\n isGuidelineMode\n ? rightTitleTrimmed || rightColumnTitle || cognitivePopup.refSectionTitle\n : cognitivePopup.refSectionTitle || rightTitleTrimmed || rightColumnTitle,\n );\n\n return (\n <CompareContextProvider value={compareContextValue}>\n <Box\n ref={ruleComponentRef}\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n bgcolor: \"#F6F7F9B2\",\n fontFamily: '\"Plus Jakarta Sans\", sans-serif',\n overflow: \"visible\", // ← always visible, was conditional on !maintainRelativeOrder\n position: \"relative\",\n }}\n >\n {isToggling && (\n <Box\n sx={{\n position: \"absolute\",\n inset: 0,\n bgcolor: \"rgba(255, 255, 255, 0.6)\",\n backdropFilter: \"blur(10px)\",\n zIndex: 9999,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"8px\",\n }}\n >\n <BouncingDotsLoader />\n </Box>\n )}\n {summaryPopup.open && (\n <CognitiveSummaryPopup\n open={summaryPopup.open}\n anchorEl={summaryPopup.anchorEl}\n containerEl={summaryGapRef.current}\n clipTopEl={leftHeaderRef.current}\n scrollContainerEl={scrollContainerRef.current}\n onClose={handleCloseSummaryPopup}\n summary={summaryPopup.summary}\n displayImpact={summaryPopup.displayImpact}\n isScrollLocked={scrollSyncLocked}\n />\n )}\n {\n <MoreFunctionsPopup\n open={moreFunctions.open}\n anchorEl={moreFunctions.anchorEl}\n maintainRelativeOrder={!!maintainRelativeOrder}\n sectionTitle={moreFunctions.sectionTitle}\n referenceSectionTitle={moreFunctions.refSectionTitle}\n onClose={closeMoreFunctionsPopup}\n onOpenCognitiveCompare={handleOpenCognitiveCompare}\n onOpenSideBySide={handleOpenSideBySide}\n onConnect={handleConnect}\n isConnected={isCurrentSectionConnected}\n isOrphan={isGuidelineMode ? false : !!moreFunctions.isOrphan} \n isGuidelineMode={isGuidelineMode}\n hasGuidelineMatches={moreFunctions.hasGuidelineMatches}\n />\n }\n\n {cognitivePopup.open && (\n <CognitivePopup\n open={cognitivePopup.open}\n popupRef={popupRef}\n position={position}\n popupConfig={popupConfig}\n onClose={() => {\n setPosition(null);\n setCognitivePopup((p) => ({ ...p, open: false }));\n setActiveBadgeId(null);\n }}\n markdownStyles={markdownStyles}\n sectionTitle={cognitivePopupLeftTitle}\n referenceSectionTitle={cognitivePopupRightTitle}\n cognitiveData={cognitivePopup.cognitiveData}\n anchorEl={cognitivePopup.anchorEl}\n sectionAnchorEl={cognitivePopup.sectionAnchorEl}\n scrollContainerEl={scrollContainerRef.current}\n badgeStyle={cognitivePopup.badgeStyle}\n docData={cognitivePopup.docData}\n deviationData={cognitivePopup.deviationData}\n isLoading={cognitivePopup.isLoading}\n />\n )}\n\n <Snackbar\n open={!!errorToast}\n autoHideDuration={8000}\n onClose={() => setErrorToast(null)}\n anchorOrigin={{ vertical: \"top\", horizontal: \"center\" }}\n >\n <Alert\n onClose={() => setErrorToast(null)}\n severity=\"error\"\n sx={{ width: \"100%\", whiteSpace: \"pre-line\" }}\n >\n {errorToast}\n </Alert>\n </Snackbar>\n\n <CompareHeader\n componentHeaderText={componentHeaderText}\n displayConfig={displayConfig}\n maintainRelativeOrder={maintainRelativeOrder}\n onCollapseAll={handleCollapseAll}\n showCollapseAll={isAnySectionExpanded}\n onToggleView={(isDefaultView) => {\n setIsToggling(true);\n \n setTimeout(() => {\n setMaintainRelativeOrder(!isDefaultView);\n onMaintainRelativeOrderChange?.(!isDefaultView);\n setScrollSyncLocked(false);\n resetSideBySide();\n closeSummaryPopup();\n setConnectedSections(new Set());\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n setIsToggling(false);\n }, 600);\n });\n });\n }, 50);\n }}\n />\n\n {/* ── Main scrollable content ── */}\n <Box\n ref={scrollContainerRef}\n onScroll={handleColumnScroll}\n sx={{\n flex: 1,\n minHeight: 0,\n pt: 1.5,\n pb: 1,\n px: 3,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n bgcolor: \"#FFFFFF\",\n overflowY: maintainRelativeOrder ? \"visible\" : \"auto\", // ← \"visible\" not \"hidden\"\n borderTop: overallSummaryRaw && hasReasoning ? \"none\" : \"1.5px solid #EEF0F4\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n maxWidth: \"1200px\",\n ...(maintainRelativeOrder ? { flex: 1 } : {}), \n }}\n >\n <Box\n ref={containerRef}\n sx={{\n display: \"grid\",\n gridTemplateColumns: \"minmax(0, 1fr) 180px minmax(0, 1fr)\",\n // NOTE: WHILE INCREASING OR REDUCING THIS WIDTH CHANGE THE PADDING LEFT AND MARGIN OF THE BOX with rightContainerRef TO ENSURE MORE FUNCTIONS POPUP BUTTON IS VISIBLE IN THE VIEW TO CLICK\n // Increased gap for Cognitive AI Summary Popup\n gap: \"100px\",\n maxWidth: \"1200px\",\n width: \"100%\",\n position: \"relative\",\n minHeight: 0,\n ...(maintainRelativeOrder ? { flex: 1, overflow: \"visible\" } : {}),\n }}\n >\n {/* ── SVG connector lines & deviation badges ── */}\n <SvgConnectors\n svgContainerRef={svgContainerRef}\n svgDimensions={svgDimensions}\n isResizing={isResizing}\n overallConnector={overallConnector}\n rootDeviationStyle={rootDeviationStyle}\n lines={lines}\n isSideBySide={isSideBySide}\n activeSideBySideSection={activeSideBySideSection}\n isArrowVisible={isArrowVisible}\n maintainRelativeOrder={maintainRelativeOrder}\n proposedSections={proposedSections}\n existingSections={existingSections}\n cognitivePopup={cognitivePopup}\n activeBadgeId={activeBadgeId}\n closeCognitivePopup={closeCognitivePopup}\n setActiveBadgeId={setActiveBadgeId}\n openCognitivePopupFromState={openCognitivePopupFromState}\n buildSectionPopupState={buildSectionPopupState}\n connectedLines={connectedLines}\n isGuidelineMode={isGuidelineMode}\n deviationAnalysisStatus={effectiveDeviationAnalysisStatus}\n pathRefs={pathRefs}\n />\n\n {/* ── Left Column ── */}\n <Box\n sx={{\n border: \"1px solid #E7E7E9\",\n borderRadius: \"8px\",\n bgcolor: \"#FFFFFF\",\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n zIndex: 2,\n filter: \"drop-shadow(0px 2px 4px #F2F2F2)\",\n ...(maintainRelativeOrder ? { flex: 1, overflow: \"visible\" } : {}),\n }}\n >\n <Box\n ref={leftHeaderRef}\n sx={{\n p: \"8px\",\n bgcolor: \"#F7F8FA\",\n borderBottom: \"1px solid #E7E7E9\",\n borderRadius: \"8px 8px 0 0\",\n display: \"flex\",\n alignItems: \"center\",\n minHeight: \"40px\",\n overflow: \"hidden\",\n minWidth: 0,\n }}\n >\n <Tooltip title={leftColumnTitle} placement=\"top\">\n <Typography\n sx={{\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#19213D\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n width: \"100%\",\n minWidth: 0,\n textAlign: \"center\",\n display: \"block\",\n }}\n >\n {leftColumnTitle}\n </Typography>\n </Tooltip>\n </Box>\n <Box\n ref={leftContainerRef}\n onScroll={handleColumnScroll}\n sx={{\n p: \"12px\",\n display: \"flex\",\n flexDirection: \"column\",\n ...(maintainRelativeOrder\n ? {\n maxHeight: \"calc(100vh - 250px)\",\n flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n minHeight: 0,\n mr: \"-180px\",\n pr: \"192px\",\n \"&::-webkit-scrollbar\": { display: \"none\" },\n scrollbarWidth: \"none\",\n }\n : {}),\n }}\n >\n <div ref={lhsTopSpacerRef} style={{ width: \"100%\", height: \"0px\", flexShrink: 0 }} />\n {hasSectionAccordions && leftRows}\n <div ref={lhsBottomSpacerRef} style={{ width: \"100%\", height: \"0px\", flexShrink: 0 }} />\n </Box>\n </Box>\n\n {/* ── Center Column ── */}\n <Box\n ref={summaryGapRef}\n sx={{\n width: \"180px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n pt: \"15px\",\n gap: 0,\n zIndex: 20,\n pointerEvents: \"none\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n mt: 0,\n }}\n >\n <Box\n onClick={(e) => {\n e.stopPropagation();\n if (cognitivePopup.open && activeBadgeId === rootDeviationId) {\n closeCognitivePopup();\n return;\n }\n setActiveBadgeId(rootDeviationId);\n openCognitivePopupFromState(\n buildSectionPopupState(\n e.currentTarget as HTMLElement,\n {\n title: baseDocName,\n content: \"\",\n evaluationResult: rootEvaluationResult,\n cognitiveData: {\n section_id: \"\",\n decisioning: [],\n gap: [],\n relevance_score: 0,\n isMissingRationale: true,\n },\n } as any,\n null,\n rootDeviationId,\n true,\n { ...rootDeviationStyle, label: \"\" },\n ),\n );\n }}\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"5px\",\n px: 1.5,\n py: \"5px\",\n // DO NOT CHANGE MAINTAINS ALIGNMENT IN DEV\n // IN LOCAL YOU WILL SEE THE ALIGNMENT MISPLACED BUT IN DEV IT IS CORRECT\n top: \"-8px\",\n borderRadius: \"20px\",\n bgcolor: rootDeviationStyle.badgeBg,\n color: rootDeviationStyle.badgeText,\n border: `1px solid ${rootDeviationStyle.badgeBorder}`,\n fontSize: \"12px\",\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n position: \"relative\",\n zIndex: 1,\n pointerEvents: \"auto\",\n cursor: \"pointer\",\n }}\n >\n {shouldShowRootDeviationLoader ? (\n <Tooltip title=\"Deviation data generation in progress\" placement=\"top\" arrow>\n <Box component=\"span\" sx={{ display: \"inline-flex\", alignItems: \"center\" }}>\n <ThreeDotsLoader color={rootDeviationStyle.badgeText} />\n </Box>\n </Tooltip>\n ) : (\n rootDeviationBadgeContent ?? <ThreeDotsLoader color={rootDeviationStyle.badgeText} />\n )}\n <Box\n component=\"span\"\n sx={{\n width: 14,\n height: 14,\n display: \"flex\",\n alignItems: \"center\",\n \"& svg\": { width: \"14px\", height: \"14px\" },\n }}\n >\n <ButtonCognitiveIcon />\n </Box>\n <ChevronDown\n size={11}\n style={{\n transform:\n cognitivePopup.open && activeBadgeId === rootDeviationId\n ? \"rotate(180deg)\"\n : \"rotate(0deg)\",\n transition: \"transform 0.25s ease\",\n }}\n />\n </Box>\n </Box>\n </Box>\n\n {/* ── Right Column ── */}\n <Box\n sx={{\n border: \"1px solid #E3E6EA\",\n borderRadius: \"8px\",\n bgcolor: \"#FFFFFF\",\n boxShadow: \"0px 1px 4px #F7F4FE\",\n position: \"relative\",\n zIndex: 2,\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n ...(maintainRelativeOrder\n ? { flex: 1, overflow: \"visible\", minHeight: 0 }\n : {}),\n }}\n >\n {isSideBySideLoading && <OverlayLoader sections={11} />}\n <Box\n ref={rightHeaderRef}\n // onScroll={handleColumnScroll}\n sx={{\n p: \"8px\",\n bgcolor: isGuidelineMode ? \"#F1F3F5\" : \"#F7F8FA\",\n borderBottom: \"1px solid #D7DCE2\",\n borderRadius: \"8px 8px 0 0\",\n display: \"flex\",\n alignItems: \"center\",\n ...(maintainRelativeOrder\n ? {\n maxHeight: \"calc(100vh - 250px)\",\n // flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n minHeight: 0,\n // ml: \"-150px\",\n // pl: \"165px\",\n // ── NEW: Conditionally show scrollbar for Guidelines ──\n ...(isGuidelineMode \n ? {\n \"&::-webkit-scrollbar\": { width: \"6px\", display: \"block\" },\n \"&::-webkit-scrollbar-track\": { background: \"transparent\" },\n \"&::-webkit-scrollbar-thumb\": { background: \"#CBD5E1\", borderRadius: \"10px\" },\n \"&::-webkit-scrollbar-thumb:hover\": { background: \"#94A3B8\" },\n scrollbarWidth: \"thin\",\n scrollbarColor: \"#CBD5E1 transparent\",\n }\n : {\n \"&::-webkit-scrollbar\": { display: \"none\" },\n scrollbarWidth: \"none\",\n }),\n }\n : {}),\n }}\n >\n {isGuidelineMode ? (\n <Tabs\n value={guidelinesTab}\n onChange={(_, value) => setGuidelinesTab(value)}\n variant=\"fullWidth\"\n TabIndicatorProps={{ sx: { display: \"none\" } }}\n sx={{\n width: \"100%\",\n minHeight: \"36px\",\n \"& .MuiTab-root\": {\n minHeight: \"36px\",\n // mx: 1,\n px: 1,\n py: 0,\n borderRadius: \"8px\",\n fontSize: \"14px\",\n lineHeight: 1,\n fontWeight: 500,\n textTransform: \"none\",\n color: \"#374151\",\n minWidth: 0,\n transition: \"background-color 160ms ease, box-shadow 160ms ease\",\n },\n \"& .Mui-selected\": {\n color: \"#374151\",\n bgcolor: \"#FFFFFF\",\n // boxShadow: \"0 2px 8px rgba(15, 23, 42, 0.18)\",\n },\n }}\n >\n <Tab\n label={\n <Tooltip title={rightColumnTitle} placement=\"top\">\n <Box\n component=\"span\"\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"block\",\n width: \"100%\",\n }}\n >\n Redline Guidelines\n </Box>\n </Tooltip>\n }\n />\n {/* webGptPanel */}\n <Tab label={\n <Tooltip title={'Web & GPT Sources'} placement=\"top\">\n <Box\n component=\"span\"\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"block\",\n width: \"100%\",\n }}\n >\n Web & GPT Sources\n </Box>\n </Tooltip>\n } />\n </Tabs>\n ) : (\n <Tooltip title={rightColumnTitle} placement=\"top\">\n <Typography\n sx={{\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#5928ED\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n width: \"100%\",\n minWidth: 0,\n textAlign: \"center\",\n display: \"block\",\n }}\n >\n {rightColumnTitle}\n </Typography>\n </Tooltip>\n )}\n </Box>\n <Box\n ref={rightContainerRef}\n onScroll={handleColumnScroll}\n sx={{\n p: isGuidelineMode ? \"0px\" : \"12px\",\n display: \"flex\",\n flexDirection: \"column\",\n ...(maintainRelativeOrder\n ? {\n maxHeight: \"calc(100vh - 250px)\",\n ...(!isGuidelineMode && { flex: 1 }),\n overflowY: \"auto\",\n overflowX: \"hidden\",\n minHeight: 0,\n // CHANGE THESE TWO VALUES WHEN INCREASING OR DECREASING THE GAP OF BOTH THE COLUMNS\n ml: \"-150px\",\n pl: \"165px\",\n \"&::-webkit-scrollbar\": { display: \"none\" },\n scrollbarWidth: \"none\",\n }\n : {}),\n }}\n >\n <div\n ref={rhsTopSpacerRef}\n style={{ width: \"100%\", height: \"0px\", flexShrink: 0 }}\n />\n \n {/* ── NEW RENDERING LOGIC ── */}\n {isGuidelineMode ? (\n guidelinesTab === 0 ? (\n <GuidelinePanel \n guidelinesData={guidelinesData}\n deviationData={deviationData}\n connectedSections={connectedSections}\n proposedSections={proposedSections} \n />\n ) : (\n <WebGptPanel\n deviationData={deviationData}\n connectedSections={connectedSections}\n proposedSections={proposedSections} \n />\n )\n ) : (\n hasSectionAccordions && rightRows\n )}\n\n <div\n ref={rhsBottomSpacerRef}\n style={{ width: \"100%\", height: \"0px\", flexShrink: 0 }}\n />\n </Box>\n </Box>\n </Box>\n </Box>\n </Box>\n </Box>\n </CompareContextProvider>\n );\n};\n\nexport { SHARED_MARKDOWN_STYLES };\nexport default CognitiveCompare;\n"],"names":["CognitiveCompare","componentHeaderText","DEFAULT_COMPONENT_HEADER_TEXT","treeData","comparisonConfig","leftColumnTitleText","rightColumnTitleText","markdownStyles","resetTrigger","displayConfig","isHeaderVisible","isToggleVisible","maintainRelativeOrder","isLoading","showDeviationBadges","enableDeviationSchemaBackwardCompatibility","displayEmailNotifier","isStreamingEnabled","deviationAnalysisStatus","onMaintainRelativeOrderChange","popupConfig","deviationData","deviationNodeIdToView","resetDeviationNodeId","isProposingFix","proposingFixNodeId","isRedlineFlow","badgeStyleOverride","guidelinesData","gptWebCitationConfig","setMaintainRelativeOrder","useState","expandLevels","shouldExpandAll","expandAllSections","shouldShowDeviationBadges","isToggling","setIsToggling","errorToast","setErrorToast","isDeviationBackwardCompatible","newEvaluationResult","connectedSections","setConnectedSections","Set","connectedLines","setConnectedLines","scrollSyncLocked","setScrollSyncLocked","guidelinesTab","setGuidelinesTab","effectiveDeviationAnalysisStatus","isDeviationGenerationInProgress","svgContainerRef","useRef","containerRef","leftHeaderRef","rightHeaderRef","pendingClauseScrollRef","isAnimatingRef","animationTimerRef","pathRefs","cachedConnectedPositions","calculateLinesRef","resizeTimerRef","handleResizeRef","stableDeviationDataStr","useMemo","JSON","stringify","stableDeviationData","cognitiveMap","cognitive_decisioning","resolvedMarkdownStyles","SHARED_MARKDOWN_STYLES","scrollContainerRef","ruleComponentRef","rightContainerRef","rhsTopSpacerRef","rhsBottomSpacerRef","lhsTopSpacerRef","lhsBottomSpacerRef","leftContainerRef","pendingScrollTargetRef","pendingScrollCallbackRef","cognitivePopup","setCognitivePopup","moreFunctions","setMoreFunctions","position","setPosition","activeBadgeId","summaryPopup","setSummaryPopup","closeSummaryPopup","setActiveBadgeId","popupRef","handleOpenCognitiveCompare","openCognitivePopupFromState","closeCognitivePopup","closeMoreFunctionsPopup","useComparePopups","resolvedComparisonConfig","fields","DEFAULT_FIELD_CONFIG","thresholds","high","DEFAULT_COMPARISON_CONFIG","medium","exact","localHighlightField","setLocalHighlightField","jsonLeftTitle","documents","input_index_map","title","jsonRightTitle","leftColumnTitle","safeStringify","jsonLeftTitleTrimmed","metadata","file_name","leftTitleTrimmed","jsonRightTitleTrimmed","rightTitleTrimmed","rightColumnTitle","isGuidelineMode","activeProposed","existingRule","proposedSections","existingSections","visibleFields","parentDeviationRecord","deviationNumberRegistry","deviationParentRegistry","parseError","useCognitiveTreeData","useEffect","hasSectionAccordions","length","redlineLayoutSignature","count","totalLen","walk","sections","Array","isArray","forEach","section","content","hasMeaningfulRedlineTags","String","subsections","nextSections","nextSubSections","expandAll","side","sec","idx","key","expandSubsRecursively","parentPath","sub","subIdx","subPath","setExpandedSections","setExpandedSubSections","expandToDepth","maxDepth","expandSubsToDepth","currentDepth","leftRefs","rightRefs","sectionLeftRefs","sectionRightRefs","lhsBadgeRefs","rhsBadgeRefs","sectionRightRowRefs","subSectionLeftRefs","subSectionRightRefs","sectionRowRefs","getSectionRowRef","getSubSectionRef","getBadgeRef","useSectionRefs","map","Math","max","isSideBySide","isArrowVisible","setIsSideBySide","setIsArrowVisible","isResizing","setIsResizing","isSideBySideLoading","setIsSideBySideLoading","activeSideBySideSection","setActiveSideBySideSection","scrollLock","sideBySideCacheRef","isSideBySideRef","activeSideBySideRightSectionRef","activeSideBySideSectionRef","sideBySideLineRef","highlightedClauseRefs","clearClauseHighlight","applyAlignmentPadding","resetSideBySide","activateSideBySide","useSideBySide","activateSideBySideRef","current","expandedSections","expandedSubSections","handleSubSectionToggle","toggleSection","forceExpandCrossWiredSections","useAccordionState","alignActiveSections","leftEl","rightEl","rightContainer","leftRect","getBoundingClientRect","rightRect","containerRect","desiredTopInsideContainer","top","delta","scrollBy","behavior","toggleScrollSyncLocked","useCallback","e","stopPropagation","prev","nextLocked","requestAnimationFrame","unifiedNumbering","leftNums","Map","rightNums","counter","id","set","mappedLhs","filter","l","refIndexes","includes","selfIndex","nums","get","Boolean","join","maxLen","i","leftSec","rightSec","analysisData","analysis","overallSummaryRaw","rule_difference_comparison","summary","overall_summary","hasReasoning","match","rootDeviationId","base_root_id","rootEvaluationResult","evaluation_result","nodes","rootDeviationScore","extractDeviationScore","shouldShowRootDeviationLoader","rootDeviationBadgeContent","rootDeviationStyle","generateColorPalette","evaluation_outputs","label_color","DEFAULT_DEVIAION_COLOR","override","badgeBg","bg","badgeText","text","badgeBorder","border","resetSideBySideRef","closeCognitivePopupRef","openMoreFunctionsPopupStable","baseSec","isOrphan","refSec","style","openMoreFunctionsPopupRef","handleOpenSummaryPopupStable","actionId","displayImpact","handleOpenSummaryPopupRef","handleCloseSummaryPopupStable","handleCloseSummaryPopupRef","toggleSectionStable","columnKey","toggleSectionRef","handleSubSectionToggleStable","keyPath","handleSubSectionToggleRef","renderSubSectionAccordionStable","args","renderSubSectionAccordionRef","resetSideBySideStable","resetSideBySideContextRef","resetAll","setLines","setOverallConnector","EMPTY_SUMMARY_POPUP_STATE","resetAllRef","stableDocData","baseDocName","setBaseDocName","treeDataRef","baseId","baseContractName","cognitiveMapRef","buildSectionPopupState","anchorEl","sectionIdx","rootNode","sectionId","cogData","cognitiveData","section_id","decisioning","gap","relevance_score","sectionRowEl","resolvedDeviationData","fallbackEval","evaluationResult","mergeWithFallbackEntry","firstEntry","fromEntries","deviation_entries","firstEntryKey","Object","keys","sort","a","b","Number","numericKeys","k","test","fromDeviations","deviations","firstDeviationKey","getFirstDeviationEntry","deviation_summary","deviation_title","deviation_impact","deviation_explanation","DEVIATION_BADGE_SEPARATOR","devKey","split","deviationEntry","getDeviationDataForBadge","hasDeviationContent","decisioning_factors","gaps_in_decision","globallyLoading","hasGuidelineMatches","devHighlights","deviation_highlights","values","some","highlightArray","open","sectionTitle","refSectionTitle","sectionAnchorEl","badgeStyle","docData","openMoreFunctionsPopup","initialAnchor","currentTarget","sourceSide","contains","handleCloseSummaryPopup","freshAnchor","parts","refId","getFreshAnchor","handleConnect","getGuidelineTabFromId","has","setTimeout","executePendingClauseScroll","nodeId","leftSectionIdx","findIndex","s","rightSectionIdx","leftKeyPath","findKeyPathByNodeId","rightKeyPath","parentLeftIdx","parentRightIdx","resolveEl","sideRefs","subSideRefs","scrollWhenReady","getEl","container","maxAttempts","attempts","tryScroll","el","height","add","scrollAndHighlightClause","scrollToClauseAndHighlightClause","console","warn","next","changed","expandPath","path","executePendingClauseScrollRef","summaryGapRef","cfg","find","f","analysisKey","targetRef","scrollIntoView","block","getFieldData","score","relation","highlightsA","highlightsB","hasContent","field","hasActualContent","highlights","ruleA_spans","ruleB_spans","mappings","mapping","getSectionCompareStyle","getSubSectionCompareStyle","getDeviationStyleByKey","useStyleHelpers","lines","overallConnector","svgDimensions","calculateLines","calculateLinesDebounced","handleColumnScroll","useLinesCalculator","handleCollapseAll","size","isAnySectionExpanded","timerRef","prevRootWidthRef","prevScrollWidthRef","prevContainerWidthRef","handleResize","useResizeHandler","makeWidthObserver","prevWidthRef","rafRef","onWidthChange","onNoChange","width","observer","ResizeObserver","entries","cancelAnimationFrame","entry","newWidth","borderBoxSize","inlineSize","contentRect","abs","observe","rootRafRef","scrollRafRef","containerRafRef","observers","rafRefs","push","o","disconnect","r","identifier","nId","dKey","res","node","parseInt","guideline_flag","rulebook_used","alignStraightLines","targets","document","querySelectorAll","lContainer","rContainer","isSub","lRect","rRect","lContRect","rContRect","lContentY","scrollTop","rContentY","idealLTargetScroll","lTargetScroll","lMaxScrollRaw","scrollHeight","clientHeight","lBottomSpacer","finalScreenY","rTargetScroll","rTopSpacer","rMaxScrollWithTop","rBottomSpacer","scrollTo","handleOpenSideBySide","onReady","isCurrentSectionConnected","showDeviationNavigation","showOpenNodeRef","adjustScrollForPopup","useDeviationNavigation","handleOpenSummaryPopup","summaryText","trim","window","innerHeight","toggleIfSame","rect","offsetToCenter","deviationTargetParentId","targetNodeId","lastDeviationTriggerRef","triggerMs","clearedForDeviationId","trigger","lastTrigger","targetIdx","requestedDeviationKeyRaw","requestedDeviationKey","requestKey","cancelled","timer","layoutWatcherCleanup","expansionDone","findKeyPath","targetIds","contentId","found","tryConnect","markProcessed","targetParentId","targetChild","child","from","lhsNodeIdx","rhsNodeIdx","isRhsOrphan","rhsIdx","rhsSelfIndex","rhsArrayIdx","slice","effectiveRightSectionIdx","isLeftEmpty","isRightEmpty","shouldNavigateRight","expandedSectionsRef","safeLeftPath","safeRightPath","refIdCandidates","fallbackRefId","getMountedBadges","candidateRefId","left","right","buildActionId","getTargetElement","getElement","onStable","rafId","stableFrames","lastTop","lastHeight","startedAt","performance","now","check","topStable","heightStable","waitForStableLayout","leftElement","rightElement","useRightTarget","targetElement","scrollContainer","elementRect","targetTop","isTargetSub","onScrollComplete","async","boxShadowColor","Element","getComputedStyle","color","transition","boxShadow","deviationMap","evalOutputs","freshElement","skipScroll","waitWithTimeout","p","ms","Promise","race","all","waitForScrollIdle","resolve","freshLeft","freshRight","scrollMarginTop","scrollAndWait","anchor","isConnected","findRefIdByContent","refs","ref","textContent","dataset","deviationRefId","cognitivePopupOpen","cognitivePopupSectionIdx","cognitivePopupIsOrphan","cognitivePopupBadgeStyle","cognitivePopupAnchorEl","cognitivePopupSectionAnchorEl","findNodeRecursively","targetId","baseSecById","refSecById","refreshedPopup","renderSubSectionAccordion","depth","parentNodeId","sectionOffset","rhsOrphanVisualIndexes","jsx","SubSectionAccordion","leftRows","isEmpty","LHSSectionRow","layoutKey","rightRows","RHSSectionRow","compareContextValue","summaryPopupAnchorEl","openSummaryPopup","cognitivePopupLeftTitle","cognitivePopupRightTitle","CompareContextProvider","value","children","jsxs","Box","sx","display","flexDirection","bgcolor","fontFamily","overflow","inset","backdropFilter","zIndex","alignItems","justifyContent","borderRadius","BouncingDotsLoader","CognitiveSummaryPopup","containerEl","clipTopEl","scrollContainerEl","onClose","isScrollLocked","MoreFunctionsPopup","referenceSectionTitle","onOpenCognitiveCompare","onOpenSideBySide","onConnect","CognitivePopup","Snackbar","autoHideDuration","anchorOrigin","vertical","horizontal","Alert","severity","whiteSpace","CompareHeader","onCollapseAll","showCollapseAll","onToggleView","isDefaultView","onScroll","flex","minHeight","pt","pb","px","overflowY","borderTop","maxWidth","gridTemplateColumns","SvgConnectors","borderBottom","minWidth","Tooltip","placement","Typography","fontSize","fontWeight","textOverflow","textAlign","maxHeight","overflowX","mr","pr","scrollbarWidth","flexShrink","pointerEvents","mt","onClick","isMissingRationale","label","py","cursor","arrow","component","ThreeDotsLoader","ButtonCognitiveIcon","ChevronDown","transform","OverlayLoader","background","scrollbarColor","Tabs","onChange","_","variant","TabIndicatorProps","lineHeight","textTransform","Tab","ml","pl","GuidelinePanel","WebGptPanel"],"mappings":"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"}
|