@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.
Files changed (145) hide show
  1. package/dist/cjs/features/CognitiveCompare/CitationAnchor.js +1 -1
  2. package/dist/cjs/features/CognitiveCompare/CitationAnchor.js.map +1 -1
  3. package/dist/cjs/features/CognitiveCompare/CitationRenderer.js +1 -1
  4. package/dist/cjs/features/CognitiveCompare/CitationRenderer.js.map +1 -1
  5. package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js +1 -1
  6. package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
  7. package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
  8. package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
  9. package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
  10. package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
  11. package/dist/cjs/features/CognitiveCompare/CognitivePopup.js +1 -1
  12. package/dist/cjs/features/CognitiveCompare/CognitivePopup.js.map +1 -1
  13. package/dist/cjs/features/CognitiveCompare/CompareContext.js +1 -1
  14. package/dist/cjs/features/CognitiveCompare/CompareContext.js.map +1 -1
  15. package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
  16. package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
  17. package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
  18. package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
  19. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
  20. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
  21. package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
  22. package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
  23. package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
  24. package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
  25. package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js +1 -1
  26. package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
  27. package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
  28. package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
  29. package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js +1 -1
  30. package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
  31. package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
  32. package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
  33. package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js +1 -1
  34. package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
  35. package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
  36. package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
  37. package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
  38. package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
  39. package/dist/cjs/features/PdfViewer/PdfToolbar.js +1 -1
  40. package/dist/cjs/features/PdfViewer/PdfToolbar.js.map +1 -1
  41. package/dist/cjs/features/PdfViewer/PdfViewer.css.js +1 -1
  42. package/dist/cjs/features/PdfViewer/PdfViewer.js +1 -1
  43. package/dist/cjs/features/PdfViewer/PdfViewer.js.map +1 -1
  44. package/dist/cjs/features/PdfViewer/rotationManager.js +1 -1
  45. package/dist/cjs/features/PdfViewer/rotationManager.js.map +1 -1
  46. package/dist/cjs/features/PdfViewer/usePdfHighlight.js +1 -1
  47. package/dist/cjs/features/PdfViewer/usePdfHighlight.js.map +1 -1
  48. package/dist/cjs/features/PdfViewer/zoomStateManager.js +2 -0
  49. package/dist/cjs/features/PdfViewer/zoomStateManager.js.map +1 -0
  50. package/dist/cjs/features/SegmentReviewComponents/CognitiveScoreBadge.js +1 -1
  51. package/dist/cjs/features/SegmentReviewComponents/CognitiveScoreBadge.js.map +1 -1
  52. package/dist/cjs/features/SegmentReviewComponents/reviewStepAdapters.js +1 -1
  53. package/dist/cjs/features/SegmentReviewComponents/reviewStepAdapters.js.map +1 -1
  54. package/dist/features/CognitiveCompare/CitationAnchor.js +1 -1
  55. package/dist/features/CognitiveCompare/CitationAnchor.js.map +1 -1
  56. package/dist/features/CognitiveCompare/CitationRenderer.js +1 -1
  57. package/dist/features/CognitiveCompare/CitationRenderer.js.map +1 -1
  58. package/dist/features/CognitiveCompare/CognitiveCompare.js +1 -1
  59. package/dist/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
  60. package/dist/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
  61. package/dist/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
  62. package/dist/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
  63. package/dist/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
  64. package/dist/features/CognitiveCompare/CognitivePopup.js +1 -1
  65. package/dist/features/CognitiveCompare/CognitivePopup.js.map +1 -1
  66. package/dist/features/CognitiveCompare/CompareContext.js +1 -1
  67. package/dist/features/CognitiveCompare/CompareContext.js.map +1 -1
  68. package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
  69. package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
  70. package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
  71. package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
  72. package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
  73. package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
  74. package/dist/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
  75. package/dist/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
  76. package/dist/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
  77. package/dist/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
  78. package/dist/features/CognitiveCompare/components/SectionAccordion.js +1 -1
  79. package/dist/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
  80. package/dist/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
  81. package/dist/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
  82. package/dist/features/CognitiveCompare/components/SvgConnectors.js +1 -1
  83. package/dist/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
  84. package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
  85. package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
  86. package/dist/features/CognitiveCompare/hooks/useCompareData.js +1 -1
  87. package/dist/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
  88. package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
  89. package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
  90. package/dist/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
  91. package/dist/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
  92. package/dist/features/PdfViewer/PdfToolbar.js +1 -1
  93. package/dist/features/PdfViewer/PdfToolbar.js.map +1 -1
  94. package/dist/features/PdfViewer/PdfViewer.css.js +1 -1
  95. package/dist/features/PdfViewer/PdfViewer.js +1 -1
  96. package/dist/features/PdfViewer/PdfViewer.js.map +1 -1
  97. package/dist/features/PdfViewer/rotationManager.js +1 -1
  98. package/dist/features/PdfViewer/rotationManager.js.map +1 -1
  99. package/dist/features/PdfViewer/usePdfHighlight.js +1 -1
  100. package/dist/features/PdfViewer/usePdfHighlight.js.map +1 -1
  101. package/dist/features/PdfViewer/zoomStateManager.js +2 -0
  102. package/dist/features/PdfViewer/zoomStateManager.js.map +1 -0
  103. package/dist/features/SegmentReviewComponents/CognitiveScoreBadge.js +1 -1
  104. package/dist/features/SegmentReviewComponents/CognitiveScoreBadge.js.map +1 -1
  105. package/dist/features/SegmentReviewComponents/reviewStepAdapters.js +1 -1
  106. package/dist/features/SegmentReviewComponents/reviewStepAdapters.js.map +1 -1
  107. package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts +0 -2
  108. package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts.map +1 -1
  109. package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts +1 -8
  110. package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts.map +1 -1
  111. package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts +1 -1
  112. package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts.map +1 -1
  113. package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts +1 -1
  114. package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts.map +1 -1
  115. package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts +3 -12
  116. package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts.map +1 -1
  117. package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts +0 -12
  118. package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts.map +1 -1
  119. package/dist/types/features/CognitiveCompare/CognitivePopup.d.ts.map +1 -1
  120. package/dist/types/features/CognitiveCompare/CompareContext.d.ts +2 -9
  121. package/dist/types/features/CognitiveCompare/CompareContext.d.ts.map +1 -1
  122. package/dist/types/features/CognitiveCompare/Guidelines/components/GuidelinePanel.d.ts.map +1 -1
  123. package/dist/types/features/CognitiveCompare/Guidelines/components/WebGptPanel.d.ts.map +1 -1
  124. package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts +1 -14
  125. package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts.map +1 -1
  126. package/dist/types/features/CognitiveCompare/components/LHSSectionRow.d.ts.map +1 -1
  127. package/dist/types/features/CognitiveCompare/components/RHSSectionRow.d.ts.map +1 -1
  128. package/dist/types/features/CognitiveCompare/components/SectionAccordion.d.ts.map +1 -1
  129. package/dist/types/features/CognitiveCompare/components/SubSectionAccordion.d.ts.map +1 -1
  130. package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts +3 -2
  131. package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts.map +1 -1
  132. package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts +1 -2
  133. package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts.map +1 -1
  134. package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts +1 -1
  135. package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts.map +1 -1
  136. package/dist/types/features/CognitiveCompare/hooks/useLinesCalculator.d.ts.map +1 -1
  137. package/dist/types/features/CognitiveCompare/hooks/useSideBySide.d.ts.map +1 -1
  138. package/dist/types/features/PdfViewer/PdfToolbar.d.ts.map +1 -1
  139. package/dist/types/features/PdfViewer/PdfViewer.d.ts.map +1 -1
  140. package/dist/types/features/PdfViewer/rotationManager.d.ts.map +1 -1
  141. package/dist/types/features/PdfViewer/usePdfHighlight.d.ts +1 -2
  142. package/dist/types/features/PdfViewer/usePdfHighlight.d.ts.map +1 -1
  143. package/dist/types/features/PdfViewer/zoomStateManager.d.ts +21 -0
  144. package/dist/types/features/PdfViewer/zoomStateManager.d.ts.map +1 -0
  145. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"useLinesCalculator.js","sources":["../../../../src/features/CognitiveCompare/hooks/useLinesCalculator.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\"\nimport { CachedBadgePosition, SectionBlock } from \"../CognitiveCompareTypes\";\nimport { DEVIATION_BADGE_SEPARATOR, getBentArrowPath, hasValue } from \"../CognitiveComparehelpers\";\nimport { maxHeight } from \"@mui/system\";\nimport { getVisibleGuidelineTargets } from \"../Guidelines/utils/guidelineTargets\";\n\nexport const 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, // ── NEW PROP ──\n cognitiveMap,\n getSectionCompareStyle, getSubSectionCompareStyle, getDeviationStyleByKey,\n isArrowVisible,\n\n isAnimatingRef,\n isSideBySideRef,\n sideBySideCacheRef,\n sideBySideLineRef,\n activeSideBySideSectionRef,\n activeSideBySideRightSectionRef,\n connectedLines: providedConnectedLines,\n setConnectedLines: providedSetConnectedLines,\n cachedConnectedPositions: providedCachedConnectedPositions,\n calculateLinesRef,\n resizeTimerRef,\n scrollLock,\n scrollSyncLocked,\n\n handleResizeRef,\n activeProposed, existingRule, analysisData,\n pendingScrollTargetRef, pendingScrollCallbackRef,\n\n resolvedComparisonConfig,\n getFieldData\n}: any) => {\n // States and Refs\n const [lines, setLines] = useState<Record<string, any>[]>([]);\n const [overallConnector, setOverallConnector] = useState<{ x1: number; x2: number; y: number; } | null>(null);\n const [internalConnectedLines, internalSetConnectedLines] = useState<Record<string, any>[]>([]);\n const connectedLines = providedConnectedLines ?? internalConnectedLines;\n const setConnectedLines = providedSetConnectedLines ?? internalSetConnectedLines;\n const [svgDimensions, setSvgDimensions] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n\n const isCalculatingLines = useRef(false);\n const scrollTicking = useRef(false);\n const scrollSyncing = useRef(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const internalCachedConnectedPositions = useRef<CachedBadgePosition[]>([]);\n const cachedConnectedPositions =\n providedCachedConnectedPositions ?? internalCachedConnectedPositions;\n\n\n \n // Helpers\n // ── UNIFIED ROUNDED PATH GENERATOR (Guarantees shared trunk for ALL modes) ──\n const getRoundedStaggeredPath = (x1: number, y1: number, x2: number, y2: number, cX: number, visL: boolean, visR: boolean) => {\n if (Math.abs(y2 - y1) <= 1) {\n if (visL && visR) return `M ${x1},${y1} L ${x2},${y2}`;\n if (visL && !visR) return `M ${x1},${y1} L ${cX},${y1}`;\n if (!visL && visR) return `M ${cX},${y1} L ${x2},${y2}`;\n return `M ${cX},${y1} L ${cX},${y2}`;\n }\n const r1 = Math.min(15, Math.abs(cX - x1), Math.abs(y2 - y1) / 2);\n const r2 = Math.min(15, Math.abs(x2 - cX), Math.abs(y2 - y1) / 2);\n const dy1 = y2 > y1 ? r1 : -r1;\n const dy2 = y2 > y1 ? r2 : -r2;\n const dx2 = x2 > cX ? r2 : -r2; // Safe horizontal direction\n \n if (visL && visR) {\n return `M ${x1},${y1} L ${cX - r1},${y1} Q ${cX},${y1} ${cX},${y1 + dy1} L ${cX},${y2 - dy2} Q ${cX},${y2} ${cX + dx2},${y2} L ${x2},${y2}`;\n } else if (visL && !visR) {\n return `M ${x1},${y1} L ${cX - r1},${y1} Q ${cX},${y1} ${cX},${y1 + dy1} L ${cX},${y2}`;\n } else if (!visL && visR) {\n return `M ${cX},${y1} L ${cX},${y2 - dy2} Q ${cX},${y2} ${cX + dx2},${y2} L ${x2},${y2}`;\n } else {\n return `M ${cX},${y1} L ${cX},${y2}`;\n }\n };\n\n // Helper to check if a subsection is actually visible in the expanded section\n const isSubSectionVisible = (keyPath: string) => {\n const pathParts = keyPath.split('-');\n const rootIdx = pathParts[0];\n\n // Edge case\n // Early return if root parent is not expanded\n // Only happens in side by side view for deeply nested children\n if (!expandedSections[rootIdx] && maintainRelativeOrder === false) return;\n\n if (maintainRelativeOrder) {\n if (!expandedSections[`left-${rootIdx}`] && !expandedSections[`right-${rootIdx}`] && !expandedSections[rootIdx]) return false;\n }\n\n // Check to confirm if all the ancestors of the node are expanded otherwise early return\n let ancestorPath = rootIdx;\n for (let i = 1; i < pathParts.length - 1; i++) {\n ancestorPath += `-${pathParts[i]}`;\n if (!expandedSections[ancestorPath]) return false;\n }\n\n return true;\n };\n\n // Callbacks\n const calculateLines = useCallback(() => {\n if (isCalculatingLines.current) return;\n if (isAnimatingRef.current) return;\n isCalculatingLines.current = true;\n try {\n if (!containerRef.current) return;\n\n // Helper to check if a subsection is actually visible in the expanded accordion tree\n const isSubSectionVisible = (keyPath: string) => {\n const pathParts = keyPath.split('-');\n const rootIdx = pathParts[0];\n\n // 1. Root Parent must be expanded\n if (!expandedSections[rootIdx] && maintainRelativeOrder === false) return false;\n if (maintainRelativeOrder) {\n if (!expandedSections[`left-${rootIdx}`] && !expandedSections[`right-${rootIdx}`] && !expandedSections[rootIdx]) return false;\n }\n\n // 2. All intermediate ancestor subsections must be expanded\n let ancestorPath = rootIdx;\n for (let i = 1; i < pathParts.length - 1; i++) {\n ancestorPath += `-${pathParts[i]}`;\n if (!expandedSubSections[ancestorPath]) {\n return false;\n }\n }\n return true;\n };\n\n // 3. Keep the SVG setup and field heights logic intact\n const containerRect = containerRef.current.getBoundingClientRect();\n setSvgDimensions({\n width: containerRect.width,\n height: containerRect.height,\n });\n\n const newLines: Record<string, any>[] = [];\n\n // RESET STYLES (WRITE ONLY)\n visibleFields.forEach(({ key }: {key: any}) => {\n const l = leftRefs.current[key]?.current;\n const r = rightRefs.current[key]?.current;\n\n if (l && r) {\n l.style.height = \"auto\";\n r.style.height = \"auto\";\n l.style.minHeight = \"0px\";\n r.style.minHeight = \"0px\";\n }\n });\n\n if (!isAnimatingRef.current) {\n for (let idx = 0; idx < Math.max(proposedSections.length, existingSections.length); idx++) {\n const l = sectionLeftRefs.current[idx]?.current;\n const r = sectionRightRefs.current[idx]?.current;\n\n if (l) {\n l.style.height = \"auto\";\n l.style.minHeight = \"0px\";\n }\n if (r) {\n r.style.height = \"auto\";\n r.style.minHeight = \"0px\";\n }\n }\n \n if (!maintainRelativeOrder) {\n // Subsections reset\n Object.keys(subSectionLeftRefs.current).forEach(keyPath => {\n if (!isSubSectionVisible(keyPath)) return;\n const l = subSectionLeftRefs.current[keyPath]?.current;\n const r = subSectionRightRefs.current[keyPath]?.current;\n if (l && r) {\n l.style.height = \"auto\";\n r.style.height = \"auto\";\n l.style.minHeight = \"0px\";\n r.style.minHeight = \"0px\";\n }\n });\n }\n }\n\n // READ HEIGHTS (READ ONLY)\n const fieldHeights: Record<string, number> = {};\n\n visibleFields.forEach(({ key } : {key: any}) => {\n const l = leftRefs.current[key]?.current;\n const r = rightRefs.current[key]?.current;\n\n if (l && r) {\n const lRect = l.getBoundingClientRect();\n const rRect = r.getBoundingClientRect();\n fieldHeights[key] = Math.max(lRect.height, rRect.height);\n }\n });\n\n const syncHeights = { left: {} as Record<number, number>, right: {} as Record<number, number> };\n const subSectionHeights: Record<string, number> = {};\n\n if (!isAnimatingRef.current) {\n if (!maintainRelativeOrder) {\n // ── FIX: Measure and apply subsection heights FIRST so their new heights push the parent containers ──\n Object.keys(subSectionLeftRefs.current).forEach(keyPath => {\n if (!isSubSectionVisible(keyPath)) return;\n const l = subSectionLeftRefs.current[keyPath]?.current;\n const r = subSectionRightRefs.current[keyPath]?.current;\n if (l && r && l.offsetParent !== null && r.offsetParent !== null) {\n const lRect = l.getBoundingClientRect();\n const rRect = r.getBoundingClientRect();\n const maxH = Math.max(lRect.height, rRect.height);\n subSectionHeights[keyPath] = maxH;\n \n // Apply immediately so the browser recalculates layout for the parent block below\n l.style.minHeight = `${maxH}px`;\n r.style.minHeight = `${maxH}px`;\n }\n });\n\n // ── NOW measure main sections (which will naturally wrap the aligned subsections) ──\n for (let idx = 0; idx < Math.min(proposedSections.length, existingSections.length); idx++) {\n const l = sectionLeftRefs.current[idx]?.current;\n const r = sectionRightRefs.current[idx]?.current;\n\n if (l && r) {\n const maxH = Math.max(l.getBoundingClientRect().height, r.getBoundingClientRect().height);\n syncHeights.left[idx] = maxH;\n syncHeights.right[idx] = maxH;\n }\n }\n\n } else if (isSideBySide && activeSideBySideSection !== null) {\n if (typeof activeSideBySideSection === \"number\") {\n const leftIdx = activeSideBySideSection;\n const leftSec = proposedSections[leftIdx] as any;\n const l = sectionLeftRefs.current[leftIdx]?.current;\n\n if (l && leftSec) {\n (leftSec.refIndexes || []).forEach((rhsSelfIdx: number) => {\n const rhsArrayIdx = existingSections.findIndex((s: any) => s.selfIndex === rhsSelfIdx);\n const r = sectionRightRefs.current[rhsArrayIdx]?.current;\n if (!r) return;\n\n if (expandedSections[`left-${leftIdx}`] || expandedSections[`right-${rhsArrayIdx}`]) {\n const maxH = Math.max(l.getBoundingClientRect().height, r.getBoundingClientRect().height);\n syncHeights.left[leftIdx] = Math.max(syncHeights.left[leftIdx] || 0, maxH);\n syncHeights.right[rhsArrayIdx] = Math.max(syncHeights.right[rhsArrayIdx] || 0, maxH);\n }\n });\n }\n } else {\n const keyPath = activeSideBySideSection.split(DEVIATION_BADGE_SEPARATOR)[2]; \n if (keyPath) {\n const l = subSectionLeftRefs.current[keyPath]?.current;\n const r = subSectionRightRefs.current[keyPath]?.current;\n if (l && r) {\n const maxH = Math.max(l.getBoundingClientRect().height, r.getBoundingClientRect().height);\n subSectionHeights[keyPath] = Math.max(subSectionHeights[keyPath] || 0, maxH);\n }\n }\n }\n }\n }\n\n visibleFields.forEach(({ key } : {key : any}) => {\n const l = leftRefs.current[key]?.current;\n const r = rightRefs.current[key]?.current;\n\n if (l && r) {\n const maxH = fieldHeights[key];\n l.style.minHeight = `${maxH}px`;\n r.style.minHeight = `${maxH}px`;\n }\n });\n\n if (!isAnimatingRef.current) {\n Object.entries(syncHeights.left).forEach(([idx, maxH]) => {\n const l = sectionLeftRefs.current[Number(idx)]?.current;\n if (l) l.style.minHeight = `${maxH}px`;\n });\n \n Object.entries(syncHeights.right).forEach(([idx, maxH]) => {\n const r = sectionRightRefs.current[Number(idx)]?.current;\n if (r) r.style.minHeight = `${maxH}px`;\n });\n\n if (!maintainRelativeOrder) {\n Object.keys(subSectionHeights).forEach(keyPath => {\n const l = subSectionLeftRefs.current[keyPath]?.current;\n const r = subSectionRightRefs.current[keyPath]?.current;\n if (l && r && subSectionHeights[keyPath]) {\n const maxH = subSectionHeights[keyPath];\n l.style.minHeight = `${maxH}px`;\n r.style.minHeight = `${maxH}px`;\n }\n });\n }\n }\n\n // SECTION CONNECTORS\n // ── SKIP SECTION LINES IF IN GUIDELINE MODE ──\n if (!isGuidelineMode) {\n const getMappedRightIndexes = (leftSec: any, leftIdx: number) => {\n // Standard/Side-by-Side data is already materialized as explicit\n // mapping rows, so its counterpart is always at the same row index.\n // Looking up by display_index is ambiguous when a target section is\n // intentionally repeated for more than one mapping edge.\n if (!maintainRelativeOrder) {\n return existingSections[leftIdx] ? [leftIdx] : [];\n }\n\n const mapped = (leftSec.refIndexes || [])\n .map((rhsSelfIdx: number) =>\n existingSections.findIndex((s: any) => s.selfIndex === rhsSelfIdx),\n )\n .filter((idx: number) => idx !== -1);\n\n // Backward-compatible fallback for old one-to-one/index-based data\n if (!mapped.length && existingSections[leftIdx]) {\n return [leftIdx];\n }\n\n return Array.from(new Set(mapped));\n };\n\n proposedSections.forEach((leftSec: any, leftIdx: number) => {\n const continuationSourceIdx = leftSec.continuationSourceRowId\n ? proposedSections.findIndex(\n (section: any) =>\n section.comparisonRowId === leftSec.continuationSourceRowId,\n )\n : -1;\n const resolvedLeftIdx =\n continuationSourceIdx >= 0 ? continuationSourceIdx : leftIdx;\n const lWrap = sectionLeftRefs.current[resolvedLeftIdx]?.current;\n if (!lWrap) return;\n\n const rightIndexes = getMappedRightIndexes(leftSec, leftIdx);\n\n rightIndexes.forEach((rhsArrayIdx: any) => {\n const rWrap = sectionRightRefs.current[rhsArrayIdx]?.current;\n if (!rWrap) return;\n\n const leftRect = lWrap.getBoundingClientRect();\n const rightRect = rWrap.getBoundingClientRect();\n\n const x1 = leftRect.right - containerRect.left;\n const x2 = rightRect.left - containerRect.left;\n\n let y1 = leftRect.top + 18 - containerRect.top;\n let y2 = rightRect.top + 18 - containerRect.top;\n\n if (maintainRelativeOrder && isSideBySide && activeSideBySideSection === leftIdx) {\n const leftTop = leftContainerRef.current?.getBoundingClientRect().top ?? 0;\n const rightTop = rightContainerRef.current?.getBoundingClientRect().top ?? 0;\n const leftBottom = leftTop + (leftContainerRef.current?.clientHeight ?? Infinity);\n const rightBottom = rightTop + (rightContainerRef.current?.clientHeight ?? Infinity);\n\n const clamp = (v: number, min: number, max: number) =>\n Math.max(min, Math.min(max, v));\n\n y1 = clamp(leftRect.top + 18, leftTop, leftBottom) - containerRect.top;\n y2 = clamp(rightRect.top + 18, rightTop, rightBottom) - containerRect.top;\n }\n\n const style = getSectionCompareStyle(resolvedLeftIdx);\n\n if (style) {\n newLines.push({\n id: `line-${resolvedLeftIdx}-${rhsArrayIdx}`,\n x1,\n y1,\n x2,\n y2,\n style,\n sectionIdx: resolvedLeftIdx,\n targetRightIdx: rhsArrayIdx,\n isSubSection: false,\n isMappingContinuation: continuationSourceIdx >= 0,\n hasCognitive: !!(\n proposedSections[resolvedLeftIdx]?.cognitiveData ||\n existingSections[rhsArrayIdx]?.cognitiveData ||\n proposedSections[resolvedLeftIdx]?.nodeId &&\n cognitiveMap[proposedSections[resolvedLeftIdx].nodeId as string]\n ),\n });\n }\n });\n });\n }\n\n if (!isGuidelineMode && isSideBySide && typeof activeSideBySideSection === 'string' && activeSideBySideSection.includes(DEVIATION_BADGE_SEPARATOR)) {\n const [nodeId, devKey, leftKeyPath, rightKeyPath] = activeSideBySideSection.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${nodeId}${DEVIATION_BADGE_SEPARATOR}${devKey}`;\n\n const lBadgeEl = lhsBadgeRefs.current[refId]?.current;\n const rBadgeEl = rhsBadgeRefs.current[refId]?.current;\n\n if (lBadgeEl && rBadgeEl) {\n const lRect = lBadgeEl.getBoundingClientRect();\n const rRect = rBadgeEl.getBoundingClientRect();\n\n const x1 = lRect.right - containerRect.left;\n const x2 = rRect.left - containerRect.left;\n \n let y1 = lRect.top + lRect.height / 2 - containerRect.top;\n let y2 = rRect.top + rRect.height / 2 - containerRect.top;\n\n if (maintainRelativeOrder) {\n const leftTop = leftContainerRef.current?.getBoundingClientRect().top ?? 0;\n const rightTop = rightContainerRef.current?.getBoundingClientRect().top ?? 0;\n const leftBottom = leftTop + (leftContainerRef.current?.clientHeight ?? Infinity);\n const rightBottom = rightTop + (rightContainerRef.current?.clientHeight ?? Infinity);\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n y1 = clamp(lRect.top + lRect.height / 2, leftTop, leftBottom) - containerRect.top;\n y2 = clamp(rRect.top + rRect.height / 2, rightTop, rightBottom) - containerRect.top;\n }\n \n const style =\n getDeviationStyleByKey(nodeId, devKey) ??\n getSubSectionCompareStyle(leftKeyPath);\n if (style) {\n newLines.push({\n id: `line-subsec-${refId}`,\n x1, y1, x2, y2,\n style,\n sectionIdx: Number(leftKeyPath.split('-')[0]),\n isSubSection: true,\n subSectionKeyPath: activeSideBySideSection,\n });\n }\n }\n }\n\n setLines(newLines);\n\n if (leftHeaderRef.current && rightHeaderRef.current) {\n const leftHeaderRect = leftHeaderRef.current.getBoundingClientRect();\n const rightHeaderRect = rightHeaderRef.current.getBoundingClientRect();\n const overallY =\n (leftHeaderRect.top +\n leftHeaderRect.height / 2 -\n containerRect.top +\n rightHeaderRect.top +\n rightHeaderRect.height / 2 -\n containerRect.top) /\n 2;\n setOverallConnector({\n x1: leftHeaderRect.right - containerRect.left,\n x2: rightHeaderRect.left - containerRect.left,\n y: overallY,\n });\n } else {\n setOverallConnector(null);\n }\n\n if (connectedSections.size > 0) {\n const newConnectedLines: Record<string, any>[] = [];\n const leftContainer = leftContainerRef.current;\n const rightContainer = rightContainerRef.current;\n\n if (leftContainer && rightContainer) {\n const newCache: CachedBadgePosition[] = [];\n \n const leftTop = leftContainer.getBoundingClientRect().top;\n const rightTop = rightContainer.getBoundingClientRect().top;\n const leftBottom = leftTop + leftContainer.clientHeight;\n const rightBottom = rightTop + rightContainer.clientHeight;\n\n const leftScrollTop = leftContainer.scrollTop;\n const rightScrollTop = rightContainer.scrollTop;\n const cTop = containerRect.top;\n\n const clamp = (v: number, min: number, max: number) =>\n Math.max(min, Math.min(max, v));\n\n connectedSections.forEach((connectedIdx:any) => {\n // ── GUIDELINE MODE LOGIC ──\n if (isGuidelineMode) {\n let lBadge: HTMLElement | null = null;\n let leftIdxNum: number | null = null;\n let style: any = null;\n\n if (typeof connectedIdx === 'string' && connectedIdx.includes(DEVIATION_BADGE_SEPARATOR)) {\n const [nodeId, devKey, leftKeyPath] = connectedIdx.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${nodeId}${DEVIATION_BADGE_SEPARATOR}${devKey}`;\n lBadge = lhsBadgeRefs.current[refId]?.current;\n style = getDeviationStyleByKey(nodeId, devKey) ?? getSubSectionCompareStyle(leftKeyPath);\n leftIdxNum = Number(leftKeyPath?.split('-')[0] || 0);\n } else {\n leftIdxNum = Number(connectedIdx);\n lBadge = lhsBadgeRefs.current[leftIdxNum]?.current;\n style = getSectionCompareStyle(leftIdxNum);\n }\n\n if (!lBadge) return;\n\n const targetMarks = getVisibleGuidelineTargets(rightContainer);\n \n targetMarks.forEach((rBadge: any, index) => {\n const lRect = lBadge!.getBoundingClientRect();\n const rRect = rBadge.getBoundingClientRect();\n\n const x1 = lRect.right - containerRect.left;\n const x2 = rRect.left - containerRect.left - 0;\n \n // ── UNIVERSAL SPINE JUNCTION PUSHED TO X1+75 TO CLEAR LOCK ICON ──\n const centerX = x1 + 75;\n\n const rawLhsY = lRect.top + lRect.height / 2;\n // Target the middle of the highlighted text vertically\n const rawRhsY = rRect.top + rRect.height / 2;\n\n const lhsScrollY = (rawLhsY - leftTop) + leftScrollTop;\n const rhsScrollY = (rawRhsY - rightTop) + rightScrollTop;\n \n const styleId = `conn-guide-${connectedIdx}-${index}`;\n \n // ── BULLETPROOF MATH LABEL GENERATION ──\n let baseLabel = \"\";\n if (typeof connectedIdx === 'string' && connectedIdx.includes(DEVIATION_BADGE_SEPARATOR)) {\n const parts = connectedIdx.split(DEVIATION_BADGE_SEPARATOR);\n const leftKeyPath = parts[2] || \"\";\n baseLabel = leftKeyPath.split('-').map(n => Number(n) + 1).join('.');\n } else {\n baseLabel = String(Number(connectedIdx) + 1);\n }\n const letter = String.fromCharCode(97 + index); // a, b, c...\n const matchLabel = targetMarks.length === 1 ? null : `${baseLabel}(${letter})`;\n\n newCache.push({\n lhsScrollY, rhsScrollY, x1, x2, containerTop: cTop,\n leftIdx: connectedIdx, rhsArrayIdx: index, \n styleColor: style?.badgeBorder || \"#6366F1\", \n styleBg: style?.badgeBg || \"#FFFFFF\",\n styleText: style?.badgeText || \"#A16207\",\n styleId, centerX,\n });\n\n const clampedLhsY = clamp(rawLhsY, leftTop, leftBottom);\n const clampedRhsY = clamp(rawRhsY, rightTop, rightBottom);\n\n const y1 = clampedLhsY - cTop;\n const y2 = clampedRhsY - cTop;\n\n const lhsVisible = rawLhsY >= leftTop - 4 && rawLhsY <= leftBottom + 4;\n const rhsVisible = rawRhsY >= rightTop - 4 && rawRhsY <= rightBottom + 4;\n\n const pathD = getRoundedStaggeredPath(x1, y1, x2, y2, centerX, lhsVisible, rhsVisible);\n\n newConnectedLines.push({ \n id: styleId, pathD, style, leftIdx: connectedIdx, rhsArrayIdx: index, \n x1, x2, y1, y2, centerX, matchLabel, isGuideline: true \n });\n });\n } else {\n // ── UNIFIED CONTRACT TO CONTRACT LOGIC ──\n if (typeof connectedIdx === 'string' && connectedIdx.includes(DEVIATION_BADGE_SEPARATOR)) {\n const [nodeId, devKey, leftKeyPath, rightKeyPath] = connectedIdx.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${nodeId}${DEVIATION_BADGE_SEPARATOR}${devKey}`;\n\n const lBadge = lhsBadgeRefs.current[refId]?.current;\n const rBadge = rhsBadgeRefs.current[refId]?.current;\n if (!lBadge || !rBadge) return;\n\n const lRect = lBadge.getBoundingClientRect();\n const rRect = rBadge.getBoundingClientRect();\n const style = getDeviationStyleByKey(nodeId, devKey) ?? getSubSectionCompareStyle(leftKeyPath);\n\n const x1 = lRect.right - containerRect.left;\n const x2 = rRect.left - containerRect.left - 0;\n const centerX = x1 + 75; // ── UNIVERSAL SPINE JUNCTION ──\n\n const rawLhsY = lRect.top + lRect.height / 2;\n const rawRhsY = rRect.top + rRect.height / 2;\n\n const lhsScrollY = (rawLhsY - leftTop) + leftScrollTop;\n const rhsScrollY = (rawRhsY - rightTop) + rightScrollTop;\n const styleId = `conn-subsec-${refId}`;\n \n const leftKeyP = leftKeyPath || \"\";\n const baseLabel = leftKeyP.split('-').map(n => Number(n) + 1).join('.');\n const matchLabel = null; // 1-to-1 connection, no badge needed\n\n newCache.push({\n lhsScrollY, rhsScrollY, x1, x2, containerTop: cTop,\n leftIdx: connectedIdx, rhsArrayIdx: connectedIdx,\n styleColor: style?.badgeBorder || \"#6366F1\", styleBg: style?.badgeBg || \"#FFFFFF\", styleText: style?.badgeText || \"#A16207\",\n styleId, centerX, \n });\n\n const clampedLhsY = clamp(rawLhsY, leftTop, leftBottom);\n const clampedRhsY = clamp(rawRhsY, rightTop, rightBottom);\n const y1 = clampedLhsY - cTop;\n const y2 = clampedRhsY - cTop;\n const lhsVisible = rawLhsY >= leftTop - 4 && rawLhsY <= leftBottom + 4;\n const rhsVisible = rawRhsY >= rightTop - 4 && rawRhsY <= rightBottom + 4;\n\n const pathD = getRoundedStaggeredPath(x1, y1, x2, y2, centerX, lhsVisible, rhsVisible);\n\n newConnectedLines.push({ id: styleId, pathD, style, leftIdx: connectedIdx, rhsArrayIdx: connectedIdx, x1, x2, y1, y2, matchLabel });\n } else {\n if (!maintainRelativeOrder) {\n const leftIdx = connectedIdx;\n const rhsArrayIdx = leftIdx as number;\n const lBadge = lhsBadgeRefs.current[leftIdx]?.current;\n const rBadge = rhsBadgeRefs.current[rhsArrayIdx]?.current;\n if (!lBadge || !rBadge) return;\n\n const lRect = lBadge.getBoundingClientRect();\n const rRect = rBadge.getBoundingClientRect();\n const style = getSectionCompareStyle(leftIdx as number);\n\n const x1 = lRect.right - containerRect.left;\n const x2 = rRect.left - containerRect.left - 0;\n const centerX = x1 + 75; // ── UNIVERSAL SPINE JUNCTION ──\n\n const rawLhsY = lRect.top + lRect.height / 2;\n const rawRhsY = rRect.top + rRect.height / 2;\n const lhsScrollY = (rawLhsY - leftTop) + leftScrollTop;\n const rhsScrollY = (rawRhsY - rightTop) + rightScrollTop;\n const styleId = `conn-${leftIdx}-${rhsArrayIdx}`;\n \n const baseLabel = String(Number(connectedIdx) + 1);\n const matchLabel = null; // 1-to-1 connection, no badge needed\n\n newCache.push({\n lhsScrollY, rhsScrollY, x1, x2, containerTop: cTop,\n leftIdx, rhsArrayIdx, \n styleColor: style?.badgeBorder || \"#6366F1\", styleBg: style?.badgeBg || \"#FFFFFF\", styleText: style?.badgeText || \"#A16207\",\n styleId, centerX,\n });\n\n const clampedLhsY = clamp(rawLhsY, leftTop, leftBottom);\n const clampedRhsY = clamp(rawRhsY, rightTop, rightBottom);\n const y1 = clampedLhsY - cTop;\n const y2 = clampedRhsY - cTop;\n const lhsVisible = rawLhsY >= leftTop - 4 && rawLhsY <= leftBottom + 4;\n const rhsVisible = rawRhsY >= rightTop - 4 && rawRhsY <= rightBottom + 4;\n\n const pathD = getRoundedStaggeredPath(x1, y1, x2, y2, centerX, lhsVisible, rhsVisible);\n\n newConnectedLines.push({ id: styleId, pathD, style, leftIdx, rhsArrayIdx, x1, x2, y1, y2, matchLabel });\n } else {\n const leftIdx = connectedIdx as number;\n const leftSec = proposedSections[leftIdx] as any;\n if (!leftSec?.refIndexes?.length) return;\n\n leftSec.refIndexes.forEach((rhsSelfIdx: number, index: number) => {\n const rhsArrayIdx = existingSections.findIndex((s: any) => s.selfIndex === rhsSelfIdx);\n if (rhsArrayIdx === -1) return;\n\n const lBadge = lhsBadgeRefs.current[leftIdx]?.current;\n const rBadge = rhsBadgeRefs.current[rhsArrayIdx]?.current;\n if (!lBadge || !rBadge) return;\n\n const lRect = lBadge.getBoundingClientRect();\n const rRect = rBadge.getBoundingClientRect();\n const style = getSectionCompareStyle(leftIdx);\n\n const x1 = lRect.right - containerRect.left;\n const x2 = rRect.left - containerRect.left - 0;\n \n const centerX = x1 + 75; // ── UNIVERSAL SPINE JUNCTION ──\n\n const rawLhsY = lRect.top + lRect.height / 2;\n const rawRhsY = rRect.top + rRect.height / 2;\n const lhsScrollY = (rawLhsY - leftTop) + leftScrollTop;\n const rhsScrollY = (rawRhsY - rightTop) + rightScrollTop;\n const styleId = `conn-${leftIdx}-${rhsArrayIdx}`;\n \n const baseLabel = String(Number(connectedIdx) + 1);\n const letter = String.fromCharCode(97 + index); \n const matchLabel = leftSec.refIndexes.length === 1 ? null : `${baseLabel}(${letter})`;\n\n newCache.push({\n lhsScrollY, rhsScrollY, x1, x2, containerTop: cTop,\n leftIdx, rhsArrayIdx,\n styleColor: style?.badgeBorder || \"#6366F1\", styleBg: style?.badgeBg || \"#FFFFFF\", styleText: style?.badgeText || \"#A16207\",\n styleId, centerX,\n });\n\n const clampedLhsY = clamp(rawLhsY, leftTop, leftBottom);\n const clampedRhsY = clamp(rawRhsY, rightTop, rightBottom);\n const y1 = clampedLhsY - cTop;\n const y2 = clampedRhsY - cTop;\n const lhsVisible = rawLhsY >= leftTop - 4 && rawLhsY <= leftBottom + 4;\n const rhsVisible = rawRhsY >= rightTop - 4 && rawRhsY <= rightBottom + 4;\n\n const pathD = getRoundedStaggeredPath(x1, y1, x2, y2, centerX, lhsVisible, rhsVisible);\n\n newConnectedLines.push({\n id: styleId, pathD, style, leftIdx, rhsArrayIdx, x1, x2, y1, y2, matchLabel,\n });\n });\n }\n }\n }\n });\n cachedConnectedPositions.current = newCache;\n }\n setConnectedLines(newConnectedLines);\n\n setTimeout(() => updateConnectedLinesOnScroll(), 10);\n } else {\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n setTimeout(() => updateConnectedLinesOnScroll(), 10);\n }\n } catch (e) {\n console.error(\"Line render safe fail: \", e);\n } finally {\n isCalculatingLines.current = false;\n }\n }, [\n visibleFields,\n proposedSections,\n existingSections,\n cognitiveMap,\n resolvedComparisonConfig,\n getFieldData,\n getSectionCompareStyle,\n getDeviationStyleByKey,\n maintainRelativeOrder,\n isSideBySide, \n activeSideBySideSection, \n connectedSections,\n expandedSections,\n expandedSubSections,\n isGuidelineMode, \n ]);\n\n const updateConnectedLinesOnScroll = useCallback(() => {\n const cache = cachedConnectedPositions.current;\n \n if (!cache.length) {\n pathRefs.current[\"guideline-up-stroke\"]?.setAttribute(\"visibility\", \"hidden\");\n pathRefs.current[\"guideline-up-badge\"]?.setAttribute(\"visibility\", \"hidden\");\n pathRefs.current[\"guideline-down-stroke\"]?.setAttribute(\"visibility\", \"hidden\");\n pathRefs.current[\"guideline-down-badge\"]?.setAttribute(\"visibility\", \"hidden\");\n return;\n }\n\n if (isAnimatingRef.current) return;\n \n const leftScroll = leftContainerRef.current?.scrollTop ?? 0;\n const rightScroll = rightContainerRef.current?.scrollTop ?? 0;\n \n const leftHeight = leftContainerRef.current?.clientHeight ?? Infinity;\n const rightHeight = rightContainerRef.current?.clientHeight ?? Infinity;\n \n const leftTop = leftContainerRef.current?.getBoundingClientRect().top ?? 0;\n const rightTop = rightContainerRef.current?.getBoundingClientRect().top ?? 0;\n \n const leftBottom = leftTop + leftHeight;\n const rightBottom = rightTop + rightHeight;\n \n const containerRect = containerRef.current?.getBoundingClientRect();\n const containerTop = containerRect?.top ?? 0;\n const containerHeight = containerRect?.height ?? Infinity;\n \n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n \n let topCount = 0;\n let bottomCount = 0;\n let sharedX1 = 0, sharedY1 = 0;\n let sharedColor = \"#6366F1\", sharedBg = \"#FFFFFF\", sharedTextCol = \"#A16207\";\n let hasActiveConnections = false;\n let universalSpineX = 0; \n\n cache.forEach((entry: any) => {\n const lhsViewportY = (entry.lhsScrollY - leftScroll) + leftTop;\n const rhsViewportY = (entry.rhsScrollY - rightScroll) + rightTop;\n \n const strokeEl = pathRefs.current[entry.styleId + \"-stroke\"];\n const bgEl = pathRefs.current[entry.styleId + \"-bg\"];\n const btnEl = pathRefs.current[entry.styleId + \"-btn\"];\n const numberBadgeEl = pathRefs.current[entry.styleId + \"-number\"];\n \n if (!strokeEl && !bgEl) return;\n \n const visibleLhsY = clamp(lhsViewportY, leftTop, leftBottom);\n const visibleRhsY = clamp(rhsViewportY, rightTop, rightBottom);\n \n const y1 = visibleLhsY - containerTop;\n const y2 = visibleRhsY - containerTop;\n \n const lhsVisible = lhsViewportY >= leftTop - 4 && lhsViewportY <= leftBottom + 4;\n const rhsVisible = rhsViewportY >= rightTop - 4 && rhsViewportY <= rightBottom + 4;\n \n let showLine = true;\n hasActiveConnections = true;\n\n // Enforce absolute strict universal spine\n const centerX = entry.centerX || (entry.x1 + 75);\n\n if (sharedX1 === 0) {\n sharedX1 = entry.x1;\n sharedY1 = y1;\n universalSpineX = centerX;\n sharedColor = entry.styleColor;\n sharedBg = entry.styleBg || \"#FFFFFF\";\n sharedTextCol = entry.styleText || \"#A16207\";\n }\n\n if (rhsViewportY < rightTop - 4) {\n topCount++; showLine = false; \n } else if (rhsViewportY > rightBottom + 4) {\n bottomCount++; showLine = false; \n } \n \n const pathD = getRoundedStaggeredPath(entry.x1, y1, entry.x2, y2, universalSpineX, lhsVisible, rhsVisible);\n \n if (strokeEl) {\n if (showLine && pathD) {\n strokeEl.setAttribute(\"visibility\", \"visible\");\n strokeEl.setAttribute(\"d\", pathD);\n } else { strokeEl.setAttribute(\"visibility\", \"hidden\"); }\n }\n \n if (bgEl) {\n if (showLine && pathD) {\n bgEl.setAttribute(\"visibility\", \"visible\");\n bgEl.setAttribute(\"d\", pathD);\n } else { bgEl.setAttribute(\"visibility\", \"hidden\"); }\n }\n\n if (btnEl) {\n if (!lhsVisible || !showLine) {\n btnEl.setAttribute(\"visibility\", \"hidden\");\n } else {\n btnEl.setAttribute(\"visibility\", \"visible\");\n btnEl.setAttribute(\"y\", String(y1 - 12)); \n }\n }\n\n if (numberBadgeEl) {\n if (!lhsVisible || !showLine) {\n numberBadgeEl.setAttribute(\"visibility\", \"hidden\");\n } else {\n numberBadgeEl.setAttribute(\"visibility\", \"visible\");\n numberBadgeEl.setAttribute(\"transform\", `translate(${entry.x2 - 42}, ${y2})`);\n }\n }\n });\n\n // ── UNIVERSAL OFF-SCREEN ARROWS (ALWAYS ORIGINATE EXACTLY AT THE SPINE: X1 + 75) ──\n if (hasActiveConnections && universalSpineX > 0) {\n const upStroke = pathRefs.current[\"guideline-up-stroke\"];\n const upBadge = pathRefs.current[\"guideline-up-badge\"];\n const upArrow = pathRefs.current[\"guideline-up-arrow\"];\n const upText = pathRefs.current[\"guideline-up-text\"];\n const upRect = pathRefs.current[\"guideline-up-badge-rect\"];\n\n if (topCount > 0) {\n const upY = Math.max(15, rightTop - containerTop + 15); \n const r = Math.min(15, Math.abs(universalSpineX - sharedX1), Math.max(0, sharedY1 - upY));\n const pathD = `M ${sharedX1},${sharedY1} L ${universalSpineX - r},${sharedY1} Q ${universalSpineX},${sharedY1} ${universalSpineX},${sharedY1 - r} L ${universalSpineX},${upY}`;\n\n upStroke?.setAttribute(\"visibility\", \"visible\");\n upStroke?.setAttribute(\"d\", pathD);\n upStroke?.setAttribute(\"stroke\", sharedColor);\n\n upBadge?.setAttribute(\"visibility\", \"visible\");\n upBadge?.setAttribute(\"transform\", `translate(${universalSpineX}, ${upY})`);\n \n if (upArrow) { upArrow.setAttribute(\"fill\", sharedColor); }\n if (upText) { upText.textContent = `+${topCount}`; upText.setAttribute(\"fill\", sharedTextCol); }\n if (upRect) { upRect.setAttribute(\"stroke\", sharedColor); }\n } else {\n upStroke?.setAttribute(\"visibility\", \"hidden\");\n upBadge?.setAttribute(\"visibility\", \"hidden\");\n }\n\n const downStroke = pathRefs.current[\"guideline-down-stroke\"];\n const downBadge = pathRefs.current[\"guideline-down-badge\"];\n const downArrow = pathRefs.current[\"guideline-down-arrow\"];\n const downText = pathRefs.current[\"guideline-down-text\"];\n const downRect = pathRefs.current[\"guideline-down-badge-rect\"];\n\n if (bottomCount > 0) {\n const downY = Math.min(containerHeight - 15, rightBottom - containerTop - 15);\n const r = Math.min(15, Math.abs(universalSpineX - sharedX1), Math.max(0, downY - sharedY1));\n const pathD = `M ${sharedX1},${sharedY1} L ${universalSpineX - r},${sharedY1} Q ${universalSpineX},${sharedY1} ${universalSpineX},${sharedY1 + r} L ${universalSpineX},${downY}`;\n\n downStroke?.setAttribute(\"visibility\", \"visible\");\n downStroke?.setAttribute(\"d\", pathD);\n downStroke?.setAttribute(\"stroke\", sharedColor);\n\n downBadge?.setAttribute(\"visibility\", \"visible\");\n downBadge?.setAttribute(\"transform\", `translate(${universalSpineX}, ${downY})`);\n \n if (downArrow) { downArrow.setAttribute(\"fill\", sharedColor); }\n if (downText) { downText.textContent = `+${bottomCount}`; downText.setAttribute(\"fill\", sharedTextCol); }\n if (downRect) { downRect.setAttribute(\"stroke\", sharedColor); }\n } else {\n downStroke?.setAttribute(\"visibility\", \"hidden\");\n downBadge?.setAttribute(\"visibility\", \"hidden\");\n }\n }\n }, []);\n\n const calculateLinesDebounced = useCallback(() => {\n if (cachedConnectedPositions.current.length > 0 && !isAnimatingRef.current) {\n return;\n }\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n calculateLinesRef.current();\n timerRef.current = null;\n }, 50);\n }, []); \n \n \n const handleColumnScroll = useCallback((e: any) => {\n if (pendingScrollTargetRef.current !== null && pendingScrollCallbackRef.current) {\n if (Math.abs(e.currentTarget.scrollTop - pendingScrollTargetRef.current) <= 2) {\n const callback = pendingScrollCallbackRef.current;\n pendingScrollTargetRef.current = null;\n pendingScrollCallbackRef.current = null;\n callback();\n }\n }\n \n if (scrollSyncing.current) return;\n if (scrollLock.current) return;\n\n if (\n maintainRelativeOrder &&\n scrollSyncLocked &&\n (isSideBySideRef.current || connectedSections.size > 0)\n ) {\n const source = e.currentTarget as HTMLElement;\n const leftContainer = leftContainerRef.current;\n const rightContainer = rightContainerRef.current;\n const target =\n source === leftContainer\n ? rightContainer\n : source === rightContainer\n ? leftContainer\n : null;\n\n if (source && target) {\n const resolveActiveAnchors = () => {\n const activeLeftIdx = activeSideBySideSectionRef.current;\n const activeRightIdx = activeSideBySideRightSectionRef.current;\n\n if (activeLeftIdx === null) return { leftAnchor: null, rightAnchor: null };\n\n if (\n typeof activeLeftIdx === \"string\" &&\n activeLeftIdx.includes(DEVIATION_BADGE_SEPARATOR)\n ) {\n const parts = activeLeftIdx.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n\n return {\n leftAnchor:\n lhsBadgeRefs.current[refId]?.current ||\n subSectionLeftRefs.current[parts[2]]?.current ||\n sectionLeftRefs.current[Number(parts[2])]?.current ||\n null,\n rightAnchor:\n rhsBadgeRefs.current[refId]?.current ||\n subSectionRightRefs.current[parts[3]]?.current ||\n sectionRightRefs.current[Number(parts[3])]?.current ||\n null,\n };\n }\n\n const leftIdx = Number(activeLeftIdx);\n const rightIdx = activeRightIdx !== null ? Number(activeRightIdx) : leftIdx;\n\n return {\n leftAnchor:\n lhsBadgeRefs.current[leftIdx]?.current ||\n sectionRowRefs.current[leftIdx]?.current ||\n sectionLeftRefs.current[leftIdx]?.current ||\n null,\n rightAnchor:\n rhsBadgeRefs.current[rightIdx]?.current ||\n sectionRightRefs.current[rightIdx]?.current ||\n null,\n };\n };\n\n const { leftAnchor, rightAnchor } = resolveActiveAnchors();\n const sourceAnchor = source === leftContainer ? leftAnchor : rightAnchor;\n const targetAnchor = source === leftContainer ? rightAnchor : leftAnchor;\n\n let nextTargetTop: number | null = null;\n\n if (sourceAnchor && targetAnchor) {\n const sourceAnchorRect = sourceAnchor.getBoundingClientRect();\n const targetAnchorRect = targetAnchor.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n\n const sourceAnchorCenterY =\n sourceAnchorRect.top + sourceAnchorRect.height / 2;\n const targetAnchorAbsoluteCenterY =\n targetAnchorRect.top -\n targetRect.top +\n target.scrollTop +\n targetAnchorRect.height / 2;\n\n nextTargetTop =\n targetAnchorAbsoluteCenterY - (sourceAnchorCenterY - targetRect.top);\n } else {\n const sourceMaxScroll = Math.max(0, source.scrollHeight - source.clientHeight);\n const targetMaxScroll = Math.max(0, target.scrollHeight - target.clientHeight);\n nextTargetTop = sourceMaxScroll > 0\n ? (source.scrollTop / sourceMaxScroll) * targetMaxScroll\n : source.scrollTop;\n }\n\n const targetMaxScroll = Math.max(0, target.scrollHeight - target.clientHeight);\n nextTargetTop = Math.max(0, Math.min(nextTargetTop, targetMaxScroll));\n\n if (Math.abs(target.scrollTop - nextTargetTop) > 1) {\n scrollSyncing.current = true;\n target.scrollTop = nextTargetTop;\n requestAnimationFrame(() => {\n scrollSyncing.current = false;\n });\n }\n }\n }\n \n if (!maintainRelativeOrder) {\n calculateLinesDebounced();\n }\n \n if (!scrollTicking.current) {\n scrollTicking.current = true;\n \n requestAnimationFrame(() => {\n if (isSideBySideRef.current) {\n const leftContainer = leftContainerRef.current;\n const rightContainer = rightContainerRef.current;\n \n if (leftContainer && rightContainer && sideBySideLineRef.current) {\n if (!sideBySideCacheRef.current) {\n const activeLeftIdx = activeSideBySideSectionRef.current;\n let lBadge;\n \n if (typeof activeLeftIdx === 'string' && activeLeftIdx.includes(DEVIATION_BADGE_SEPARATOR)) {\n const parts = activeLeftIdx.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n lBadge = lhsBadgeRefs.current[refId]?.current;\n } else {\n lBadge = lhsBadgeRefs.current[activeLeftIdx as number]?.current;\n }\n \n if (lBadge) {\n const lRect = lBadge.getBoundingClientRect();\n sideBySideCacheRef.current = {\n badgeScreenY: lRect.top + lRect.height / 2, \n initialScrollTop: leftContainer.scrollTop, \n leftTop: leftContainer.getBoundingClientRect().top,\n leftBottom: leftContainer.getBoundingClientRect().top + leftContainer.clientHeight,\n cTop: containerRef.current?.getBoundingClientRect().top ?? 0\n };\n }\n }\n \n if (sideBySideCacheRef.current) {\n const cache = sideBySideCacheRef.current;\n const scrollDelta = leftContainer.scrollTop - cache.initialScrollTop;\n const rawLhsY = cache.badgeScreenY - scrollDelta;\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n const clampedLhsY = clamp(rawLhsY, cache.leftTop, cache.leftBottom);\n const horizontalY = (clampedLhsY - cache.cTop).toString();\n const isVisible = rawLhsY >= cache.leftTop - 4 && rawLhsY <= cache.leftBottom + 4;\n \n sideBySideLineRef.current.setAttribute(\"y1\", horizontalY);\n sideBySideLineRef.current.setAttribute(\"y2\", horizontalY); \n sideBySideLineRef.current.setAttribute(\"visibility\", isVisible ? \"visible\" : \"hidden\");\n }\n }\n }\n \n updateConnectedLinesOnScroll(); \n scrollTicking.current = false;\n });\n }\n }, [\n updateConnectedLinesOnScroll,\n maintainRelativeOrder,\n scrollSyncLocked,\n connectedSections,\n calculateLinesDebounced,\n ]);\n\n\n useEffect(() => {\n calculateLinesRef.current = calculateLines;\n }, [calculateLines]);\n\n useEffect(() => {\n const timer = setTimeout(calculateLinesDebounced, 250);\n const onWindowResize = () => handleResizeRef.current();\n window.addEventListener(\"resize\", onWindowResize);\n \n return () => {\n clearTimeout(timer);\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n if (resizeTimerRef.current !== null) clearTimeout(resizeTimerRef.current);\n window.removeEventListener(\"resize\", onWindowResize);\n };\n }, [\n activeProposed,\n existingRule,\n analysisData,\n visibleFields,\n expandedSections,\n expandedSubSections,\n proposedSections,\n existingSections,\n resolvedComparisonConfig,\n calculateLinesDebounced,\n isSideBySide,\n activeSideBySideSection,\n isArrowVisible,\n connectedSections,\n ]);\n\n\n return {\n lines, setLines,\n overallConnector, setOverallConnector,\n connectedLines, setConnectedLines,\n svgDimensions,\n cachedConnectedPositions,\n calculateLines,\n calculateLinesRef,\n calculateLinesDebounced,\n handleColumnScroll,\n}\n\n}"],"names":["useLinesCalculator","containerRef","leftContainerRef","rightContainerRef","svgContainerRef","pathRefs","leftHeaderRef","rightHeaderRef","proposedSections","existingSections","visibleFields","leftRefs","rightRefs","sectionLeftRefs","sectionRightRefs","subSectionLeftRefs","subSectionRightRefs","lhsBadgeRefs","rhsBadgeRefs","sectionRowRefs","expandedSections","expandedSubSections","connectedSections","isSideBySide","activeSideBySideSection","maintainRelativeOrder","isGuidelineMode","cognitiveMap","getSectionCompareStyle","getSubSectionCompareStyle","getDeviationStyleByKey","isArrowVisible","isAnimatingRef","isSideBySideRef","sideBySideCacheRef","sideBySideLineRef","activeSideBySideSectionRef","activeSideBySideRightSectionRef","connectedLines","providedConnectedLines","setConnectedLines","providedSetConnectedLines","cachedConnectedPositions","providedCachedConnectedPositions","calculateLinesRef","resizeTimerRef","scrollLock","scrollSyncLocked","handleResizeRef","activeProposed","existingRule","analysisData","pendingScrollTargetRef","pendingScrollCallbackRef","resolvedComparisonConfig","getFieldData","lines","setLines","useState","overallConnector","setOverallConnector","internalConnectedLines","internalSetConnectedLines","svgDimensions","setSvgDimensions","width","height","isCalculatingLines","useRef","scrollTicking","scrollSyncing","timerRef","internalCachedConnectedPositions","getRoundedStaggeredPath","x1","y1","x2","y2","cX","visL","visR","Math","abs","r1","min","r2","dy1","dy2","dx2","calculateLines","useCallback","current","isSubSectionVisible","keyPath","pathParts","split","rootIdx","ancestorPath","i","length","containerRect","getBoundingClientRect","newLines","forEach","key","l","r","style","minHeight","idx","max","Object","keys","fieldHeights","lRect","rRect","syncHeights","left","right","subSectionHeights","leftIdx","leftSec","refIndexes","rhsSelfIdx","rhsArrayIdx","findIndex","s","selfIndex","maxH","DEVIATION_BADGE_SEPARATOR","offsetParent","entries","Number","getMappedRightIndexes","mapped","map","filter","Array","from","Set","continuationSourceIdx","continuationSourceRowId","section","comparisonRowId","resolvedLeftIdx","lWrap","rWrap","leftRect","rightRect","top","leftTop","rightTop","leftBottom","clientHeight","Infinity","rightBottom","clamp","v","push","id","sectionIdx","targetRightIdx","isSubSection","isMappingContinuation","hasCognitive","cognitiveData","nodeId","includes","devKey","leftKeyPath","rightKeyPath","refId","lBadgeEl","rBadgeEl","subSectionKeyPath","leftHeaderRect","rightHeaderRect","overallY","y","size","newConnectedLines","leftContainer","rightContainer","newCache","leftScrollTop","scrollTop","rightScrollTop","cTop","connectedIdx","lBadge","leftIdxNum","targetMarks","getVisibleGuidelineTargets","rBadge","index","centerX","rawLhsY","rawRhsY","lhsScrollY","rhsScrollY","styleId","baseLabel","n","join","String","letter","fromCharCode","matchLabel","containerTop","styleColor","badgeBorder","styleBg","badgeBg","styleText","badgeText","clampedLhsY","clampedRhsY","pathD","isGuideline","setTimeout","updateConnectedLinesOnScroll","e","console","error","cache","setAttribute","leftScroll","rightScroll","leftHeight","rightHeight","containerHeight","topCount","bottomCount","sharedX1","sharedY1","sharedColor","sharedTextCol","hasActiveConnections","universalSpineX","entry","lhsViewportY","rhsViewportY","strokeEl","bgEl","btnEl","numberBadgeEl","visibleLhsY","visibleRhsY","lhsVisible","rhsVisible","showLine","upStroke","upBadge","upArrow","upText","upRect","upY","textContent","downStroke","downBadge","downArrow","downText","downRect","downY","calculateLinesDebounced","clearTimeout","handleColumnScroll","currentTarget","callback","source","target","resolveActiveAnchors","activeLeftIdx","activeRightIdx","leftAnchor","rightAnchor","parts","rightIdx","sourceAnchor","targetAnchor","nextTargetTop","sourceAnchorRect","targetAnchorRect","targetRect","sourceAnchorCenterY","sourceMaxScroll","scrollHeight","targetMaxScroll","requestAnimationFrame","badgeScreenY","initialScrollTop","scrollDelta","horizontalY","toString","isVisible","useEffect","timer","onWindowResize","window","addEventListener","removeEventListener"],"mappings":"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"}
1
+ {"version":3,"file":"useLinesCalculator.js","sources":["../../../../src/features/CognitiveCompare/hooks/useLinesCalculator.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\"\nimport { CachedBadgePosition, SectionBlock } from \"../CognitiveCompareTypes\";\nimport { DEVIATION_BADGE_SEPARATOR, getBentArrowPath, hasValue } from \"../CognitiveComparehelpers\";\nimport { maxHeight } from \"@mui/system\";\n\nexport const 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, // ── NEW PROP ──\n cognitiveMap,\n getSectionCompareStyle, getSubSectionCompareStyle, getDeviationStyleByKey,\n isArrowVisible,\n\n isAnimatingRef,\n isSideBySideRef,\n sideBySideCacheRef,\n sideBySideLineRef,\n activeSideBySideSectionRef,\n activeSideBySideRightSectionRef,\n connectedLines: providedConnectedLines,\n setConnectedLines: providedSetConnectedLines,\n cachedConnectedPositions: providedCachedConnectedPositions,\n calculateLinesRef,\n resizeTimerRef,\n scrollLock,\n scrollSyncLocked,\n\n handleResizeRef,\n activeProposed, existingRule, analysisData,\n pendingScrollTargetRef, pendingScrollCallbackRef,\n\n resolvedComparisonConfig,\n getFieldData\n}: any) => {\n // States and Refs\n const [lines, setLines] = useState<Record<string, any>[]>([]);\n const [overallConnector, setOverallConnector] = useState<{ x1: number; x2: number; y: number; } | null>(null);\n const [internalConnectedLines, internalSetConnectedLines] = useState<Record<string, any>[]>([]);\n const connectedLines = providedConnectedLines ?? internalConnectedLines;\n const setConnectedLines = providedSetConnectedLines ?? internalSetConnectedLines;\n const [svgDimensions, setSvgDimensions] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n\n const isCalculatingLines = useRef(false);\n const scrollTicking = useRef(false);\n const scrollSyncing = useRef(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const internalCachedConnectedPositions = useRef<CachedBadgePosition[]>([]);\n const cachedConnectedPositions =\n providedCachedConnectedPositions ?? internalCachedConnectedPositions;\n\n\n \n // Helpers\n // ── UNIFIED ROUNDED PATH GENERATOR (Guarantees shared trunk for ALL modes) ──\n const getRoundedStaggeredPath = (x1: number, y1: number, x2: number, y2: number, cX: number, visL: boolean, visR: boolean) => {\n if (Math.abs(y2 - y1) <= 1) {\n if (visL && visR) return `M ${x1},${y1} L ${x2},${y2}`;\n if (visL && !visR) return `M ${x1},${y1} L ${cX},${y1}`;\n if (!visL && visR) return `M ${cX},${y1} L ${x2},${y2}`;\n return `M ${cX},${y1} L ${cX},${y2}`;\n }\n const r1 = Math.min(15, Math.abs(cX - x1), Math.abs(y2 - y1) / 2);\n const r2 = Math.min(15, Math.abs(x2 - cX), Math.abs(y2 - y1) / 2);\n const dy1 = y2 > y1 ? r1 : -r1;\n const dy2 = y2 > y1 ? r2 : -r2;\n const dx2 = x2 > cX ? r2 : -r2; // Safe horizontal direction\n \n if (visL && visR) {\n return `M ${x1},${y1} L ${cX - r1},${y1} Q ${cX},${y1} ${cX},${y1 + dy1} L ${cX},${y2 - dy2} Q ${cX},${y2} ${cX + dx2},${y2} L ${x2},${y2}`;\n } else if (visL && !visR) {\n return `M ${x1},${y1} L ${cX - r1},${y1} Q ${cX},${y1} ${cX},${y1 + dy1} L ${cX},${y2}`;\n } else if (!visL && visR) {\n return `M ${cX},${y1} L ${cX},${y2 - dy2} Q ${cX},${y2} ${cX + dx2},${y2} L ${x2},${y2}`;\n } else {\n return `M ${cX},${y1} L ${cX},${y2}`;\n }\n };\n\n // Helper to check if a subsection is actually visible in the expanded section\n const isSubSectionVisible = (keyPath: string) => {\n const pathParts = keyPath.split('-');\n const rootIdx = pathParts[0];\n\n // Edge case\n // Early return if root parent is not expanded\n // Only happens in side by side view for deeply nested children\n if (!expandedSections[rootIdx] && maintainRelativeOrder === false) return;\n\n if (maintainRelativeOrder) {\n if (!expandedSections[`left-${rootIdx}`] && !expandedSections[`right-${rootIdx}`] && !expandedSections[rootIdx]) return false;\n }\n\n // Check to confirm if all the ancestors of the node are expanded otherwise early return\n let ancestorPath = rootIdx;\n for (let i = 1; i < pathParts.length - 1; i++) {\n ancestorPath += `-${pathParts[i]}`;\n if (!expandedSections[ancestorPath]) return false;\n }\n\n return true;\n };\n\n // Callbacks\n const calculateLines = useCallback(() => {\n if (isCalculatingLines.current) return;\n if (isAnimatingRef.current) return;\n isCalculatingLines.current = true;\n try {\n if (!containerRef.current) return;\n\n // Helper to check if a subsection is actually visible in the expanded accordion tree\n const isSubSectionVisible = (keyPath: string) => {\n const pathParts = keyPath.split('-');\n const rootIdx = pathParts[0];\n\n // 1. Root Parent must be expanded\n if (!expandedSections[rootIdx] && maintainRelativeOrder === false) return false;\n if (maintainRelativeOrder) {\n if (!expandedSections[`left-${rootIdx}`] && !expandedSections[`right-${rootIdx}`] && !expandedSections[rootIdx]) return false;\n }\n\n // 2. All intermediate ancestor subsections must be expanded\n let ancestorPath = rootIdx;\n for (let i = 1; i < pathParts.length - 1; i++) {\n ancestorPath += `-${pathParts[i]}`;\n if (!expandedSubSections[ancestorPath]) {\n return false;\n }\n }\n return true;\n };\n\n // 3. Keep the SVG setup and field heights logic intact\n const containerRect = containerRef.current.getBoundingClientRect();\n setSvgDimensions({\n width: containerRect.width,\n height: containerRect.height,\n });\n\n const newLines: Record<string, any>[] = [];\n\n // RESET STYLES (WRITE ONLY)\n visibleFields.forEach(({ key }: {key: any}) => {\n const l = leftRefs.current[key]?.current;\n const r = rightRefs.current[key]?.current;\n\n if (l && r) {\n l.style.height = \"auto\";\n r.style.height = \"auto\";\n l.style.minHeight = \"0px\";\n r.style.minHeight = \"0px\";\n }\n });\n\n if (!isAnimatingRef.current) {\n for (let idx = 0; idx < Math.max(proposedSections.length, existingSections.length); idx++) {\n const l = sectionLeftRefs.current[idx]?.current;\n const r = sectionRightRefs.current[idx]?.current;\n\n if (l) {\n l.style.height = \"auto\";\n l.style.minHeight = \"0px\";\n }\n if (r) {\n r.style.height = \"auto\";\n r.style.minHeight = \"0px\";\n }\n }\n \n if (!maintainRelativeOrder) {\n // Subsections reset\n Object.keys(subSectionLeftRefs.current).forEach(keyPath => {\n if (!isSubSectionVisible(keyPath)) return;\n const l = subSectionLeftRefs.current[keyPath]?.current;\n const r = subSectionRightRefs.current[keyPath]?.current;\n if (l && r) {\n l.style.height = \"auto\";\n r.style.height = \"auto\";\n l.style.minHeight = \"0px\";\n r.style.minHeight = \"0px\";\n }\n });\n }\n }\n\n // READ HEIGHTS (READ ONLY)\n const fieldHeights: Record<string, number> = {};\n\n visibleFields.forEach(({ key } : {key: any}) => {\n const l = leftRefs.current[key]?.current;\n const r = rightRefs.current[key]?.current;\n\n if (l && r) {\n const lRect = l.getBoundingClientRect();\n const rRect = r.getBoundingClientRect();\n fieldHeights[key] = Math.max(lRect.height, rRect.height);\n }\n });\n\n const syncHeights = { left: {} as Record<number, number>, right: {} as Record<number, number> };\n const subSectionHeights: Record<string, number> = {};\n\n if (!isAnimatingRef.current) {\n if (!maintainRelativeOrder) {\n // ── FIX: Measure and apply subsection heights FIRST so their new heights push the parent containers ──\n Object.keys(subSectionLeftRefs.current).forEach(keyPath => {\n if (!isSubSectionVisible(keyPath)) return;\n const l = subSectionLeftRefs.current[keyPath]?.current;\n const r = subSectionRightRefs.current[keyPath]?.current;\n if (l && r && l.offsetParent !== null && r.offsetParent !== null) {\n const lRect = l.getBoundingClientRect();\n const rRect = r.getBoundingClientRect();\n const maxH = Math.max(lRect.height, rRect.height);\n subSectionHeights[keyPath] = maxH;\n \n // Apply immediately so the browser recalculates layout for the parent block below\n l.style.minHeight = `${maxH}px`;\n r.style.minHeight = `${maxH}px`;\n }\n });\n\n // ── NOW measure main sections (which will naturally wrap the aligned subsections) ──\n for (let idx = 0; idx < Math.min(proposedSections.length, existingSections.length); idx++) {\n const l = sectionLeftRefs.current[idx]?.current;\n const r = sectionRightRefs.current[idx]?.current;\n\n if (l && r) {\n const maxH = Math.max(l.getBoundingClientRect().height, r.getBoundingClientRect().height);\n syncHeights.left[idx] = maxH;\n syncHeights.right[idx] = maxH;\n }\n }\n\n } else if (isSideBySide && activeSideBySideSection !== null) {\n if (typeof activeSideBySideSection === \"number\") {\n const leftIdx = activeSideBySideSection;\n const leftSec = proposedSections[leftIdx] as any;\n const l = sectionLeftRefs.current[leftIdx]?.current;\n\n if (l && leftSec) {\n (leftSec.refIndexes || []).forEach((rhsSelfIdx: number) => {\n const rhsArrayIdx = existingSections.findIndex((s: any) => s.selfIndex === rhsSelfIdx);\n const r = sectionRightRefs.current[rhsArrayIdx]?.current;\n if (!r) return;\n\n if (expandedSections[`left-${leftIdx}`] || expandedSections[`right-${rhsArrayIdx}`]) {\n const maxH = Math.max(l.getBoundingClientRect().height, r.getBoundingClientRect().height);\n syncHeights.left[leftIdx] = Math.max(syncHeights.left[leftIdx] || 0, maxH);\n syncHeights.right[rhsArrayIdx] = Math.max(syncHeights.right[rhsArrayIdx] || 0, maxH);\n }\n });\n }\n } else {\n const keyPath = activeSideBySideSection.split(DEVIATION_BADGE_SEPARATOR)[2]; \n if (keyPath) {\n const l = subSectionLeftRefs.current[keyPath]?.current;\n const r = subSectionRightRefs.current[keyPath]?.current;\n if (l && r) {\n const maxH = Math.max(l.getBoundingClientRect().height, r.getBoundingClientRect().height);\n subSectionHeights[keyPath] = Math.max(subSectionHeights[keyPath] || 0, maxH);\n }\n }\n }\n }\n }\n\n visibleFields.forEach(({ key } : {key : any}) => {\n const l = leftRefs.current[key]?.current;\n const r = rightRefs.current[key]?.current;\n\n if (l && r) {\n const maxH = fieldHeights[key];\n l.style.minHeight = `${maxH}px`;\n r.style.minHeight = `${maxH}px`;\n }\n });\n\n if (!isAnimatingRef.current) {\n Object.entries(syncHeights.left).forEach(([idx, maxH]) => {\n const l = sectionLeftRefs.current[Number(idx)]?.current;\n if (l) l.style.minHeight = `${maxH}px`;\n });\n \n Object.entries(syncHeights.right).forEach(([idx, maxH]) => {\n const r = sectionRightRefs.current[Number(idx)]?.current;\n if (r) r.style.minHeight = `${maxH}px`;\n });\n\n if (!maintainRelativeOrder) {\n Object.keys(subSectionHeights).forEach(keyPath => {\n const l = subSectionLeftRefs.current[keyPath]?.current;\n const r = subSectionRightRefs.current[keyPath]?.current;\n if (l && r && subSectionHeights[keyPath]) {\n const maxH = subSectionHeights[keyPath];\n l.style.minHeight = `${maxH}px`;\n r.style.minHeight = `${maxH}px`;\n }\n });\n }\n }\n\n // SECTION CONNECTORS\n // ── SKIP SECTION LINES IF IN GUIDELINE MODE ──\n if (!isGuidelineMode) {\n const getMappedRightIndexes = (leftSec: any, leftIdx: number) => {\n // Standard/Side-by-Side data is already materialized as explicit\n // mapping rows, so its counterpart is always at the same row index.\n // Looking up by display_index is ambiguous when a target section is\n // intentionally repeated for more than one mapping edge.\n if (!maintainRelativeOrder) {\n return existingSections[leftIdx] ? [leftIdx] : [];\n }\n\n const mapped = (leftSec.refIndexes || [])\n .map((rhsSelfIdx: number) =>\n existingSections.findIndex((s: any) => s.selfIndex === rhsSelfIdx),\n )\n .filter((idx: number) => idx !== -1);\n\n // Backward-compatible fallback for old one-to-one/index-based data\n if (!mapped.length && existingSections[leftIdx]) {\n return [leftIdx];\n }\n\n return Array.from(new Set(mapped));\n };\n\n proposedSections.forEach((leftSec: any, leftIdx: number) => {\n const continuationSourceIdx = leftSec.continuationSourceRowId\n ? proposedSections.findIndex(\n (section: any) =>\n section.comparisonRowId === leftSec.continuationSourceRowId,\n )\n : -1;\n const resolvedLeftIdx =\n continuationSourceIdx >= 0 ? continuationSourceIdx : leftIdx;\n const lWrap = sectionLeftRefs.current[resolvedLeftIdx]?.current;\n if (!lWrap) return;\n\n const rightIndexes = getMappedRightIndexes(leftSec, leftIdx);\n\n rightIndexes.forEach((rhsArrayIdx: any) => {\n const rWrap = sectionRightRefs.current[rhsArrayIdx]?.current;\n if (!rWrap) return;\n\n const leftRect = lWrap.getBoundingClientRect();\n const rightRect = rWrap.getBoundingClientRect();\n\n const x1 = leftRect.right - containerRect.left;\n const x2 = rightRect.left - containerRect.left;\n\n let y1 = leftRect.top + 18 - containerRect.top;\n let y2 = rightRect.top + 18 - containerRect.top;\n\n if (maintainRelativeOrder && isSideBySide && activeSideBySideSection === leftIdx) {\n const leftTop = leftContainerRef.current?.getBoundingClientRect().top ?? 0;\n const rightTop = rightContainerRef.current?.getBoundingClientRect().top ?? 0;\n const leftBottom = leftTop + (leftContainerRef.current?.clientHeight ?? Infinity);\n const rightBottom = rightTop + (rightContainerRef.current?.clientHeight ?? Infinity);\n\n const clamp = (v: number, min: number, max: number) =>\n Math.max(min, Math.min(max, v));\n\n y1 = clamp(leftRect.top + 18, leftTop, leftBottom) - containerRect.top;\n y2 = clamp(rightRect.top + 18, rightTop, rightBottom) - containerRect.top;\n }\n\n const style = getSectionCompareStyle(resolvedLeftIdx);\n\n if (style) {\n newLines.push({\n id: `line-${resolvedLeftIdx}-${rhsArrayIdx}`,\n x1,\n y1,\n x2,\n y2,\n style,\n sectionIdx: resolvedLeftIdx,\n targetRightIdx: rhsArrayIdx,\n isSubSection: false,\n isMappingContinuation: continuationSourceIdx >= 0,\n hasCognitive: !!(\n proposedSections[resolvedLeftIdx]?.cognitiveData ||\n existingSections[rhsArrayIdx]?.cognitiveData ||\n proposedSections[resolvedLeftIdx]?.nodeId &&\n cognitiveMap[proposedSections[resolvedLeftIdx].nodeId as string]\n ),\n });\n }\n });\n });\n }\n\n if (!isGuidelineMode && isSideBySide && typeof activeSideBySideSection === 'string' && activeSideBySideSection.includes(DEVIATION_BADGE_SEPARATOR)) {\n const [nodeId, devKey, leftKeyPath, rightKeyPath] = activeSideBySideSection.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${nodeId}${DEVIATION_BADGE_SEPARATOR}${devKey}`;\n\n const lBadgeEl = lhsBadgeRefs.current[refId]?.current;\n const rBadgeEl = rhsBadgeRefs.current[refId]?.current;\n\n if (lBadgeEl && rBadgeEl) {\n const lRect = lBadgeEl.getBoundingClientRect();\n const rRect = rBadgeEl.getBoundingClientRect();\n\n const x1 = lRect.right - containerRect.left;\n const x2 = rRect.left - containerRect.left;\n \n let y1 = lRect.top + lRect.height / 2 - containerRect.top;\n let y2 = rRect.top + rRect.height / 2 - containerRect.top;\n\n if (maintainRelativeOrder) {\n const leftTop = leftContainerRef.current?.getBoundingClientRect().top ?? 0;\n const rightTop = rightContainerRef.current?.getBoundingClientRect().top ?? 0;\n const leftBottom = leftTop + (leftContainerRef.current?.clientHeight ?? Infinity);\n const rightBottom = rightTop + (rightContainerRef.current?.clientHeight ?? Infinity);\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n y1 = clamp(lRect.top + lRect.height / 2, leftTop, leftBottom) - containerRect.top;\n y2 = clamp(rRect.top + rRect.height / 2, rightTop, rightBottom) - containerRect.top;\n }\n \n const style =\n getDeviationStyleByKey(nodeId, devKey) ??\n getSubSectionCompareStyle(leftKeyPath);\n if (style) {\n newLines.push({\n id: `line-subsec-${refId}`,\n x1, y1, x2, y2,\n style,\n sectionIdx: Number(leftKeyPath.split('-')[0]),\n isSubSection: true,\n subSectionKeyPath: activeSideBySideSection,\n });\n }\n }\n }\n\n setLines(newLines);\n\n if (leftHeaderRef.current && rightHeaderRef.current) {\n const leftHeaderRect = leftHeaderRef.current.getBoundingClientRect();\n const rightHeaderRect = rightHeaderRef.current.getBoundingClientRect();\n const overallY =\n (leftHeaderRect.top +\n leftHeaderRect.height / 2 -\n containerRect.top +\n rightHeaderRect.top +\n rightHeaderRect.height / 2 -\n containerRect.top) /\n 2;\n setOverallConnector({\n x1: leftHeaderRect.right - containerRect.left,\n x2: rightHeaderRect.left - containerRect.left,\n y: overallY,\n });\n } else {\n setOverallConnector(null);\n }\n\n if (connectedSections.size > 0) {\n const newConnectedLines: Record<string, any>[] = [];\n const leftContainer = leftContainerRef.current;\n const rightContainer = rightContainerRef.current;\n\n if (leftContainer && rightContainer) {\n const newCache: CachedBadgePosition[] = [];\n \n const leftTop = leftContainer.getBoundingClientRect().top;\n const rightTop = rightContainer.getBoundingClientRect().top;\n const leftBottom = leftTop + leftContainer.clientHeight;\n const rightBottom = rightTop + rightContainer.clientHeight;\n\n const leftScrollTop = leftContainer.scrollTop;\n const rightScrollTop = rightContainer.scrollTop;\n const cTop = containerRect.top;\n\n const clamp = (v: number, min: number, max: number) =>\n Math.max(min, Math.min(max, v));\n\n connectedSections.forEach((connectedIdx:any) => {\n // ── GUIDELINE MODE LOGIC ──\n if (isGuidelineMode) {\n let lBadge: HTMLElement | null = null;\n let leftIdxNum: number | null = null;\n let style: any = null;\n\n if (typeof connectedIdx === 'string' && connectedIdx.includes(DEVIATION_BADGE_SEPARATOR)) {\n const [nodeId, devKey, leftKeyPath] = connectedIdx.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${nodeId}${DEVIATION_BADGE_SEPARATOR}${devKey}`;\n lBadge = lhsBadgeRefs.current[refId]?.current;\n style = getDeviationStyleByKey(nodeId, devKey) ?? getSubSectionCompareStyle(leftKeyPath);\n leftIdxNum = Number(leftKeyPath?.split('-')[0] || 0);\n } else {\n leftIdxNum = Number(connectedIdx);\n lBadge = lhsBadgeRefs.current[leftIdxNum]?.current;\n style = getSectionCompareStyle(leftIdxNum);\n }\n\n if (!lBadge) return;\n\n const targetMarks = document.querySelectorAll('[id^=\"guideline-target-\"]');\n \n targetMarks.forEach((rBadge, index) => {\n const lRect = lBadge!.getBoundingClientRect();\n const rRect = rBadge.getBoundingClientRect();\n\n const x1 = lRect.right - containerRect.left;\n const x2 = rRect.left - containerRect.left - 0;\n \n // ── UNIVERSAL SPINE JUNCTION PUSHED TO X1+75 TO CLEAR LOCK ICON ──\n const centerX = x1 + 75;\n\n const rawLhsY = lRect.top + lRect.height / 2;\n // Target the middle of the highlighted text vertically\n const rawRhsY = rRect.top + rRect.height / 2;\n\n const lhsScrollY = (rawLhsY - leftTop) + leftScrollTop;\n const rhsScrollY = (rawRhsY - rightTop) + rightScrollTop;\n \n const styleId = `conn-guide-${connectedIdx}-${index}`;\n \n // ── BULLETPROOF MATH LABEL GENERATION ──\n let baseLabel = \"\";\n if (typeof connectedIdx === 'string' && connectedIdx.includes(DEVIATION_BADGE_SEPARATOR)) {\n const parts = connectedIdx.split(DEVIATION_BADGE_SEPARATOR);\n const leftKeyPath = parts[2] || \"\";\n baseLabel = leftKeyPath.split('-').map(n => Number(n) + 1).join('.');\n } else {\n baseLabel = String(Number(connectedIdx) + 1);\n }\n const letter = String.fromCharCode(97 + index); // a, b, c...\n const matchLabel = targetMarks.length === 1 ? null : `${baseLabel}(${letter})`;\n\n newCache.push({\n lhsScrollY, rhsScrollY, x1, x2, containerTop: cTop,\n leftIdx: connectedIdx, rhsArrayIdx: index, \n styleColor: style?.badgeBorder || \"#6366F1\", \n styleBg: style?.badgeBg || \"#FFFFFF\",\n styleText: style?.badgeText || \"#A16207\",\n styleId, centerX,\n });\n\n const clampedLhsY = clamp(rawLhsY, leftTop, leftBottom);\n const clampedRhsY = clamp(rawRhsY, rightTop, rightBottom);\n\n const y1 = clampedLhsY - cTop;\n const y2 = clampedRhsY - cTop;\n\n const lhsVisible = rawLhsY >= leftTop - 4 && rawLhsY <= leftBottom + 4;\n const rhsVisible = rawRhsY >= rightTop - 4 && rawRhsY <= rightBottom + 4;\n\n const pathD = getRoundedStaggeredPath(x1, y1, x2, y2, centerX, lhsVisible, rhsVisible);\n\n newConnectedLines.push({ \n id: styleId, pathD, style, leftIdx: connectedIdx, rhsArrayIdx: index, \n x1, x2, y1, y2, centerX, matchLabel, isGuideline: true \n });\n });\n } else {\n // ── UNIFIED CONTRACT TO CONTRACT LOGIC ──\n if (typeof connectedIdx === 'string' && connectedIdx.includes(DEVIATION_BADGE_SEPARATOR)) {\n const [nodeId, devKey, leftKeyPath, rightKeyPath] = connectedIdx.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${nodeId}${DEVIATION_BADGE_SEPARATOR}${devKey}`;\n\n const lBadge = lhsBadgeRefs.current[refId]?.current;\n const rBadge = rhsBadgeRefs.current[refId]?.current;\n if (!lBadge || !rBadge) return;\n\n const lRect = lBadge.getBoundingClientRect();\n const rRect = rBadge.getBoundingClientRect();\n const style = getDeviationStyleByKey(nodeId, devKey) ?? getSubSectionCompareStyle(leftKeyPath);\n\n const x1 = lRect.right - containerRect.left;\n const x2 = rRect.left - containerRect.left - 0;\n const centerX = x1 + 75; // ── UNIVERSAL SPINE JUNCTION ──\n\n const rawLhsY = lRect.top + lRect.height / 2;\n const rawRhsY = rRect.top + rRect.height / 2;\n\n const lhsScrollY = (rawLhsY - leftTop) + leftScrollTop;\n const rhsScrollY = (rawRhsY - rightTop) + rightScrollTop;\n const styleId = `conn-subsec-${refId}`;\n \n const leftKeyP = leftKeyPath || \"\";\n const baseLabel = leftKeyP.split('-').map(n => Number(n) + 1).join('.');\n const matchLabel = null; // 1-to-1 connection, no badge needed\n\n newCache.push({\n lhsScrollY, rhsScrollY, x1, x2, containerTop: cTop,\n leftIdx: connectedIdx, rhsArrayIdx: connectedIdx,\n styleColor: style?.badgeBorder || \"#6366F1\", styleBg: style?.badgeBg || \"#FFFFFF\", styleText: style?.badgeText || \"#A16207\",\n styleId, centerX, \n });\n\n const clampedLhsY = clamp(rawLhsY, leftTop, leftBottom);\n const clampedRhsY = clamp(rawRhsY, rightTop, rightBottom);\n const y1 = clampedLhsY - cTop;\n const y2 = clampedRhsY - cTop;\n const lhsVisible = rawLhsY >= leftTop - 4 && rawLhsY <= leftBottom + 4;\n const rhsVisible = rawRhsY >= rightTop - 4 && rawRhsY <= rightBottom + 4;\n\n const pathD = getRoundedStaggeredPath(x1, y1, x2, y2, centerX, lhsVisible, rhsVisible);\n\n newConnectedLines.push({ id: styleId, pathD, style, leftIdx: connectedIdx, rhsArrayIdx: connectedIdx, x1, x2, y1, y2, matchLabel });\n } else {\n if (!maintainRelativeOrder) {\n const leftIdx = connectedIdx;\n const rhsArrayIdx = leftIdx as number;\n const lBadge = lhsBadgeRefs.current[leftIdx]?.current;\n const rBadge = rhsBadgeRefs.current[rhsArrayIdx]?.current;\n if (!lBadge || !rBadge) return;\n\n const lRect = lBadge.getBoundingClientRect();\n const rRect = rBadge.getBoundingClientRect();\n const style = getSectionCompareStyle(leftIdx as number);\n\n const x1 = lRect.right - containerRect.left;\n const x2 = rRect.left - containerRect.left - 0;\n const centerX = x1 + 75; // ── UNIVERSAL SPINE JUNCTION ──\n\n const rawLhsY = lRect.top + lRect.height / 2;\n const rawRhsY = rRect.top + rRect.height / 2;\n const lhsScrollY = (rawLhsY - leftTop) + leftScrollTop;\n const rhsScrollY = (rawRhsY - rightTop) + rightScrollTop;\n const styleId = `conn-${leftIdx}-${rhsArrayIdx}`;\n \n const baseLabel = String(Number(connectedIdx) + 1);\n const matchLabel = null; // 1-to-1 connection, no badge needed\n\n newCache.push({\n lhsScrollY, rhsScrollY, x1, x2, containerTop: cTop,\n leftIdx, rhsArrayIdx, \n styleColor: style?.badgeBorder || \"#6366F1\", styleBg: style?.badgeBg || \"#FFFFFF\", styleText: style?.badgeText || \"#A16207\",\n styleId, centerX,\n });\n\n const clampedLhsY = clamp(rawLhsY, leftTop, leftBottom);\n const clampedRhsY = clamp(rawRhsY, rightTop, rightBottom);\n const y1 = clampedLhsY - cTop;\n const y2 = clampedRhsY - cTop;\n const lhsVisible = rawLhsY >= leftTop - 4 && rawLhsY <= leftBottom + 4;\n const rhsVisible = rawRhsY >= rightTop - 4 && rawRhsY <= rightBottom + 4;\n\n const pathD = getRoundedStaggeredPath(x1, y1, x2, y2, centerX, lhsVisible, rhsVisible);\n\n newConnectedLines.push({ id: styleId, pathD, style, leftIdx, rhsArrayIdx, x1, x2, y1, y2, matchLabel });\n } else {\n const leftIdx = connectedIdx as number;\n const leftSec = proposedSections[leftIdx] as any;\n if (!leftSec?.refIndexes?.length) return;\n\n leftSec.refIndexes.forEach((rhsSelfIdx: number, index: number) => {\n const rhsArrayIdx = existingSections.findIndex((s: any) => s.selfIndex === rhsSelfIdx);\n if (rhsArrayIdx === -1) return;\n\n const lBadge = lhsBadgeRefs.current[leftIdx]?.current;\n const rBadge = rhsBadgeRefs.current[rhsArrayIdx]?.current;\n if (!lBadge || !rBadge) return;\n\n const lRect = lBadge.getBoundingClientRect();\n const rRect = rBadge.getBoundingClientRect();\n const style = getSectionCompareStyle(leftIdx);\n\n const x1 = lRect.right - containerRect.left;\n const x2 = rRect.left - containerRect.left - 0;\n \n const centerX = x1 + 75; // ── UNIVERSAL SPINE JUNCTION ──\n\n const rawLhsY = lRect.top + lRect.height / 2;\n const rawRhsY = rRect.top + rRect.height / 2;\n const lhsScrollY = (rawLhsY - leftTop) + leftScrollTop;\n const rhsScrollY = (rawRhsY - rightTop) + rightScrollTop;\n const styleId = `conn-${leftIdx}-${rhsArrayIdx}`;\n \n const baseLabel = String(Number(connectedIdx) + 1);\n const letter = String.fromCharCode(97 + index); \n const matchLabel = leftSec.refIndexes.length === 1 ? null : `${baseLabel}(${letter})`;\n\n newCache.push({\n lhsScrollY, rhsScrollY, x1, x2, containerTop: cTop,\n leftIdx, rhsArrayIdx,\n styleColor: style?.badgeBorder || \"#6366F1\", styleBg: style?.badgeBg || \"#FFFFFF\", styleText: style?.badgeText || \"#A16207\",\n styleId, centerX,\n });\n\n const clampedLhsY = clamp(rawLhsY, leftTop, leftBottom);\n const clampedRhsY = clamp(rawRhsY, rightTop, rightBottom);\n const y1 = clampedLhsY - cTop;\n const y2 = clampedRhsY - cTop;\n const lhsVisible = rawLhsY >= leftTop - 4 && rawLhsY <= leftBottom + 4;\n const rhsVisible = rawRhsY >= rightTop - 4 && rawRhsY <= rightBottom + 4;\n\n const pathD = getRoundedStaggeredPath(x1, y1, x2, y2, centerX, lhsVisible, rhsVisible);\n\n newConnectedLines.push({\n id: styleId, pathD, style, leftIdx, rhsArrayIdx, x1, x2, y1, y2, matchLabel,\n });\n });\n }\n }\n }\n });\n cachedConnectedPositions.current = newCache;\n }\n setConnectedLines(newConnectedLines);\n\n setTimeout(() => updateConnectedLinesOnScroll(), 10);\n } else {\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n setTimeout(() => updateConnectedLinesOnScroll(), 10);\n }\n } catch (e) {\n console.error(\"Line render safe fail: \", e);\n } finally {\n isCalculatingLines.current = false;\n }\n }, [\n visibleFields,\n proposedSections,\n existingSections,\n cognitiveMap,\n resolvedComparisonConfig,\n getFieldData,\n getSectionCompareStyle,\n getDeviationStyleByKey,\n maintainRelativeOrder,\n isSideBySide, \n activeSideBySideSection, \n connectedSections,\n expandedSections,\n expandedSubSections,\n isGuidelineMode, \n ]);\n\n const updateConnectedLinesOnScroll = useCallback(() => {\n const cache = cachedConnectedPositions.current;\n \n if (!cache.length) {\n pathRefs.current[\"guideline-up-stroke\"]?.setAttribute(\"visibility\", \"hidden\");\n pathRefs.current[\"guideline-up-badge\"]?.setAttribute(\"visibility\", \"hidden\");\n pathRefs.current[\"guideline-down-stroke\"]?.setAttribute(\"visibility\", \"hidden\");\n pathRefs.current[\"guideline-down-badge\"]?.setAttribute(\"visibility\", \"hidden\");\n return;\n }\n\n if (isAnimatingRef.current) return;\n \n const leftScroll = leftContainerRef.current?.scrollTop ?? 0;\n const rightScroll = rightContainerRef.current?.scrollTop ?? 0;\n \n const leftHeight = leftContainerRef.current?.clientHeight ?? Infinity;\n const rightHeight = rightContainerRef.current?.clientHeight ?? Infinity;\n \n const leftTop = leftContainerRef.current?.getBoundingClientRect().top ?? 0;\n const rightTop = rightContainerRef.current?.getBoundingClientRect().top ?? 0;\n \n const leftBottom = leftTop + leftHeight;\n const rightBottom = rightTop + rightHeight;\n \n const containerRect = containerRef.current?.getBoundingClientRect();\n const containerTop = containerRect?.top ?? 0;\n const containerHeight = containerRect?.height ?? Infinity;\n \n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n \n let topCount = 0;\n let bottomCount = 0;\n let sharedX1 = 0, sharedY1 = 0;\n let sharedColor = \"#6366F1\", sharedBg = \"#FFFFFF\", sharedTextCol = \"#A16207\";\n let hasActiveConnections = false;\n let universalSpineX = 0; \n\n cache.forEach((entry: any) => {\n const lhsViewportY = (entry.lhsScrollY - leftScroll) + leftTop;\n const rhsViewportY = (entry.rhsScrollY - rightScroll) + rightTop;\n \n const strokeEl = pathRefs.current[entry.styleId + \"-stroke\"];\n const bgEl = pathRefs.current[entry.styleId + \"-bg\"];\n const btnEl = pathRefs.current[entry.styleId + \"-btn\"];\n const numberBadgeEl = pathRefs.current[entry.styleId + \"-number\"];\n \n if (!strokeEl && !bgEl) return;\n \n const visibleLhsY = clamp(lhsViewportY, leftTop, leftBottom);\n const visibleRhsY = clamp(rhsViewportY, rightTop, rightBottom);\n \n const y1 = visibleLhsY - containerTop;\n const y2 = visibleRhsY - containerTop;\n \n const lhsVisible = lhsViewportY >= leftTop - 4 && lhsViewportY <= leftBottom + 4;\n const rhsVisible = rhsViewportY >= rightTop - 4 && rhsViewportY <= rightBottom + 4;\n \n let showLine = true;\n hasActiveConnections = true;\n\n // Enforce absolute strict universal spine\n const centerX = entry.centerX || (entry.x1 + 75);\n\n if (sharedX1 === 0) {\n sharedX1 = entry.x1;\n sharedY1 = y1;\n universalSpineX = centerX;\n sharedColor = entry.styleColor;\n sharedBg = entry.styleBg || \"#FFFFFF\";\n sharedTextCol = entry.styleText || \"#A16207\";\n }\n\n if (rhsViewportY < rightTop - 4) {\n topCount++; showLine = false; \n } else if (rhsViewportY > rightBottom + 4) {\n bottomCount++; showLine = false; \n } \n \n const pathD = getRoundedStaggeredPath(entry.x1, y1, entry.x2, y2, universalSpineX, lhsVisible, rhsVisible);\n \n if (strokeEl) {\n if (showLine && pathD) {\n strokeEl.setAttribute(\"visibility\", \"visible\");\n strokeEl.setAttribute(\"d\", pathD);\n } else { strokeEl.setAttribute(\"visibility\", \"hidden\"); }\n }\n \n if (bgEl) {\n if (showLine && pathD) {\n bgEl.setAttribute(\"visibility\", \"visible\");\n bgEl.setAttribute(\"d\", pathD);\n } else { bgEl.setAttribute(\"visibility\", \"hidden\"); }\n }\n\n if (btnEl) {\n if (!lhsVisible || !showLine) {\n btnEl.setAttribute(\"visibility\", \"hidden\");\n } else {\n btnEl.setAttribute(\"visibility\", \"visible\");\n btnEl.setAttribute(\"y\", String(y1 - 12)); \n }\n }\n\n if (numberBadgeEl) {\n if (!lhsVisible || !showLine) {\n numberBadgeEl.setAttribute(\"visibility\", \"hidden\");\n } else {\n numberBadgeEl.setAttribute(\"visibility\", \"visible\");\n numberBadgeEl.setAttribute(\"transform\", `translate(${entry.x2 - 42}, ${y2})`);\n }\n }\n });\n\n // ── UNIVERSAL OFF-SCREEN ARROWS (ALWAYS ORIGINATE EXACTLY AT THE SPINE: X1 + 75) ──\n if (hasActiveConnections && universalSpineX > 0) {\n const upStroke = pathRefs.current[\"guideline-up-stroke\"];\n const upBadge = pathRefs.current[\"guideline-up-badge\"];\n const upArrow = pathRefs.current[\"guideline-up-arrow\"];\n const upText = pathRefs.current[\"guideline-up-text\"];\n const upRect = pathRefs.current[\"guideline-up-badge-rect\"];\n\n if (topCount > 0) {\n const upY = Math.max(15, rightTop - containerTop + 15); \n const r = Math.min(15, Math.abs(universalSpineX - sharedX1), Math.max(0, sharedY1 - upY));\n const pathD = `M ${sharedX1},${sharedY1} L ${universalSpineX - r},${sharedY1} Q ${universalSpineX},${sharedY1} ${universalSpineX},${sharedY1 - r} L ${universalSpineX},${upY}`;\n\n upStroke?.setAttribute(\"visibility\", \"visible\");\n upStroke?.setAttribute(\"d\", pathD);\n upStroke?.setAttribute(\"stroke\", sharedColor);\n\n upBadge?.setAttribute(\"visibility\", \"visible\");\n upBadge?.setAttribute(\"transform\", `translate(${universalSpineX}, ${upY})`);\n \n if (upArrow) { upArrow.setAttribute(\"fill\", sharedColor); }\n if (upText) { upText.textContent = `+${topCount}`; upText.setAttribute(\"fill\", sharedTextCol); }\n if (upRect) { upRect.setAttribute(\"stroke\", sharedColor); }\n } else {\n upStroke?.setAttribute(\"visibility\", \"hidden\");\n upBadge?.setAttribute(\"visibility\", \"hidden\");\n }\n\n const downStroke = pathRefs.current[\"guideline-down-stroke\"];\n const downBadge = pathRefs.current[\"guideline-down-badge\"];\n const downArrow = pathRefs.current[\"guideline-down-arrow\"];\n const downText = pathRefs.current[\"guideline-down-text\"];\n const downRect = pathRefs.current[\"guideline-down-badge-rect\"];\n\n if (bottomCount > 0) {\n const downY = Math.min(containerHeight - 15, rightBottom - containerTop - 15);\n const r = Math.min(15, Math.abs(universalSpineX - sharedX1), Math.max(0, downY - sharedY1));\n const pathD = `M ${sharedX1},${sharedY1} L ${universalSpineX - r},${sharedY1} Q ${universalSpineX},${sharedY1} ${universalSpineX},${sharedY1 + r} L ${universalSpineX},${downY}`;\n\n downStroke?.setAttribute(\"visibility\", \"visible\");\n downStroke?.setAttribute(\"d\", pathD);\n downStroke?.setAttribute(\"stroke\", sharedColor);\n\n downBadge?.setAttribute(\"visibility\", \"visible\");\n downBadge?.setAttribute(\"transform\", `translate(${universalSpineX}, ${downY})`);\n \n if (downArrow) { downArrow.setAttribute(\"fill\", sharedColor); }\n if (downText) { downText.textContent = `+${bottomCount}`; downText.setAttribute(\"fill\", sharedTextCol); }\n if (downRect) { downRect.setAttribute(\"stroke\", sharedColor); }\n } else {\n downStroke?.setAttribute(\"visibility\", \"hidden\");\n downBadge?.setAttribute(\"visibility\", \"hidden\");\n }\n }\n }, []);\n\n const calculateLinesDebounced = useCallback(() => {\n if (cachedConnectedPositions.current.length > 0 && !isAnimatingRef.current) {\n return;\n }\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n calculateLinesRef.current();\n timerRef.current = null;\n }, 50);\n }, []); \n \n \n const handleColumnScroll = useCallback((e: any) => {\n if (pendingScrollTargetRef.current !== null && pendingScrollCallbackRef.current) {\n if (Math.abs(e.currentTarget.scrollTop - pendingScrollTargetRef.current) <= 2) {\n const callback = pendingScrollCallbackRef.current;\n pendingScrollTargetRef.current = null;\n pendingScrollCallbackRef.current = null;\n callback();\n }\n }\n \n if (scrollSyncing.current) return;\n if (scrollLock.current) return;\n\n if (\n maintainRelativeOrder &&\n scrollSyncLocked &&\n (isSideBySideRef.current || connectedSections.size > 0)\n ) {\n const source = e.currentTarget as HTMLElement;\n const leftContainer = leftContainerRef.current;\n const rightContainer = rightContainerRef.current;\n const target =\n source === leftContainer\n ? rightContainer\n : source === rightContainer\n ? leftContainer\n : null;\n\n if (source && target) {\n const resolveActiveAnchors = () => {\n const activeLeftIdx = activeSideBySideSectionRef.current;\n const activeRightIdx = activeSideBySideRightSectionRef.current;\n\n if (activeLeftIdx === null) return { leftAnchor: null, rightAnchor: null };\n\n if (\n typeof activeLeftIdx === \"string\" &&\n activeLeftIdx.includes(DEVIATION_BADGE_SEPARATOR)\n ) {\n const parts = activeLeftIdx.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n\n return {\n leftAnchor:\n lhsBadgeRefs.current[refId]?.current ||\n subSectionLeftRefs.current[parts[2]]?.current ||\n sectionLeftRefs.current[Number(parts[2])]?.current ||\n null,\n rightAnchor:\n rhsBadgeRefs.current[refId]?.current ||\n subSectionRightRefs.current[parts[3]]?.current ||\n sectionRightRefs.current[Number(parts[3])]?.current ||\n null,\n };\n }\n\n const leftIdx = Number(activeLeftIdx);\n const rightIdx = activeRightIdx !== null ? Number(activeRightIdx) : leftIdx;\n\n return {\n leftAnchor:\n lhsBadgeRefs.current[leftIdx]?.current ||\n sectionRowRefs.current[leftIdx]?.current ||\n sectionLeftRefs.current[leftIdx]?.current ||\n null,\n rightAnchor:\n rhsBadgeRefs.current[rightIdx]?.current ||\n sectionRightRefs.current[rightIdx]?.current ||\n null,\n };\n };\n\n const { leftAnchor, rightAnchor } = resolveActiveAnchors();\n const sourceAnchor = source === leftContainer ? leftAnchor : rightAnchor;\n const targetAnchor = source === leftContainer ? rightAnchor : leftAnchor;\n\n let nextTargetTop: number | null = null;\n\n if (sourceAnchor && targetAnchor) {\n const sourceAnchorRect = sourceAnchor.getBoundingClientRect();\n const targetAnchorRect = targetAnchor.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n\n const sourceAnchorCenterY =\n sourceAnchorRect.top + sourceAnchorRect.height / 2;\n const targetAnchorAbsoluteCenterY =\n targetAnchorRect.top -\n targetRect.top +\n target.scrollTop +\n targetAnchorRect.height / 2;\n\n nextTargetTop =\n targetAnchorAbsoluteCenterY - (sourceAnchorCenterY - targetRect.top);\n } else {\n const sourceMaxScroll = Math.max(0, source.scrollHeight - source.clientHeight);\n const targetMaxScroll = Math.max(0, target.scrollHeight - target.clientHeight);\n nextTargetTop = sourceMaxScroll > 0\n ? (source.scrollTop / sourceMaxScroll) * targetMaxScroll\n : source.scrollTop;\n }\n\n const targetMaxScroll = Math.max(0, target.scrollHeight - target.clientHeight);\n nextTargetTop = Math.max(0, Math.min(nextTargetTop, targetMaxScroll));\n\n if (Math.abs(target.scrollTop - nextTargetTop) > 1) {\n scrollSyncing.current = true;\n target.scrollTop = nextTargetTop;\n requestAnimationFrame(() => {\n scrollSyncing.current = false;\n });\n }\n }\n }\n \n if (!maintainRelativeOrder) {\n calculateLinesDebounced();\n }\n \n if (!scrollTicking.current) {\n scrollTicking.current = true;\n \n requestAnimationFrame(() => {\n if (isSideBySideRef.current) {\n const leftContainer = leftContainerRef.current;\n const rightContainer = rightContainerRef.current;\n \n if (leftContainer && rightContainer && sideBySideLineRef.current) {\n if (!sideBySideCacheRef.current) {\n const activeLeftIdx = activeSideBySideSectionRef.current;\n let lBadge;\n \n if (typeof activeLeftIdx === 'string' && activeLeftIdx.includes(DEVIATION_BADGE_SEPARATOR)) {\n const parts = activeLeftIdx.split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n lBadge = lhsBadgeRefs.current[refId]?.current;\n } else {\n lBadge = lhsBadgeRefs.current[activeLeftIdx as number]?.current;\n }\n \n if (lBadge) {\n const lRect = lBadge.getBoundingClientRect();\n sideBySideCacheRef.current = {\n badgeScreenY: lRect.top + lRect.height / 2, \n initialScrollTop: leftContainer.scrollTop, \n leftTop: leftContainer.getBoundingClientRect().top,\n leftBottom: leftContainer.getBoundingClientRect().top + leftContainer.clientHeight,\n cTop: containerRef.current?.getBoundingClientRect().top ?? 0\n };\n }\n }\n \n if (sideBySideCacheRef.current) {\n const cache = sideBySideCacheRef.current;\n const scrollDelta = leftContainer.scrollTop - cache.initialScrollTop;\n const rawLhsY = cache.badgeScreenY - scrollDelta;\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n const clampedLhsY = clamp(rawLhsY, cache.leftTop, cache.leftBottom);\n const horizontalY = (clampedLhsY - cache.cTop).toString();\n const isVisible = rawLhsY >= cache.leftTop - 4 && rawLhsY <= cache.leftBottom + 4;\n \n sideBySideLineRef.current.setAttribute(\"y1\", horizontalY);\n sideBySideLineRef.current.setAttribute(\"y2\", horizontalY); \n sideBySideLineRef.current.setAttribute(\"visibility\", isVisible ? \"visible\" : \"hidden\");\n }\n }\n }\n \n updateConnectedLinesOnScroll(); \n scrollTicking.current = false;\n });\n }\n }, [\n updateConnectedLinesOnScroll,\n maintainRelativeOrder,\n scrollSyncLocked,\n connectedSections,\n calculateLinesDebounced,\n ]);\n\n\n useEffect(() => {\n calculateLinesRef.current = calculateLines;\n }, [calculateLines]);\n\n useEffect(() => {\n const timer = setTimeout(calculateLinesDebounced, 250);\n const onWindowResize = () => handleResizeRef.current();\n window.addEventListener(\"resize\", onWindowResize);\n \n return () => {\n clearTimeout(timer);\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n if (resizeTimerRef.current !== null) clearTimeout(resizeTimerRef.current);\n window.removeEventListener(\"resize\", onWindowResize);\n };\n }, [\n activeProposed,\n existingRule,\n analysisData,\n visibleFields,\n expandedSections,\n expandedSubSections,\n proposedSections,\n existingSections,\n resolvedComparisonConfig,\n calculateLinesDebounced,\n isSideBySide,\n activeSideBySideSection,\n isArrowVisible,\n connectedSections,\n ]);\n\n\n return {\n lines, setLines,\n overallConnector, setOverallConnector,\n connectedLines, setConnectedLines,\n svgDimensions,\n cachedConnectedPositions,\n calculateLines,\n calculateLinesRef,\n calculateLinesDebounced,\n handleColumnScroll,\n}\n\n}\n"],"names":["useLinesCalculator","containerRef","leftContainerRef","rightContainerRef","svgContainerRef","pathRefs","leftHeaderRef","rightHeaderRef","proposedSections","existingSections","visibleFields","leftRefs","rightRefs","sectionLeftRefs","sectionRightRefs","subSectionLeftRefs","subSectionRightRefs","lhsBadgeRefs","rhsBadgeRefs","sectionRowRefs","expandedSections","expandedSubSections","connectedSections","isSideBySide","activeSideBySideSection","maintainRelativeOrder","isGuidelineMode","cognitiveMap","getSectionCompareStyle","getSubSectionCompareStyle","getDeviationStyleByKey","isArrowVisible","isAnimatingRef","isSideBySideRef","sideBySideCacheRef","sideBySideLineRef","activeSideBySideSectionRef","activeSideBySideRightSectionRef","connectedLines","providedConnectedLines","setConnectedLines","providedSetConnectedLines","cachedConnectedPositions","providedCachedConnectedPositions","calculateLinesRef","resizeTimerRef","scrollLock","scrollSyncLocked","handleResizeRef","activeProposed","existingRule","analysisData","pendingScrollTargetRef","pendingScrollCallbackRef","resolvedComparisonConfig","getFieldData","lines","setLines","useState","overallConnector","setOverallConnector","internalConnectedLines","internalSetConnectedLines","svgDimensions","setSvgDimensions","width","height","isCalculatingLines","useRef","scrollTicking","scrollSyncing","timerRef","internalCachedConnectedPositions","getRoundedStaggeredPath","x1","y1","x2","y2","cX","visL","visR","Math","abs","r1","min","r2","dy1","dy2","dx2","calculateLines","useCallback","current","isSubSectionVisible","keyPath","pathParts","split","rootIdx","ancestorPath","i","length","containerRect","getBoundingClientRect","newLines","forEach","key","l","r","style","minHeight","idx","max","Object","keys","fieldHeights","lRect","rRect","syncHeights","left","right","subSectionHeights","leftIdx","leftSec","refIndexes","rhsSelfIdx","rhsArrayIdx","findIndex","s","selfIndex","maxH","DEVIATION_BADGE_SEPARATOR","offsetParent","entries","Number","getMappedRightIndexes","mapped","map","filter","Array","from","Set","continuationSourceIdx","continuationSourceRowId","section","comparisonRowId","resolvedLeftIdx","lWrap","rWrap","leftRect","rightRect","top","leftTop","rightTop","leftBottom","clientHeight","Infinity","rightBottom","clamp","v","push","id","sectionIdx","targetRightIdx","isSubSection","isMappingContinuation","hasCognitive","cognitiveData","nodeId","includes","devKey","leftKeyPath","rightKeyPath","refId","lBadgeEl","rBadgeEl","subSectionKeyPath","leftHeaderRect","rightHeaderRect","overallY","y","size","newConnectedLines","leftContainer","rightContainer","newCache","leftScrollTop","scrollTop","rightScrollTop","cTop","connectedIdx","lBadge","leftIdxNum","targetMarks","document","querySelectorAll","rBadge","index","centerX","rawLhsY","rawRhsY","lhsScrollY","rhsScrollY","styleId","baseLabel","n","join","String","letter","fromCharCode","matchLabel","containerTop","styleColor","badgeBorder","styleBg","badgeBg","styleText","badgeText","clampedLhsY","clampedRhsY","pathD","isGuideline","setTimeout","updateConnectedLinesOnScroll","e","console","error","cache","setAttribute","leftScroll","rightScroll","leftHeight","rightHeight","containerHeight","topCount","bottomCount","sharedX1","sharedY1","sharedColor","sharedTextCol","hasActiveConnections","universalSpineX","entry","lhsViewportY","rhsViewportY","strokeEl","bgEl","btnEl","numberBadgeEl","visibleLhsY","visibleRhsY","lhsVisible","rhsVisible","showLine","upStroke","upBadge","upArrow","upText","upRect","upY","textContent","downStroke","downBadge","downArrow","downText","downRect","downY","calculateLinesDebounced","clearTimeout","handleColumnScroll","currentTarget","callback","source","target","resolveActiveAnchors","activeLeftIdx","activeRightIdx","leftAnchor","rightAnchor","parts","rightIdx","sourceAnchor","targetAnchor","nextTargetTop","sourceAnchorRect","targetAnchorRect","targetRect","sourceAnchorCenterY","sourceMaxScroll","scrollHeight","targetMaxScroll","requestAnimationFrame","badgeScreenY","initialScrollTop","scrollDelta","horizontalY","toString","isVisible","useEffect","timer","onWindowResize","window","addEventListener","removeEventListener"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{useState as e,useRef as t,useCallback as n,useEffect as r}from"react";import{DEVIATION_BADGE_SEPARATOR as i,resetClauseHighlight as c,smoothScrollTo as u}from"../CognitiveComparehelpers.js";import{getVisibleGuidelineTargets as l}from"../Guidelines/utils/guidelineTargets.js";const o=({isGuidelineMode:o,maintainRelativeOrder:s,proposedSections:d,existingSections:p,leftContainerRef:g,rightContainerRef:a,scrollContainerRef:f,sectionLeftRefs:h,sectionRightRefs:R,subSectionLeftRefs:S,subSectionRightRefs:y,lhsBadgeRefs:m,rhsBadgeRefs:B,sectionRowRefs:x,sectionRightRowRefs:C,rhsTopSpacerRef:T,rhsBottomSpacerRef:v,lhsTopSpacerRef:b,lhsBottomSpacerRef:$,calculateLinesRef:A,setConnectedSections:w,setConnectedLines:I,cachedConnectedPositions:L,closeMoreFunctionsPopup:F,setErrorToast:N,moreFunctions:E,closeSummaryPopup:q})=>{const[H,M]=e(!1),[P,j]=e(!1),[z,G]=e(!1),[V,k]=e(!1),[O,D]=e(null),J=t(!1),K=t(null),Q=t(!1),U=t(null),W=t(null),X=t(null),Y=t(new Set),Z=()=>{Y.current.forEach(e=>{c(e)}),Y.current.clear()},_=(e,t,n)=>{let r=null,c=null,u=null,l=null,o=null,s=null;const d=(e,t)=>{if(!e||!t)return!0;const n=e.getBoundingClientRect(),r=t.getBoundingClientRect();return n.bottom>=r.top&&n.top<=r.bottom};if(e){const e=t.split(i),n=`${e[0]}${i}${e[1]}`;r=S.current[e[2]]?.current||h.current[Number(e[2])]?.current||null,c=y.current[e[3]]?.current||R.current[Number(e[3])]?.current||null,u=m.current[n]?.current||r,l=B.current[n]?.current||c}else{const e=Number(t),i=null!==n?Number(n):e;r=h.current[e]?.current||null,c=R.current[i]?.current||null,o=m.current[e]?.current||null,s=B.current[i]?.current||null,u=o||x.current[e]?.current||r,l=s||C.current[i]?.current||c}if(r&&(r.style.paddingTop="0px"),c&&(c.style.paddingTop="0px"),e||(o&&(o.style.marginTop="0px"),s&&(s.style.marginTop="0px")),!e&&o&&s){const e=g.current,t=a.current;if(!d(o,e)||!d(s,t))return;const n=o.getBoundingClientRect(),r=s.getBoundingClientRect(),i=n.top-r.top;if(Math.abs(i)>32)return;return void(i>0&&(s.style.marginTop=`${i}px`))}if(u&&l&&r&&c){const e=u.getBoundingClientRect(),t=l.getBoundingClientRect(),n=e.top-t.top;n>0&&(c.style.paddingTop=`${n}px`)}},ee=n(()=>{const e=U.current,t=W.current;if(null!==e)if("string"==typeof e&&e.includes(i)){const t=e.split(i),n=S.current[t[2]]?.current||h.current[Number(t[2])]?.current||null,r=y.current[t[3]]?.current||R.current[Number(t[3])]?.current||null;n&&(n.style.paddingTop="0px"),r&&(r.style.paddingTop="0px")}else{const n=h.current[e]?.current||null,r=R.current[t??e]?.current||null;n&&(n.style.paddingTop="0px"),r&&(r.style.paddingTop="0px");const i=m.current[e]?.current||null,c=B.current[t??e]?.current||null;i&&(i.style.marginTop="0px"),c&&(c.style.marginTop="0px")}T.current&&(T.current.style.height="0px"),v.current&&(v.current.style.height="0px"),b.current&&(b.current.style.height="0px"),$.current&&($.current.style.height="0px")},[]);r(()=>{Q.current=H},[H]),r(()=>{U.current=O},[O]);const te=n(()=>{Z(),M(!1),Q.current=!1,K.current=null,ee(),D(null),U.current=null,W.current=null,j(!1),k(!1)},[ee]),ne=n((e,t,n)=>{const r=n?.toggleIfSame??!0,c=n?.onReady,S=n?.sourceSide??"left";if(F(),null==e)return;if(t&&!o)return void N("No counterpart exists for this section.");Z();const y=H&&O===e;H&&null!==O&&ee(),y&&r?te():(w(new Set([e])),I([]),L.current=[],k(!0),J.current=!0,D(e),U.current=e,M(!0),Q.current=!0,j(!1),T.current&&(T.current.style.height="0px"),v.current&&(v.current.style.height="0px"),b.current&&(b.current.style.height="0px"),$.current&&($.current.style.height="0px"),requestAnimationFrame(()=>{const t=()=>{const t="string"==typeof e&&e.includes(i);let n=null,r=null,y=null;if(o){if(t){const t=e.split(i),r=`${t[0]}${i}${t[1]}`;n=m.current[r]?.current||null}else n=h.current[e]?.current||x.current[e]?.current||null;r=l(a.current)[0]||null,y=r?e:null}else if(t){const t=e.split(i),c=`${t[0]}${i}${t[1]}`;n=m.current[c]?.current||null,r=B.current[c]?.current||null,y=r?e:null}else if(n=h.current[e]?.current||x.current[e]?.current||null,s){const t=d[e],n=t?.refIndexes||[];if(n.length>0){const e=n[0],t=p.findIndex(t=>t.selfIndex===e);-1!==t&&(r=R.current[t]?.current||C.current[t]?.current||null,y=t)}}else r=R.current[e]?.current||C.current[e]?.current||null,y=r?e:null;W.current=y;const b=g.current,$=a.current,w=()=>{_(t,e,y),j(!0),A.current&&A.current(),J.current=!1,"right"===S&&$?$.dispatchEvent(new Event("scroll")):b&&b.dispatchEvent(new Event("scroll")),k(!1),c?.()};if(!n||!b)return J.current=!1,k(!1),void c?.();if(!r||!$)return void w();if(!s){let e=0;e="right"===S?r?r.getBoundingClientRect().top:0:n?n.getBoundingClientRect().top:0;const t=f.current,i=t?.getBoundingClientRect().top||0,c=t?t.scrollTop+e-i-150:0;return t?void u(t,c,200,w):void w()}const I=n.getBoundingClientRect().top-b.getBoundingClientRect().top+b.scrollTop,L=r.getBoundingClientRect().top-$.getBoundingClientRect().top+$.scrollTop,F=200;if("left"===S){const e=L-(I-b.scrollTop);e<0&&T.current&&!o&&(T.current.style.height=`${Math.abs(e)}px`),requestAnimationFrame(()=>{const t=$.scrollHeight-$.clientHeight;let n;if(e<0)n=0;else{if(e>t){const n=e-t;return v.current&&!o&&(v.current.style.height=`${n+150}px`),void requestAnimationFrame(()=>{u($,e,F,w)})}n=e}u($,n,F,w)})}else{const e=I-(L-$.scrollTop);requestAnimationFrame(()=>{const t=b.scrollHeight-b.clientHeight;let n;if(e<0)n=0;else{if(e>t)return void requestAnimationFrame(()=>u(b,t,F,w));n=e}u(b,n,F,w)})}};o?setTimeout(t,100):t()}))},[O,F,p,H,s,d,ee,te,o]);return{isSideBySide:H,setIsSideBySide:M,isArrowVisible:P,setIsArrowVisible:j,isResizing:z,setIsResizing:G,isSideBySideLoading:V,setIsSideBySideLoading:k,activeSideBySideSection:O,setActiveSideBySideSection:D,scrollLock:J,sideBySideCacheRef:K,isSideBySideRef:Q,activeSideBySideSectionRef:U,activeSideBySideRightSectionRef:W,sideBySideLineRef:X,highlightedClauseRefs:Y,clearClauseHighlight:Z,applyAlignmentPadding:_,resetSideBySide:te,activateSideBySide:ne}};export{o as useSideBySide};
1
+ import{useState as e,useRef as t,useCallback as n,useEffect as r}from"react";import{DEVIATION_BADGE_SEPARATOR as c,resetClauseHighlight as i,smoothScrollTo as u}from"../CognitiveComparehelpers.js";const l=({isGuidelineMode:l,maintainRelativeOrder:o,proposedSections:s,existingSections:d,leftContainerRef:p,rightContainerRef:g,scrollContainerRef:a,sectionLeftRefs:f,sectionRightRefs:h,subSectionLeftRefs:R,subSectionRightRefs:S,lhsBadgeRefs:y,rhsBadgeRefs:m,sectionRowRefs:B,sectionRightRowRefs:x,rhsTopSpacerRef:C,rhsBottomSpacerRef:T,lhsTopSpacerRef:v,lhsBottomSpacerRef:b,calculateLinesRef:$,setConnectedSections:A,setConnectedLines:I,cachedConnectedPositions:w,closeMoreFunctionsPopup:L,setErrorToast:E,moreFunctions:F,closeSummaryPopup:N})=>{const[q,H]=e(!1),[M,P]=e(!1),[z,V]=e(!1),[j,k]=e(!1),[G,O]=e(null),D=t(!1),J=t(null),K=t(!1),Q=t(null),U=t(null),W=t(null),X=t(new Set),Y=()=>{X.current.forEach(e=>{i(e)}),X.current.clear()},Z=(e,t,n)=>{let r=null,i=null,u=null,l=null,o=null,s=null;const d=(e,t)=>{if(!e||!t)return!0;const n=e.getBoundingClientRect(),r=t.getBoundingClientRect();return n.bottom>=r.top&&n.top<=r.bottom};if(e){const e=t.split(c),n=`${e[0]}${c}${e[1]}`;r=R.current[e[2]]?.current||f.current[Number(e[2])]?.current||null,i=S.current[e[3]]?.current||h.current[Number(e[3])]?.current||null,u=y.current[n]?.current||r,l=m.current[n]?.current||i}else{const e=Number(t),c=null!==n?Number(n):e;r=f.current[e]?.current||null,i=h.current[c]?.current||null,o=y.current[e]?.current||null,s=m.current[c]?.current||null,u=o||B.current[e]?.current||r,l=s||x.current[c]?.current||i}if(r&&(r.style.paddingTop="0px"),i&&(i.style.paddingTop="0px"),e||(o&&(o.style.marginTop="0px"),s&&(s.style.marginTop="0px")),!e&&o&&s){const e=p.current,t=g.current;if(!d(o,e)||!d(s,t))return;const n=o.getBoundingClientRect(),r=s.getBoundingClientRect(),c=n.top-r.top;if(Math.abs(c)>32)return;return void(c>0&&(s.style.marginTop=`${c}px`))}if(u&&l&&r&&i){const e=u.getBoundingClientRect(),t=l.getBoundingClientRect(),n=e.top-t.top;n>0&&(i.style.paddingTop=`${n}px`)}},_=n(()=>{const e=Q.current,t=U.current;if(null!==e)if("string"==typeof e&&e.includes(c)){const t=e.split(c),n=R.current[t[2]]?.current||f.current[Number(t[2])]?.current||null,r=S.current[t[3]]?.current||h.current[Number(t[3])]?.current||null;n&&(n.style.paddingTop="0px"),r&&(r.style.paddingTop="0px")}else{const n=f.current[e]?.current||null,r=h.current[t??e]?.current||null;n&&(n.style.paddingTop="0px"),r&&(r.style.paddingTop="0px");const c=y.current[e]?.current||null,i=m.current[t??e]?.current||null;c&&(c.style.marginTop="0px"),i&&(i.style.marginTop="0px")}C.current&&(C.current.style.height="0px"),T.current&&(T.current.style.height="0px"),v.current&&(v.current.style.height="0px"),b.current&&(b.current.style.height="0px")},[]);r(()=>{K.current=q},[q]),r(()=>{Q.current=G},[G]);const ee=n(()=>{Y(),H(!1),K.current=!1,J.current=null,_(),O(null),Q.current=null,U.current=null,P(!1),k(!1)},[_]),te=n((e,t,n)=>{const r=n?.toggleIfSame??!0,i=n?.onReady,R=n?.sourceSide??"left";if(L(),null==e)return;if(t&&!l)return void E("No counterpart exists for this section.");Y();const S=q&&G===e;q&&null!==G&&_(),S&&r?ee():(A(new Set([e])),I([]),w.current=[],k(!0),D.current=!0,O(e),Q.current=e,H(!0),K.current=!0,P(!1),C.current&&(C.current.style.height="0px"),T.current&&(T.current.style.height="0px"),v.current&&(v.current.style.height="0px"),b.current&&(b.current.style.height="0px"),requestAnimationFrame(()=>{const t=()=>{const t="string"==typeof e&&e.includes(c);let n=null,r=null,S=null;if(l){if(t){const t=e.split(c),r=`${t[0]}${c}${t[1]}`;n=y.current[r]?.current||null}else n=f.current[e]?.current||B.current[e]?.current||null;r=document.getElementById("guideline-target-0"),S=r?e:null}else if(t){const t=e.split(c),i=`${t[0]}${c}${t[1]}`;n=y.current[i]?.current||null,r=m.current[i]?.current||null,S=r?e:null}else if(n=f.current[e]?.current||B.current[e]?.current||null,o){const t=s[e],n=t?.refIndexes||[];if(n.length>0){const e=n[0],t=d.findIndex(t=>t.selfIndex===e);-1!==t&&(r=h.current[t]?.current||x.current[t]?.current||null,S=t)}}else r=h.current[e]?.current||x.current[e]?.current||null,S=r?e:null;U.current=S;const v=p.current,b=g.current,A=()=>{Z(t,e,S),P(!0),$.current&&$.current(),D.current=!1,"right"===R&&b?b.dispatchEvent(new Event("scroll")):v&&v.dispatchEvent(new Event("scroll")),k(!1),i?.()};if(!n||!v)return D.current=!1,k(!1),void i?.();if(!r||!b)return void A();if(!o){let e=0;e="right"===R?r?r.getBoundingClientRect().top:0:n?n.getBoundingClientRect().top:0;const t=a.current,c=t?.getBoundingClientRect().top||0,i=t?t.scrollTop+e-c-150:0;return t?void u(t,i,200,A):void A()}const I=n.getBoundingClientRect().top-v.getBoundingClientRect().top+v.scrollTop,w=r.getBoundingClientRect().top-b.getBoundingClientRect().top+b.scrollTop,L=200;if("left"===R){const e=w-(I-v.scrollTop);e<0&&C.current&&!l&&(C.current.style.height=`${Math.abs(e)}px`),requestAnimationFrame(()=>{const t=b.scrollHeight-b.clientHeight;let n;if(e<0)n=0;else{if(e>t){const n=e-t;return T.current&&!l&&(T.current.style.height=`${n+150}px`),void requestAnimationFrame(()=>{u(b,e,L,A)})}n=e}u(b,n,L,A)})}else{const e=I-(w-b.scrollTop);requestAnimationFrame(()=>{const t=v.scrollHeight-v.clientHeight;let n;if(e<0)n=0;else{if(e>t)return void requestAnimationFrame(()=>u(v,t,L,A));n=e}u(v,n,L,A)})}};l?setTimeout(t,100):t()}))},[G,L,d,q,o,s,_,ee,l]);return{isSideBySide:q,setIsSideBySide:H,isArrowVisible:M,setIsArrowVisible:P,isResizing:z,setIsResizing:V,isSideBySideLoading:j,setIsSideBySideLoading:k,activeSideBySideSection:G,setActiveSideBySideSection:O,scrollLock:D,sideBySideCacheRef:J,isSideBySideRef:K,activeSideBySideSectionRef:Q,activeSideBySideRightSectionRef:U,sideBySideLineRef:W,highlightedClauseRefs:X,clearClauseHighlight:Y,applyAlignmentPadding:Z,resetSideBySide:ee,activateSideBySide:te}};export{l as useSideBySide};
2
2
  //# sourceMappingURL=useSideBySide.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSideBySide.js","sources":["../../../../src/features/CognitiveCompare/hooks/useSideBySide.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\"\nimport { DEVIATION_BADGE_SEPARATOR, resetClauseHighlight, smoothScrollTo } from \"../CognitiveComparehelpers\";\nimport { getVisibleGuidelineTargets } from \"../Guidelines/utils/guidelineTargets\";\n\nexport const useSideBySide = ({ \n isGuidelineMode, // ── NEW PROP ──\n maintainRelativeOrder,\n proposedSections, existingSections,\n leftContainerRef, rightContainerRef, scrollContainerRef,\n sectionLeftRefs, sectionRightRefs,\n subSectionLeftRefs, subSectionRightRefs,\n lhsBadgeRefs, rhsBadgeRefs,\n sectionRowRefs, sectionRightRowRefs,\n rhsTopSpacerRef, rhsBottomSpacerRef,\n lhsTopSpacerRef, lhsBottomSpacerRef,\n calculateLinesRef,\n setConnectedSections, setConnectedLines, cachedConnectedPositions,\n closeMoreFunctionsPopup, setErrorToast,\n moreFunctions, closeSummaryPopup,\n}: any) => {\n const [isSideBySide, setIsSideBySide] = useState(false);\n const [isArrowVisible, setIsArrowVisible] = useState(false);\n const [isResizing, setIsResizing] = useState(false);\n const [isSideBySideLoading, setIsSideBySideLoading] = useState(false)\n const [activeSideBySideSection, setActiveSideBySideSection] = useState<number | string | null>(null)\n\n\n const scrollLock = useRef(false);\n const sideBySideCacheRef = useRef<{ badgeScreenY: number; initialScrollTop: number; leftTop: number; leftBottom: number; cTop: number; } | null>(null);\n const isSideBySideRef = useRef(false);\n const activeSideBySideSectionRef = useRef<number | string | null>(null);\n const activeSideBySideRightSectionRef = useRef<number | string | null>(null);\n const sideBySideLineRef = useRef<SVGLineElement | null>(null);\n const highlightedClauseRefs = useRef<Set<HTMLElement>>(new Set());\n\n // Helpers\n const clearClauseHighlight = () => {\n highlightedClauseRefs.current.forEach((el) => {\n resetClauseHighlight(el);\n });\n highlightedClauseRefs.current.clear();\n };\n\n const applyAlignmentPadding = (isSub: boolean, idx: any, activeRightIdx: any) => {\n let leftPadTarget: HTMLElement | null = null;\n let rightPadTarget: HTMLElement | null = null;\n let leftAlignEl: HTMLElement | null = null;\n let rightAlignEl: HTMLElement | null = null;\n let leftBadgeEl: HTMLElement | null = null;\n let rightBadgeEl: HTMLElement | null = null;\n const maxBadgeOffset = 32;\n\n const isVisibleInContainer = (el: HTMLElement | null, container: HTMLElement | null) => {\n if (!el || !container) return true;\n const rect = el.getBoundingClientRect();\n const cRect = container.getBoundingClientRect();\n return rect.bottom >= cRect.top && rect.top <= cRect.bottom;\n };\n\n if (isSub) {\n const parts = (idx as string).split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n leftPadTarget = subSectionLeftRefs.current[parts[2]]?.current || sectionLeftRefs.current[Number(parts[2])]?.current || null;\n rightPadTarget = subSectionRightRefs.current[parts[3]]?.current || sectionRightRefs.current[Number(parts[3])]?.current || null;\n leftAlignEl = lhsBadgeRefs.current[refId]?.current || leftPadTarget;\n rightAlignEl = rhsBadgeRefs.current[refId]?.current || rightPadTarget;\n } else {\n const leftNumIdx = Number(idx);\n const rightNumIdx = activeRightIdx !== null ? Number(activeRightIdx) : leftNumIdx;\n\n leftPadTarget = sectionLeftRefs.current[leftNumIdx]?.current || null;\n rightPadTarget = sectionRightRefs.current[rightNumIdx]?.current || null;\n leftBadgeEl = lhsBadgeRefs.current[leftNumIdx]?.current || null;\n rightBadgeEl = rhsBadgeRefs.current[rightNumIdx]?.current || null;\n\n // Core Fix: Fallbacks guarantee we find an element even if badges are null\n leftAlignEl = leftBadgeEl || sectionRowRefs.current[leftNumIdx]?.current || leftPadTarget;\n rightAlignEl = rightBadgeEl || sectionRightRowRefs.current[rightNumIdx]?.current || rightPadTarget;\n }\n\n if (leftPadTarget) leftPadTarget.style.paddingTop = \"0px\";\n if (rightPadTarget) rightPadTarget.style.paddingTop = \"0px\";\n if (!isSub) {\n if (leftBadgeEl) leftBadgeEl.style.marginTop = \"0px\";\n if (rightBadgeEl) rightBadgeEl.style.marginTop = \"0px\";\n }\n\n if (!isSub && leftBadgeEl && rightBadgeEl) {\n const leftContainer = leftContainerRef.current;\n const rightContainer = rightContainerRef.current;\n if (!isVisibleInContainer(leftBadgeEl, leftContainer) || !isVisibleInContainer(rightBadgeEl, rightContainer)) {\n return;\n }\n const lRect = leftBadgeEl.getBoundingClientRect();\n const rRect = rightBadgeEl.getBoundingClientRect();\n const badgeDiff = lRect.top - rRect.top;\n\n if (Math.abs(badgeDiff) > maxBadgeOffset) return;\n\n if (badgeDiff > 0) {\n rightBadgeEl.style.marginTop = `${badgeDiff}px`;\n }\n return;\n }\n\n if (leftAlignEl && rightAlignEl && leftPadTarget && rightPadTarget) {\n const lRect = leftAlignEl.getBoundingClientRect();\n const rRect = rightAlignEl.getBoundingClientRect();\n const badgeDiff = lRect.top - rRect.top;\n\n if (badgeDiff > 0) {\n rightPadTarget.style.paddingTop = `${badgeDiff}px`;\n }\n }\n };\n\n const clearAlignmentOffsets = useCallback(() => {\n const leftIdx = activeSideBySideSectionRef.current;\n const rightIdx = activeSideBySideRightSectionRef.current;\n\n if (leftIdx !== null) {\n if (typeof leftIdx === \"string\" && leftIdx.includes(DEVIATION_BADGE_SEPARATOR)) {\n const parts = leftIdx.split(DEVIATION_BADGE_SEPARATOR);\n const leftPadTarget =\n subSectionLeftRefs.current[parts[2]]?.current ||\n sectionLeftRefs.current[Number(parts[2])]?.current ||\n null;\n const rightPadTarget =\n subSectionRightRefs.current[parts[3]]?.current ||\n sectionRightRefs.current[Number(parts[3])]?.current ||\n null;\n\n if (leftPadTarget) leftPadTarget.style.paddingTop = \"0px\";\n if (rightPadTarget) rightPadTarget.style.paddingTop = \"0px\";\n } else {\n const leftPadTarget = sectionLeftRefs.current[leftIdx as number]?.current || null;\n const rightPadTarget =\n sectionRightRefs.current[(rightIdx ?? leftIdx) as number]?.current || null;\n\n if (leftPadTarget) leftPadTarget.style.paddingTop = \"0px\";\n if (rightPadTarget) rightPadTarget.style.paddingTop = \"0px\";\n\n const leftBadge = lhsBadgeRefs.current[leftIdx as number]?.current || null;\n const rightBadge = rhsBadgeRefs.current[(rightIdx ?? leftIdx) as number]?.current || null;\n if (leftBadge) leftBadge.style.marginTop = \"0px\";\n if (rightBadge) rightBadge.style.marginTop = \"0px\";\n }\n }\n\n if (rhsTopSpacerRef.current) rhsTopSpacerRef.current.style.height = \"0px\";\n if (rhsBottomSpacerRef.current) rhsBottomSpacerRef.current.style.height = \"0px\";\n if (lhsTopSpacerRef.current) lhsTopSpacerRef.current.style.height = \"0px\";\n if (lhsBottomSpacerRef.current) lhsBottomSpacerRef.current.style.height = \"0px\";\n }, []);\n\n\n // Effects\n useEffect(() => {\n isSideBySideRef.current = isSideBySide;\n }, [isSideBySide]);\n\n useEffect(() => {\n activeSideBySideSectionRef.current = activeSideBySideSection;\n }, [activeSideBySideSection]);\n\n // Callbacks\n\n const resetSideBySide = useCallback(() => {\n clearClauseHighlight();\n setIsSideBySide(false);\n isSideBySideRef.current = false;\n sideBySideCacheRef.current = null;\n clearAlignmentOffsets();\n setActiveSideBySideSection(null);\n activeSideBySideSectionRef.current = null;\n activeSideBySideRightSectionRef.current = null;\n setIsArrowVisible(false);\n setIsSideBySideLoading(false);\n }, [clearAlignmentOffsets]);\n\n const activateSideBySide = useCallback(\n (\n idx: number | string,\n isOrphan: boolean,\n options?: { toggleIfSame?: boolean; onReady?: () => void; sourceSide?: \"left\" | \"right\" },\n ) => {\n const toggleIfSame = options?.toggleIfSame ?? true;\n const onReady = options?.onReady;\n const sourceSide = options?.sourceSide ?? \"left\";\n\n closeMoreFunctionsPopup();\n\n if (idx == null) return;\n\n // In Guideline Mode, we don't care about orphans, the whole rulebook is the counterpart.\n if (isOrphan && !isGuidelineMode) {\n setErrorToast(\"No counterpart exists for this section.\");\n return;\n }\n clearClauseHighlight();\n const isSameTarget = isSideBySide && activeSideBySideSection === idx;\n if (isSideBySide && activeSideBySideSection !== null) {\n clearAlignmentOffsets();\n }\n if (isSameTarget && toggleIfSame) {\n resetSideBySide();\n return;\n }\n\n setConnectedSections(new Set([idx]));\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n setIsSideBySideLoading(true);\n scrollLock.current = true;\n setActiveSideBySideSection(idx);\n activeSideBySideSectionRef.current = idx;\n setIsSideBySide(true);\n isSideBySideRef.current = true;\n setIsArrowVisible(false);\n\n if (rhsTopSpacerRef.current) rhsTopSpacerRef.current.style.height = \"0px\";\n if (rhsBottomSpacerRef.current) rhsBottomSpacerRef.current.style.height = \"0px\";\n if (lhsTopSpacerRef.current) lhsTopSpacerRef.current.style.height = \"0px\";\n if (lhsBottomSpacerRef.current) lhsBottomSpacerRef.current.style.height = \"0px\";\n\n requestAnimationFrame(() => {\n const executeAlignment = () => {\n const isSub = typeof idx === \"string\" && idx.includes(DEVIATION_BADGE_SEPARATOR);\n let leftEl: HTMLElement | null = null;\n let rightEl: HTMLElement | null = null;\n let activeRightIdx: number | string | null = null;\n\n if (isGuidelineMode) {\n // In guideline mode, grab leftEl normally, but rightEl is the injected <mark>\n if (isSub) {\n const parts = (idx as string).split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n leftEl = lhsBadgeRefs.current[refId]?.current || null;\n } else {\n leftEl = sectionLeftRefs.current[idx as number]?.current || sectionRowRefs.current[idx as number]?.current || null;\n }\n \n rightEl = getVisibleGuidelineTargets(rightContainerRef.current)[0] || null;\n activeRightIdx = rightEl ? idx : null;\n } else {\n if (isSub) {\n const parts = (idx as string).split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n \n leftEl = lhsBadgeRefs.current[refId]?.current || null;\n rightEl = rhsBadgeRefs.current[refId]?.current || null;\n activeRightIdx = rightEl ? idx : null;\n } else {\n leftEl = sectionLeftRefs.current[idx as number]?.current || sectionRowRefs.current[idx as number]?.current || null;\n \n if (!maintainRelativeOrder) {\n rightEl = sectionRightRefs.current[idx as number]?.current || sectionRightRowRefs.current[idx as number]?.current || null;\n activeRightIdx = rightEl ? idx : null;\n } else {\n const leftSec = proposedSections[idx as number] as any;\n const refIdxs = (leftSec?.refIndexes || []) as number[];\n \n if (refIdxs.length > 0) {\n const rhsSelfIndex = refIdxs[0];\n const rhsArrayIdx = existingSections.findIndex(\n (s: any) => s.selfIndex === rhsSelfIndex,\n );\n if (rhsArrayIdx !== -1) {\n rightEl = sectionRightRefs.current[rhsArrayIdx]?.current || sectionRightRowRefs.current[rhsArrayIdx]?.current || null;\n activeRightIdx = rhsArrayIdx;\n }\n }\n }\n }\n }\n\n activeSideBySideRightSectionRef.current = activeRightIdx;\n\n const leftContainer = leftContainerRef.current;\n const rightContainer = rightContainerRef.current;\n\n // Force visual alignment instantly after scroll animation completes\n const forceLayoutSync = () => {\n if (sourceSide === \"right\" && rightContainer) {\n rightContainer.dispatchEvent(new Event(\"scroll\"));\n } else if (leftContainer) {\n leftContainer.dispatchEvent(new Event(\"scroll\"));\n }\n };\n\n\n // CONSOLIDATED SCROLL COMPLETION HANDLER\n const finalizeSideBySide = () => {\n applyAlignmentPadding(isSub, idx, activeRightIdx);\n setIsArrowVisible(true);\n if (calculateLinesRef.current) calculateLinesRef.current();\n scrollLock.current = false;\n forceLayoutSync();\n setIsSideBySideLoading(false);\n onReady?.();\n };\n\n if (!leftEl || !leftContainer) {\n scrollLock.current = false;\n setIsSideBySideLoading(false);\n onReady?.();\n return;\n }\n\n if (!rightEl || !rightContainer) {\n finalizeSideBySide();\n return;\n }\n\n if (!maintainRelativeOrder) {\n let targetTop = 0;\n if (sourceSide === \"right\") {\n targetTop = rightEl ? rightEl.getBoundingClientRect().top : 0;\n } else {\n targetTop = leftEl ? leftEl.getBoundingClientRect().top : 0;\n }\n\n const scrollContainer = scrollContainerRef.current;\n const containerTop = scrollContainer?.getBoundingClientRect().top || 0;\n const nextTop = scrollContainer\n ? scrollContainer.scrollTop + targetTop - containerTop - 150\n : 0;\n const ANIM_SPEED = 200;\n\n if (!scrollContainer) {\n finalizeSideBySide();\n return;\n }\n\n smoothScrollTo(scrollContainer, nextTop, ANIM_SPEED, finalizeSideBySide);\n return;\n }\n\n const leftAbsoluteTop = leftEl.getBoundingClientRect().top - leftContainer.getBoundingClientRect().top + leftContainer.scrollTop;\n const rightAbsoluteTop = rightEl.getBoundingClientRect().top - rightContainer.getBoundingClientRect().top + rightContainer.scrollTop;\n const ANIM_SPEED = 200;\n\n if (sourceSide === \"left\") {\n const currentRelativeY = leftAbsoluteTop - leftContainer.scrollTop;\n const rawRightTargetScroll = rightAbsoluteTop - currentRelativeY;\n\n if (rawRightTargetScroll < 0) {\n if (rhsTopSpacerRef.current && !isGuidelineMode)\n rhsTopSpacerRef.current.style.height = `${Math.abs(rawRightTargetScroll)}px`;\n }\n\n requestAnimationFrame(() => {\n const rightMaxScroll = rightContainer.scrollHeight - rightContainer.clientHeight;\n let rightActualScroll: number;\n\n if (rawRightTargetScroll < 0) {\n rightActualScroll = 0;\n } else if (rawRightTargetScroll > rightMaxScroll) {\n const deficit = rawRightTargetScroll - rightMaxScroll;\n if (rhsBottomSpacerRef.current && !isGuidelineMode)\n rhsBottomSpacerRef.current.style.height = `${deficit + 150}px`;\n requestAnimationFrame(() => {\n smoothScrollTo(rightContainer, rawRightTargetScroll, ANIM_SPEED, finalizeSideBySide);\n });\n return;\n } else {\n rightActualScroll = rawRightTargetScroll;\n }\n\n smoothScrollTo(rightContainer, rightActualScroll, ANIM_SPEED, finalizeSideBySide);\n });\n } else {\n const currentRelativeY = rightAbsoluteTop - rightContainer.scrollTop;\n const rawLeftTargetScroll = leftAbsoluteTop - currentRelativeY;\n\n // STRICT FIX: Removed LHS Top Spacer injection. LHS acts strictly as scroll target without manipulation.\n requestAnimationFrame(() => {\n const leftMaxScroll = leftContainer.scrollHeight - leftContainer.clientHeight;\n let leftActualScroll: number;\n\n if (rawLeftTargetScroll < 0) {\n leftActualScroll = 0;\n } else if (rawLeftTargetScroll > leftMaxScroll) {\n requestAnimationFrame(() => smoothScrollTo(leftContainer, leftMaxScroll, ANIM_SPEED, finalizeSideBySide));\n return;\n } else {\n leftActualScroll = rawLeftTargetScroll;\n }\n smoothScrollTo(leftContainer, leftActualScroll, ANIM_SPEED, finalizeSideBySide);\n });\n }\n };\n\n // Because GuidelinePanel re-renders when setConnectedSections fires,\n // we must wait a tick for the `<mark>` tags to paint to the DOM before calculating scroll bounds.\n if (isGuidelineMode) {\n setTimeout(executeAlignment, 100);\n } else {\n executeAlignment();\n }\n });\n },\n [\n activeSideBySideSection,\n closeMoreFunctionsPopup,\n existingSections,\n isSideBySide,\n maintainRelativeOrder,\n proposedSections,\n clearAlignmentOffsets,\n resetSideBySide,\n isGuidelineMode\n ],\n );\n\n return {\n isSideBySide, setIsSideBySide,\n isArrowVisible, setIsArrowVisible,\n isResizing, setIsResizing,\n isSideBySideLoading, setIsSideBySideLoading,\n activeSideBySideSection, setActiveSideBySideSection,\n scrollLock,\n sideBySideCacheRef,\n isSideBySideRef,\n activeSideBySideSectionRef,\n activeSideBySideRightSectionRef,\n sideBySideLineRef,\n highlightedClauseRefs,\n clearClauseHighlight,\n applyAlignmentPadding,\n resetSideBySide,\n activateSideBySide,\n }\n}"],"names":["useSideBySide","isGuidelineMode","maintainRelativeOrder","proposedSections","existingSections","leftContainerRef","rightContainerRef","scrollContainerRef","sectionLeftRefs","sectionRightRefs","subSectionLeftRefs","subSectionRightRefs","lhsBadgeRefs","rhsBadgeRefs","sectionRowRefs","sectionRightRowRefs","rhsTopSpacerRef","rhsBottomSpacerRef","lhsTopSpacerRef","lhsBottomSpacerRef","calculateLinesRef","setConnectedSections","setConnectedLines","cachedConnectedPositions","closeMoreFunctionsPopup","setErrorToast","moreFunctions","closeSummaryPopup","isSideBySide","setIsSideBySide","useState","isArrowVisible","setIsArrowVisible","isResizing","setIsResizing","isSideBySideLoading","setIsSideBySideLoading","activeSideBySideSection","setActiveSideBySideSection","scrollLock","useRef","sideBySideCacheRef","isSideBySideRef","activeSideBySideSectionRef","activeSideBySideRightSectionRef","sideBySideLineRef","highlightedClauseRefs","Set","clearClauseHighlight","current","forEach","el","resetClauseHighlight","clear","applyAlignmentPadding","isSub","idx","activeRightIdx","leftPadTarget","rightPadTarget","leftAlignEl","rightAlignEl","leftBadgeEl","rightBadgeEl","isVisibleInContainer","container","rect","getBoundingClientRect","cRect","bottom","top","parts","split","DEVIATION_BADGE_SEPARATOR","refId","Number","leftNumIdx","rightNumIdx","style","paddingTop","marginTop","leftContainer","rightContainer","lRect","rRect","badgeDiff","Math","abs","clearAlignmentOffsets","useCallback","leftIdx","rightIdx","includes","leftBadge","rightBadge","height","useEffect","resetSideBySide","activateSideBySide","isOrphan","options","toggleIfSame","onReady","sourceSide","isSameTarget","requestAnimationFrame","executeAlignment","leftEl","rightEl","getVisibleGuidelineTargets","leftSec","refIdxs","refIndexes","length","rhsSelfIndex","rhsArrayIdx","findIndex","s","selfIndex","finalizeSideBySide","dispatchEvent","Event","targetTop","scrollContainer","containerTop","nextTop","scrollTop","smoothScrollTo","leftAbsoluteTop","rightAbsoluteTop","ANIM_SPEED","rawRightTargetScroll","rightMaxScroll","scrollHeight","clientHeight","rightActualScroll","deficit","rawLeftTargetScroll","leftMaxScroll","leftActualScroll","setTimeout"],"mappings":"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"}
1
+ {"version":3,"file":"useSideBySide.js","sources":["../../../../src/features/CognitiveCompare/hooks/useSideBySide.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\"\nimport { DEVIATION_BADGE_SEPARATOR, resetClauseHighlight, smoothScrollTo } from \"../CognitiveComparehelpers\";\n\nexport const useSideBySide = ({ \n isGuidelineMode, // ── NEW PROP ──\n maintainRelativeOrder,\n proposedSections, existingSections,\n leftContainerRef, rightContainerRef, scrollContainerRef,\n sectionLeftRefs, sectionRightRefs,\n subSectionLeftRefs, subSectionRightRefs,\n lhsBadgeRefs, rhsBadgeRefs,\n sectionRowRefs, sectionRightRowRefs,\n rhsTopSpacerRef, rhsBottomSpacerRef,\n lhsTopSpacerRef, lhsBottomSpacerRef,\n calculateLinesRef,\n setConnectedSections, setConnectedLines, cachedConnectedPositions,\n closeMoreFunctionsPopup, setErrorToast,\n moreFunctions, closeSummaryPopup,\n}: any) => {\n const [isSideBySide, setIsSideBySide] = useState(false);\n const [isArrowVisible, setIsArrowVisible] = useState(false);\n const [isResizing, setIsResizing] = useState(false);\n const [isSideBySideLoading, setIsSideBySideLoading] = useState(false)\n const [activeSideBySideSection, setActiveSideBySideSection] = useState<number | string | null>(null)\n\n\n const scrollLock = useRef(false);\n const sideBySideCacheRef = useRef<{ badgeScreenY: number; initialScrollTop: number; leftTop: number; leftBottom: number; cTop: number; } | null>(null);\n const isSideBySideRef = useRef(false);\n const activeSideBySideSectionRef = useRef<number | string | null>(null);\n const activeSideBySideRightSectionRef = useRef<number | string | null>(null);\n const sideBySideLineRef = useRef<SVGLineElement | null>(null);\n const highlightedClauseRefs = useRef<Set<HTMLElement>>(new Set());\n\n // Helpers\n const clearClauseHighlight = () => {\n highlightedClauseRefs.current.forEach((el) => {\n resetClauseHighlight(el);\n });\n highlightedClauseRefs.current.clear();\n };\n\n const applyAlignmentPadding = (isSub: boolean, idx: any, activeRightIdx: any) => {\n let leftPadTarget: HTMLElement | null = null;\n let rightPadTarget: HTMLElement | null = null;\n let leftAlignEl: HTMLElement | null = null;\n let rightAlignEl: HTMLElement | null = null;\n let leftBadgeEl: HTMLElement | null = null;\n let rightBadgeEl: HTMLElement | null = null;\n const maxBadgeOffset = 32;\n\n const isVisibleInContainer = (el: HTMLElement | null, container: HTMLElement | null) => {\n if (!el || !container) return true;\n const rect = el.getBoundingClientRect();\n const cRect = container.getBoundingClientRect();\n return rect.bottom >= cRect.top && rect.top <= cRect.bottom;\n };\n\n if (isSub) {\n const parts = (idx as string).split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n leftPadTarget = subSectionLeftRefs.current[parts[2]]?.current || sectionLeftRefs.current[Number(parts[2])]?.current || null;\n rightPadTarget = subSectionRightRefs.current[parts[3]]?.current || sectionRightRefs.current[Number(parts[3])]?.current || null;\n leftAlignEl = lhsBadgeRefs.current[refId]?.current || leftPadTarget;\n rightAlignEl = rhsBadgeRefs.current[refId]?.current || rightPadTarget;\n } else {\n const leftNumIdx = Number(idx);\n const rightNumIdx = activeRightIdx !== null ? Number(activeRightIdx) : leftNumIdx;\n\n leftPadTarget = sectionLeftRefs.current[leftNumIdx]?.current || null;\n rightPadTarget = sectionRightRefs.current[rightNumIdx]?.current || null;\n leftBadgeEl = lhsBadgeRefs.current[leftNumIdx]?.current || null;\n rightBadgeEl = rhsBadgeRefs.current[rightNumIdx]?.current || null;\n\n // Core Fix: Fallbacks guarantee we find an element even if badges are null\n leftAlignEl = leftBadgeEl || sectionRowRefs.current[leftNumIdx]?.current || leftPadTarget;\n rightAlignEl = rightBadgeEl || sectionRightRowRefs.current[rightNumIdx]?.current || rightPadTarget;\n }\n\n if (leftPadTarget) leftPadTarget.style.paddingTop = \"0px\";\n if (rightPadTarget) rightPadTarget.style.paddingTop = \"0px\";\n if (!isSub) {\n if (leftBadgeEl) leftBadgeEl.style.marginTop = \"0px\";\n if (rightBadgeEl) rightBadgeEl.style.marginTop = \"0px\";\n }\n\n if (!isSub && leftBadgeEl && rightBadgeEl) {\n const leftContainer = leftContainerRef.current;\n const rightContainer = rightContainerRef.current;\n if (!isVisibleInContainer(leftBadgeEl, leftContainer) || !isVisibleInContainer(rightBadgeEl, rightContainer)) {\n return;\n }\n const lRect = leftBadgeEl.getBoundingClientRect();\n const rRect = rightBadgeEl.getBoundingClientRect();\n const badgeDiff = lRect.top - rRect.top;\n\n if (Math.abs(badgeDiff) > maxBadgeOffset) return;\n\n if (badgeDiff > 0) {\n rightBadgeEl.style.marginTop = `${badgeDiff}px`;\n }\n return;\n }\n\n if (leftAlignEl && rightAlignEl && leftPadTarget && rightPadTarget) {\n const lRect = leftAlignEl.getBoundingClientRect();\n const rRect = rightAlignEl.getBoundingClientRect();\n const badgeDiff = lRect.top - rRect.top;\n\n if (badgeDiff > 0) {\n rightPadTarget.style.paddingTop = `${badgeDiff}px`;\n }\n }\n };\n\n const clearAlignmentOffsets = useCallback(() => {\n const leftIdx = activeSideBySideSectionRef.current;\n const rightIdx = activeSideBySideRightSectionRef.current;\n\n if (leftIdx !== null) {\n if (typeof leftIdx === \"string\" && leftIdx.includes(DEVIATION_BADGE_SEPARATOR)) {\n const parts = leftIdx.split(DEVIATION_BADGE_SEPARATOR);\n const leftPadTarget =\n subSectionLeftRefs.current[parts[2]]?.current ||\n sectionLeftRefs.current[Number(parts[2])]?.current ||\n null;\n const rightPadTarget =\n subSectionRightRefs.current[parts[3]]?.current ||\n sectionRightRefs.current[Number(parts[3])]?.current ||\n null;\n\n if (leftPadTarget) leftPadTarget.style.paddingTop = \"0px\";\n if (rightPadTarget) rightPadTarget.style.paddingTop = \"0px\";\n } else {\n const leftPadTarget = sectionLeftRefs.current[leftIdx as number]?.current || null;\n const rightPadTarget =\n sectionRightRefs.current[(rightIdx ?? leftIdx) as number]?.current || null;\n\n if (leftPadTarget) leftPadTarget.style.paddingTop = \"0px\";\n if (rightPadTarget) rightPadTarget.style.paddingTop = \"0px\";\n\n const leftBadge = lhsBadgeRefs.current[leftIdx as number]?.current || null;\n const rightBadge = rhsBadgeRefs.current[(rightIdx ?? leftIdx) as number]?.current || null;\n if (leftBadge) leftBadge.style.marginTop = \"0px\";\n if (rightBadge) rightBadge.style.marginTop = \"0px\";\n }\n }\n\n if (rhsTopSpacerRef.current) rhsTopSpacerRef.current.style.height = \"0px\";\n if (rhsBottomSpacerRef.current) rhsBottomSpacerRef.current.style.height = \"0px\";\n if (lhsTopSpacerRef.current) lhsTopSpacerRef.current.style.height = \"0px\";\n if (lhsBottomSpacerRef.current) lhsBottomSpacerRef.current.style.height = \"0px\";\n }, []);\n\n\n // Effects\n useEffect(() => {\n isSideBySideRef.current = isSideBySide;\n }, [isSideBySide]);\n\n useEffect(() => {\n activeSideBySideSectionRef.current = activeSideBySideSection;\n }, [activeSideBySideSection]);\n\n // Callbacks\n\n const resetSideBySide = useCallback(() => {\n clearClauseHighlight();\n setIsSideBySide(false);\n isSideBySideRef.current = false;\n sideBySideCacheRef.current = null;\n clearAlignmentOffsets();\n setActiveSideBySideSection(null);\n activeSideBySideSectionRef.current = null;\n activeSideBySideRightSectionRef.current = null;\n setIsArrowVisible(false);\n setIsSideBySideLoading(false);\n }, [clearAlignmentOffsets]);\n\n const activateSideBySide = useCallback(\n (\n idx: number | string,\n isOrphan: boolean,\n options?: { toggleIfSame?: boolean; onReady?: () => void; sourceSide?: \"left\" | \"right\" },\n ) => {\n const toggleIfSame = options?.toggleIfSame ?? true;\n const onReady = options?.onReady;\n const sourceSide = options?.sourceSide ?? \"left\";\n\n closeMoreFunctionsPopup();\n\n if (idx == null) return;\n\n // In Guideline Mode, we don't care about orphans, the whole rulebook is the counterpart.\n if (isOrphan && !isGuidelineMode) {\n setErrorToast(\"No counterpart exists for this section.\");\n return;\n }\n clearClauseHighlight();\n const isSameTarget = isSideBySide && activeSideBySideSection === idx;\n if (isSideBySide && activeSideBySideSection !== null) {\n clearAlignmentOffsets();\n }\n if (isSameTarget && toggleIfSame) {\n resetSideBySide();\n return;\n }\n\n setConnectedSections(new Set([idx]));\n setConnectedLines([]);\n cachedConnectedPositions.current = [];\n setIsSideBySideLoading(true);\n scrollLock.current = true;\n setActiveSideBySideSection(idx);\n activeSideBySideSectionRef.current = idx;\n setIsSideBySide(true);\n isSideBySideRef.current = true;\n setIsArrowVisible(false);\n\n if (rhsTopSpacerRef.current) rhsTopSpacerRef.current.style.height = \"0px\";\n if (rhsBottomSpacerRef.current) rhsBottomSpacerRef.current.style.height = \"0px\";\n if (lhsTopSpacerRef.current) lhsTopSpacerRef.current.style.height = \"0px\";\n if (lhsBottomSpacerRef.current) lhsBottomSpacerRef.current.style.height = \"0px\";\n\n requestAnimationFrame(() => {\n const executeAlignment = () => {\n const isSub = typeof idx === \"string\" && idx.includes(DEVIATION_BADGE_SEPARATOR);\n let leftEl: HTMLElement | null = null;\n let rightEl: HTMLElement | null = null;\n let activeRightIdx: number | string | null = null;\n\n if (isGuidelineMode) {\n // In guideline mode, grab leftEl normally, but rightEl is the injected <mark>\n if (isSub) {\n const parts = (idx as string).split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n leftEl = lhsBadgeRefs.current[refId]?.current || null;\n } else {\n leftEl = sectionLeftRefs.current[idx as number]?.current || sectionRowRefs.current[idx as number]?.current || null;\n }\n \n rightEl = document.getElementById('guideline-target-0');\n activeRightIdx = rightEl ? idx : null;\n } else {\n if (isSub) {\n const parts = (idx as string).split(DEVIATION_BADGE_SEPARATOR);\n const refId = `${parts[0]}${DEVIATION_BADGE_SEPARATOR}${parts[1]}`;\n \n leftEl = lhsBadgeRefs.current[refId]?.current || null;\n rightEl = rhsBadgeRefs.current[refId]?.current || null;\n activeRightIdx = rightEl ? idx : null;\n } else {\n leftEl = sectionLeftRefs.current[idx as number]?.current || sectionRowRefs.current[idx as number]?.current || null;\n \n if (!maintainRelativeOrder) {\n rightEl = sectionRightRefs.current[idx as number]?.current || sectionRightRowRefs.current[idx as number]?.current || null;\n activeRightIdx = rightEl ? idx : null;\n } else {\n const leftSec = proposedSections[idx as number] as any;\n const refIdxs = (leftSec?.refIndexes || []) as number[];\n \n if (refIdxs.length > 0) {\n const rhsSelfIndex = refIdxs[0];\n const rhsArrayIdx = existingSections.findIndex(\n (s: any) => s.selfIndex === rhsSelfIndex,\n );\n if (rhsArrayIdx !== -1) {\n rightEl = sectionRightRefs.current[rhsArrayIdx]?.current || sectionRightRowRefs.current[rhsArrayIdx]?.current || null;\n activeRightIdx = rhsArrayIdx;\n }\n }\n }\n }\n }\n\n activeSideBySideRightSectionRef.current = activeRightIdx;\n\n const leftContainer = leftContainerRef.current;\n const rightContainer = rightContainerRef.current;\n\n // Force visual alignment instantly after scroll animation completes\n const forceLayoutSync = () => {\n if (sourceSide === \"right\" && rightContainer) {\n rightContainer.dispatchEvent(new Event(\"scroll\"));\n } else if (leftContainer) {\n leftContainer.dispatchEvent(new Event(\"scroll\"));\n }\n };\n\n\n // CONSOLIDATED SCROLL COMPLETION HANDLER\n const finalizeSideBySide = () => {\n applyAlignmentPadding(isSub, idx, activeRightIdx);\n setIsArrowVisible(true);\n if (calculateLinesRef.current) calculateLinesRef.current();\n scrollLock.current = false;\n forceLayoutSync();\n setIsSideBySideLoading(false);\n onReady?.();\n };\n\n if (!leftEl || !leftContainer) {\n scrollLock.current = false;\n setIsSideBySideLoading(false);\n onReady?.();\n return;\n }\n\n if (!rightEl || !rightContainer) {\n finalizeSideBySide();\n return;\n }\n\n if (!maintainRelativeOrder) {\n let targetTop = 0;\n if (sourceSide === \"right\") {\n targetTop = rightEl ? rightEl.getBoundingClientRect().top : 0;\n } else {\n targetTop = leftEl ? leftEl.getBoundingClientRect().top : 0;\n }\n\n const scrollContainer = scrollContainerRef.current;\n const containerTop = scrollContainer?.getBoundingClientRect().top || 0;\n const nextTop = scrollContainer\n ? scrollContainer.scrollTop + targetTop - containerTop - 150\n : 0;\n const ANIM_SPEED = 200;\n\n if (!scrollContainer) {\n finalizeSideBySide();\n return;\n }\n\n smoothScrollTo(scrollContainer, nextTop, ANIM_SPEED, finalizeSideBySide);\n return;\n }\n\n const leftAbsoluteTop = leftEl.getBoundingClientRect().top - leftContainer.getBoundingClientRect().top + leftContainer.scrollTop;\n const rightAbsoluteTop = rightEl.getBoundingClientRect().top - rightContainer.getBoundingClientRect().top + rightContainer.scrollTop;\n const ANIM_SPEED = 200;\n\n if (sourceSide === \"left\") {\n const currentRelativeY = leftAbsoluteTop - leftContainer.scrollTop;\n const rawRightTargetScroll = rightAbsoluteTop - currentRelativeY;\n\n if (rawRightTargetScroll < 0) {\n if (rhsTopSpacerRef.current && !isGuidelineMode)\n rhsTopSpacerRef.current.style.height = `${Math.abs(rawRightTargetScroll)}px`;\n }\n\n requestAnimationFrame(() => {\n const rightMaxScroll = rightContainer.scrollHeight - rightContainer.clientHeight;\n let rightActualScroll: number;\n\n if (rawRightTargetScroll < 0) {\n rightActualScroll = 0;\n } else if (rawRightTargetScroll > rightMaxScroll) {\n const deficit = rawRightTargetScroll - rightMaxScroll;\n if (rhsBottomSpacerRef.current && !isGuidelineMode)\n rhsBottomSpacerRef.current.style.height = `${deficit + 150}px`;\n requestAnimationFrame(() => {\n smoothScrollTo(rightContainer, rawRightTargetScroll, ANIM_SPEED, finalizeSideBySide);\n });\n return;\n } else {\n rightActualScroll = rawRightTargetScroll;\n }\n\n smoothScrollTo(rightContainer, rightActualScroll, ANIM_SPEED, finalizeSideBySide);\n });\n } else {\n const currentRelativeY = rightAbsoluteTop - rightContainer.scrollTop;\n const rawLeftTargetScroll = leftAbsoluteTop - currentRelativeY;\n\n // STRICT FIX: Removed LHS Top Spacer injection. LHS acts strictly as scroll target without manipulation.\n requestAnimationFrame(() => {\n const leftMaxScroll = leftContainer.scrollHeight - leftContainer.clientHeight;\n let leftActualScroll: number;\n\n if (rawLeftTargetScroll < 0) {\n leftActualScroll = 0;\n } else if (rawLeftTargetScroll > leftMaxScroll) {\n requestAnimationFrame(() => smoothScrollTo(leftContainer, leftMaxScroll, ANIM_SPEED, finalizeSideBySide));\n return;\n } else {\n leftActualScroll = rawLeftTargetScroll;\n }\n smoothScrollTo(leftContainer, leftActualScroll, ANIM_SPEED, finalizeSideBySide);\n });\n }\n };\n\n // Because GuidelinePanel re-renders when setConnectedSections fires,\n // we must wait a tick for the `<mark>` tags to paint to the DOM before calculating scroll bounds.\n if (isGuidelineMode) {\n setTimeout(executeAlignment, 100);\n } else {\n executeAlignment();\n }\n });\n },\n [\n activeSideBySideSection,\n closeMoreFunctionsPopup,\n existingSections,\n isSideBySide,\n maintainRelativeOrder,\n proposedSections,\n clearAlignmentOffsets,\n resetSideBySide,\n isGuidelineMode\n ],\n );\n\n return {\n isSideBySide, setIsSideBySide,\n isArrowVisible, setIsArrowVisible,\n isResizing, setIsResizing,\n isSideBySideLoading, setIsSideBySideLoading,\n activeSideBySideSection, setActiveSideBySideSection,\n scrollLock,\n sideBySideCacheRef,\n isSideBySideRef,\n activeSideBySideSectionRef,\n activeSideBySideRightSectionRef,\n sideBySideLineRef,\n highlightedClauseRefs,\n clearClauseHighlight,\n applyAlignmentPadding,\n resetSideBySide,\n activateSideBySide,\n }\n}"],"names":["useSideBySide","isGuidelineMode","maintainRelativeOrder","proposedSections","existingSections","leftContainerRef","rightContainerRef","scrollContainerRef","sectionLeftRefs","sectionRightRefs","subSectionLeftRefs","subSectionRightRefs","lhsBadgeRefs","rhsBadgeRefs","sectionRowRefs","sectionRightRowRefs","rhsTopSpacerRef","rhsBottomSpacerRef","lhsTopSpacerRef","lhsBottomSpacerRef","calculateLinesRef","setConnectedSections","setConnectedLines","cachedConnectedPositions","closeMoreFunctionsPopup","setErrorToast","moreFunctions","closeSummaryPopup","isSideBySide","setIsSideBySide","useState","isArrowVisible","setIsArrowVisible","isResizing","setIsResizing","isSideBySideLoading","setIsSideBySideLoading","activeSideBySideSection","setActiveSideBySideSection","scrollLock","useRef","sideBySideCacheRef","isSideBySideRef","activeSideBySideSectionRef","activeSideBySideRightSectionRef","sideBySideLineRef","highlightedClauseRefs","Set","clearClauseHighlight","current","forEach","el","resetClauseHighlight","clear","applyAlignmentPadding","isSub","idx","activeRightIdx","leftPadTarget","rightPadTarget","leftAlignEl","rightAlignEl","leftBadgeEl","rightBadgeEl","isVisibleInContainer","container","rect","getBoundingClientRect","cRect","bottom","top","parts","split","DEVIATION_BADGE_SEPARATOR","refId","Number","leftNumIdx","rightNumIdx","style","paddingTop","marginTop","leftContainer","rightContainer","lRect","rRect","badgeDiff","Math","abs","clearAlignmentOffsets","useCallback","leftIdx","rightIdx","includes","leftBadge","rightBadge","height","useEffect","resetSideBySide","activateSideBySide","isOrphan","options","toggleIfSame","onReady","sourceSide","isSameTarget","requestAnimationFrame","executeAlignment","leftEl","rightEl","document","getElementById","leftSec","refIdxs","refIndexes","length","rhsSelfIndex","rhsArrayIdx","findIndex","s","selfIndex","finalizeSideBySide","dispatchEvent","Event","targetTop","scrollContainer","containerTop","nextTop","scrollTop","smoothScrollTo","leftAbsoluteTop","rightAbsoluteTop","ANIM_SPEED","rawRightTargetScroll","rightMaxScroll","scrollHeight","clientHeight","rightActualScroll","deficit","rawLeftTargetScroll","leftMaxScroll","leftActualScroll","setTimeout"],"mappings":"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"}