@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,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.ARROW_SIZE=10,exports.DEFAULT_COMPONENT_HEADER_TEXT="Contract Comparison",exports.DEFAULT_DEVIAION_COLOR="#3730A3",exports.EMPTY_SECTION_POPUP_STATE={isLoading:!1,open:!1,sectionTitle:"",refSectionTitle:"",cognitiveData:null,anchorEl:null,sectionAnchorEl:null,badgeStyle:null,sectionIdx:null,isOrphan:!1,docData:null,deviationData:null},exports.EMPTY_SUMMARY_POPUP_STATE={open:!1,anchorEl:null,summary:"",markdownStyles:{},displayImpact:!1},exports.POPUP_GAP=12,exports.POPUP_WIDTH=1050,exports.VIEWPORT_MARGIN=12;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.ARROW_SIZE=10,exports.DEFAULT_COMPONENT_HEADER_TEXT="Contract Comparison",exports.DEFAULT_DEVIAION_COLOR="#3730A3",exports.EMPTY_SECTION_POPUP_STATE={isLoading:!1,open:!1,sectionTitle:"",refSectionTitle:"",cognitiveData:null,anchorEl:null,sectionAnchorEl:null,badgeStyle:null,sectionIdx:null,isOrphan:!1,docData:null,deviationData:null},exports.EMPTY_SUMMARY_POPUP_STATE={open:!1,anchorEl:null,summary:"",markdownStyles:{},displayImpact:!1},exports.POPUP_GAP=12,exports.POPUP_WIDTH=680,exports.VIEWPORT_MARGIN=12;
2
2
  //# sourceMappingURL=CognitiveCompareConstants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CognitiveCompareConstants.js","sources":["../../../../src/features/CognitiveCompare/CognitiveCompareConstants.ts"],"sourcesContent":["import { RuleData, SectionPopupState, SummaryPopupState } from \"./CognitiveCompareTypes\";\n\nexport const DEFAULT_DEVIAION_COLOR = \"#3730A3\";\n\nexport const POPUP_GAP = 12;\nexport const POPUP_WIDTH = 1050;\nexport const VIEWPORT_MARGIN = 12;\nexport const ARROW_SIZE = 10;\n\n\nexport const DEFAULT_RULE_FALLBACK: RuleData = { id: \"\", title: \"\" };\nexport const DEFAULT_COMPONENT_HEADER_TEXT = \"Contract Comparison\";\nexport const EMPTY_SECTION_POPUP_STATE: SectionPopupState = {\n isLoading: false,\n open: false,\n sectionTitle: \"\",\n refSectionTitle: \"\",\n cognitiveData: null,\n anchorEl: null,\n sectionAnchorEl: null,\n badgeStyle: null,\n sectionIdx: null,\n isOrphan: false,\n docData: null,\n deviationData: null\n};\n\nexport const EMPTY_SUMMARY_POPUP_STATE:SummaryPopupState = {\n open: false,\n anchorEl: null,\n summary: \"\",\n markdownStyles: {},\n displayImpact: false,\n}\n"],"names":["isLoading","open","sectionTitle","refSectionTitle","cognitiveData","anchorEl","sectionAnchorEl","badgeStyle","sectionIdx","isOrphan","docData","deviationData","summary","markdownStyles","displayImpact"],"mappings":"uFAO0B,yCAImB,qDATP,4CAUsB,CAC1DA,WAAW,EACXC,MAAM,EACNC,aAAc,GACdC,gBAAiB,GACjBC,cAAe,KACfC,SAAU,KACVC,gBAAiB,KACjBC,WAAY,KACZC,WAAY,KACZC,UAAU,EACVC,QAAS,KACTC,cAAe,wCAG0C,CACzDV,MAAM,EACNI,SAAU,KACVO,QAAS,GACTC,eAAgB,CAAC,EACjBC,eAAe,qBA5BQ,uBACE,6BACI"}
1
+ {"version":3,"file":"CognitiveCompareConstants.js","sources":["../../../../src/features/CognitiveCompare/CognitiveCompareConstants.ts"],"sourcesContent":["import { RuleData, SectionPopupState, SummaryPopupState } from \"./CognitiveCompareTypes\";\n\nexport const DEFAULT_DEVIAION_COLOR = \"#3730A3\";\n\nexport const POPUP_GAP = 12;\nexport const POPUP_WIDTH = 680;\nexport const VIEWPORT_MARGIN = 12;\nexport const ARROW_SIZE = 10;\n\n\nexport const DEFAULT_RULE_FALLBACK: RuleData = { id: \"\", title: \"\" };\nexport const DEFAULT_COMPONENT_HEADER_TEXT = \"Contract Comparison\";\nexport const EMPTY_SECTION_POPUP_STATE: SectionPopupState = {\n isLoading: false,\n open: false,\n sectionTitle: \"\",\n refSectionTitle: \"\",\n cognitiveData: null,\n anchorEl: null,\n sectionAnchorEl: null,\n badgeStyle: null,\n sectionIdx: null,\n isOrphan: false,\n docData: null,\n deviationData: null\n};\n\nexport const EMPTY_SUMMARY_POPUP_STATE:SummaryPopupState = {\n open: false,\n anchorEl: null,\n summary: \"\",\n markdownStyles: {},\n displayImpact: false,\n}"],"names":["isLoading","open","sectionTitle","refSectionTitle","cognitiveData","anchorEl","sectionAnchorEl","badgeStyle","sectionIdx","isOrphan","docData","deviationData","summary","markdownStyles","displayImpact"],"mappings":"uFAO0B,yCAImB,qDATP,4CAUsB,CAC1DA,WAAW,EACXC,MAAM,EACNC,aAAc,GACdC,gBAAiB,GACjBC,cAAe,KACfC,SAAU,KACVC,gBAAiB,KACjBC,WAAY,KACZC,WAAY,KACZC,UAAU,EACVC,QAAS,KACTC,cAAe,wCAG0C,CACzDV,MAAM,EACNI,SAAU,KACVO,QAAS,GACTC,eAAgB,CAAC,EACjBC,eAAe,qBA5BQ,uBACE,4BACI"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("./CognitiveCompareConstants.js"),e=require("./utils/normalizeRedlineMarkdown.js");const n=t=>null==t?"":"string"==typeof t?t:Array.isArray(t)?t.map(n).join("\n\n"):"object"==typeof t?JSON.stringify(t):String(t),r=t=>null!=t&&("string"==typeof t?t.trim().length>0:!Array.isArray(t)||t.length>0&&t.some(t=>r(t))),o=t=>{let e=t+1,n="";for(;e>0;){e-=1;const t=97;n=String.fromCharCode(t+e%26)+n,e=Math.floor(e/26)}return n},s=(t,e,n,r={})=>{const o=n[e],s=t?.comparison_inputs?.[o];if(!s)return[];return(Array.isArray(s)?s:[s]).map((t,e)=>{if(t&&"string"==typeof t&&t.trim()){const e=r[t];return e&&"object"==typeof e&&e?{contentId:t,data:e,attributes:e.additional_attributes||{}}:null}if(t&&"object"==typeof t){return{contentId:t.content_id||t.id||`${o}-direct-${e}`,data:t,attributes:t.additional_attributes||{}}}return null}).filter(Boolean)};const i=t=>{if(!t)return!0;const e=t.trim().toLowerCase();return e.includes("no equivalent")||"n/a"===e||"na"===e||"none"===e},l=t=>{if("string"!=typeof t||!t)return!1;const e=/<(updated|deleted|changed|change)\b[^>]*>([\s\S]*?)<\/\1>/gi;let n=null;for(;null!==(n=e.exec(t));){if((n[2]??"").replace(/<[^>]*>/g,"").trim().length>0)return!0}return!1},a=t=>"string"==typeof t&&t?t.replace(/<\/?(updated|deleted|changed|change)\b[^>]*>/gi,""):"",u=(t,e)=>{let n="";const r=[],o=[];for(let s=0;s<t.length;s+=1){const i=t[s],l=e&&/[\.,;:]/.test(i),a=/\s/.test(i)||l?" ":/[’‘`]/.test(i)?"'":/[”“]/.test(i)?'"':/[—–]/.test(i)?"-":i;" "===a&&n.endsWith(" ")?o[o.length-1]=s+1:(n+=a,r.push(s),o.push(s+1))}return{text:n,starts:r,ends:o}},c=(t,e,n=!1)=>{if(!t||!e)return null;const r=t.toLowerCase().indexOf(e.toLowerCase());if(-1!==r)return{start:r,end:r+e.length};const o=u(t,n),s=u(e,n).text.trim().toLowerCase();if(!s)return null;const i=o.text.toLowerCase().indexOf(s);if(-1===i)return null;const l=i+s.length-1,a=o.starts[i],c=o.ends[l];return void 0===a||void 0===c?null:{start:a,end:c}},d=["#B91C1C","#A16207","#1D4ED8","#000000"],p=t=>{const e=d.findIndex(e=>e.toLowerCase()===t.toLowerCase());return-1===e?d.length:e},g=(t,e,n)=>{if(!t)return null;if(t.id===n||t.nodeId===n||t.contentId===n)return e;if(!Array.isArray(t.subsections))return null;for(let r=0;r<t.subsections.length;r++){const o=g(t.subsections[r],`${e}-${r}`,n);if(o)return o}return null},f=new WeakMap,h=t=>{if(!t)return;const e=f.get(t);null!=e&&(clearTimeout(e),f.delete(t)),t.style.transition="box-shadow 300ms ease-out, outline 300ms ease-out",requestAnimationFrame(()=>{t.style.outline="",t.style.boxShadow=""}),window.setTimeout(()=>{t.style.transition="",t.style.borderRadius=""},300)},b=t=>{if(!t)return;const e=f.get(t);null!=e&&clearTimeout(e),t.style.transition="box-shadow 300ms ease-in-out, outline 300ms ease-in-out",t.style.outline="2px solid #ff9494",t.style.borderRadius="6px",t.style.boxShadow="0 0 12px 2px rgba(244, 113, 113, 0.33)";const n=window.setTimeout(()=>{h(t)},3e3);f.set(t,n)};exports.DEVIATION_BADGE_SEPARATOR="::",exports.areMarkdownPropsEqual=(t,e)=>{if(t.content!==e.content)return!1;if(t.overlayContent!==e.overlayContent)return!1;if(t.fallbackContent!==e.fallbackContent)return!1;if(t.sxStyles!==e.sxStyles)return!1;if(t.maintainRelativeOrder!==e.maintainRelativeOrder)return!1;if(t.highlightBg!==e.highlightBg)return!1;if(t.suppressHighlightBg!==e.suppressHighlightBg)return!1;if(t.collisionKey!==e.collisionKey)return!1;const n=t.highlights||[],r=e.highlights||[];if(n.length!==r.length)return!1;for(let t=0;t<n.length;t++)if(n[t]!==r[t])return!1;const o=t.deviationBadges||[],s=e.deviationBadges||[];if(o.length!==s.length)return!1;for(let t=0;t<o.length;t++){if(o[t].id!==s[t].id)return!1;if(o[t].actionId!==s[t].actionId)return!1;if(o[t].label!==s[t].label)return!1;if(o[t].score!==s[t].score)return!1;if(o[t].isOrphan!==s[t].isOrphan)return!1;if(o[t].isConnected!==s[t].isConnected)return!1;if(o[t].showScrollLockToggle!==s[t].showScrollLockToggle)return!1;if(o[t].scrollSyncLocked!==s[t].scrollSyncLocked)return!1;if(o[t].style?.badgeBg!==s[t].style?.badgeBg)return!1;if(o[t].style?.badgeBorder!==s[t].style?.badgeBorder)return!1;if(o[t].style?.badgeText!==s[t].style?.badgeText)return!1}return!0},exports.debounce=function(t,e){let n;return function(...r){const o=this;clearTimeout(n),n=setTimeout(()=>t.apply(o,r),e)}},exports.extractDeviationScore=(t,e)=>{if(!t)return e;return t.evaluation_output?.output_score??t.evaluation_outputs?.output_score??t.evaluation_outputs?.output_value??t.output_score??e??""},exports.findKeyPathByNodeId=(t,e)=>{for(let n=0;n<t.length;n++){const r=g(t[n],String(n),e);if(r)return r}return null},exports.findRedlineTextAnchorRange=(t,e)=>{const n=c(t,e,!0);if(n)return n;const r=e.split(/\n+/).map(t=>t.trim()).filter(t=>{if(t.length<12)return!1;return!(""===t.replace(/[|:\-\s]/g,""))});for(const e of r){const n=c(t,e,!0);if(n)return n}return null},exports.findTextMatchRange=c,exports.generateColorPalette=function(t){const e=(t,e)=>{const{r:n,g:r,b:o}=(t=>{const e=(t=>4===t.length?"#"+t[1]+t[1]+t[2]+t[2]+t[3]+t[3]:t)(t).replace("#",""),n=parseInt(e,16);return{r:n>>16&255,g:n>>8&255,b:255&n}})(t);return((t,e,n)=>"#"+[t,e,n].map(t=>t.toString(16).padStart(2,"0")).join("").toUpperCase())(Math.round(n+(255-n)*e),Math.round(r+(255-r)*e),Math.round(o+(255-o)*e))};return{bg:e(t,.8),border:e(t,.5),badgeBg:e(t,.8),badgeBorder:e(t,.5),badgeText:t.toUpperCase(),highlightBg:e(t,.8)}},exports.getAlphabeticSuffix=o,exports.getBentArrowPath=(t,e,n,r,o=14)=>{const s=t+.5*(n-t),i=r-e;if(Math.abs(i)<3)return`M ${t} ${e} H ${n}`;const l=i>0?1:-1,a=Math.min(o,Math.abs(i)/2,Math.abs(s-t)/2,Math.abs(n-s)/2);return[`M ${t} ${e}`,"H "+(s-a),`Q ${s} ${e} ${s} ${e+l*a}`,"V "+(r-l*a),`Q ${s} ${r} ${s+a} ${r}`,`H ${n}`].join(" ")},exports.getFirstDeviationColor=e=>{const n=[],r=Object.keys(e?.deviations||{}).sort((t,e)=>Number(t)-Number(e));for(const t of r){const r=e?.deviations?.[t]?.evaluation_outputs?.metadata?.label_color;r&&n.push(r)}const o=Object.keys(e?.deviation_entries||{}).sort((t,e)=>Number(t)-Number(e));for(const t of o){const r=e?.deviation_entries?.[t]?.evaluation_outputs?.metadata?.label_color;r&&n.push(r)}const s=Object.keys(e||{}).filter(t=>/^\d+$/.test(t)).sort((t,e)=>Number(t)-Number(e));for(const t of s){const r=e?.[t]?.evaluation_outputs?.metadata?.label_color;r&&n.push(r)}return 0===n.length?e?.evaluation_outputs?.metadata?.label_color?e.evaluation_outputs.metadata.label_color:t.DEFAULT_DEVIAION_COLOR:n.sort((t,e)=>p(t)-p(e))[0]},exports.getFirstDeviationOutputValue=t=>{const e=Object.keys(t?.deviations||{}).sort((t,e)=>Number(t)-Number(e));for(const n of e){const e=t?.deviations?.[n]?.evaluation_outputs?.output_value;if(e)return e}const n=Object.keys(t?.deviation_entries||{}).sort((t,e)=>Number(t)-Number(e));for(const e of n){const n=t?.deviation_entries?.[e]?.evaluation_outputs?.output_value;if(n)return n}const r=Object.keys(t||{}).filter(t=>/^\d+$/.test(t)).sort((t,e)=>Number(t)-Number(e));for(const e of r){const n=t?.[e]?.evaluation_outputs?.output_value;if(n)return n}return t?.evaluation_outputs?.output_value?t.evaluation_outputs.output_value:null},exports.getLhsDeviationDisplayIndexes=(t,r,o)=>{const s=new Map;if(!r)return s;const u=t=>{const r=n(t||"").replace(/\\n/g,"\n");return l(r)?a(e.normalizeRedlineMarkdown(r)):r};return(t||[]).forEach(t=>{const e=new Map,n=t=>{if(!t)return;const s=u(t.content);(t.evaluationResults?.length?t.evaluationResults:t.evaluationResult?[t.evaluationResult]:[]).forEach(n=>{const l=n?.nodeId||t.nodeId||t.id;Object.entries(n?.deviations||{}).forEach(([t,n])=>{const a=n[r],d=u(a);if(!d||i(a)||!c(s,d))return;const p=`${l}::${t}`,g=o[p];null!=g&&e.set(p,g)})}),(t.subsections||[]).forEach(n)};if(n(t),0===e.size)return;const l=Math.min(...Array.from(e.values()));e.forEach((t,e)=>{s.set(e,t-l+1)})}),s},exports.getRationale=t=>{if(!t.mapping_rationale)return{cognitiveData:{decisioning:[],gap:[],relevance_score:0,isMissingRationale:!0,citations:[]},score:0,relation:"N/A"};const e=t.mapping_rationale,n=parseInt(e.decision_strength||"0");return{cognitiveData:{decisioning:e.decisioning_factors||[],gap:e.gaps_in_decision||[],relevance_score:n,citations:e.citations},score:0,relation:"N/A"}},exports.getRhsMappedSectionNumber=({section:t,proposedSections:e,leftNums:n,fallbackNumber:r,firstOnly:s=!1})=>{if(!t?.id)return r;const i=(e||[]).map(e=>{const r=Array.isArray(e?.refIndexes)?e.refIndexes:[],s=r.findIndex(e=>e===t.selfIndex);if(-1===s)return null;const i=e?.id?n.get(e.id):void 0;return null==i?null:r.length>1?`${i}${o(s)}`:String(i)}).filter(Boolean);return 0===i.length?r:s?i[0]:i.join(", ")},exports.getSideData=(t,e,r,o={})=>{const i=s(t,e,r,o),l=i[0]?.data||{},a=i[0]?.attributes||null;return{title:n(l?.title||""),content:n(l?.content||""),change_history:n(l?.change_history||""),attributes:a,subsections:l?.subsections||[],contentId:i[0]?.contentId,allItems:i}},exports.hasMeaningfulRedlineTags=l,exports.hasSingleMappedLhsSection=(t,e)=>{if(null==t?.selfIndex)return!1;return 1===(e||[]).filter(e=>Array.isArray(e?.refIndexes)&&e.refIndexes.includes(t.selfIndex)).length},exports.hasValue=r,exports.highlightClause=b,exports.isMissingStr=i,exports.mixHexColors=(t,e)=>{const n=t=>{const e=t.replace("#","");return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]},r=t=>{const e=Math.round(t).toString(16);return 1===e.length?"0"+e:e};try{const o=n(t),s=n(e),i=(o[0]+s[0])/2*.95,l=(o[1]+s[1])/2*.95,a=(o[2]+s[2])/2*.95;return`#${r(i)}${r(l)}${r(a)}`}catch(t){return"#FDE68A"}},exports.recursivelyFindSubSectionIdxById=g,exports.resetClauseHighlight=h,exports.resolveComparisonInputItems=s,exports.safeStringify=n,exports.scrollAndHighlightClause=(t,e)=>{const n=e.getBoundingClientRect(),r=t.getBoundingClientRect(),o=e.scrollTop+r.top-n.top-n.height/2+r.height/2;e.scrollTo({top:o,behavior:"smooth"});const s=()=>b(t);if("onscrollend"in e)e.addEventListener("scrollend",s,{once:!0});else{let t=e.scrollTop;const n=()=>{e.scrollTop===t?s():(t=e.scrollTop,requestAnimationFrame(n))};requestAnimationFrame(n)}},exports.scrollAndWait=(t,e,n)=>{if(Math.abs(t.scrollTop-e)<=2)return void n();let r=!1,o=null;const s=()=>{r||(r=!0,o&&(clearTimeout(o),t.removeEventListener("scrollend",i),n()))},i=()=>s();t.addEventListener("scrollend",i),t.scrollTo({top:e,behavior:"smooth"}),o=setTimeout(s,800)},exports.smoothScrollTo=(t,e,n=300,r,o)=>{const s=t.style.scrollBehavior;t.style.scrollBehavior="auto";const i=t.scrollTop,l=e-i;let a=null;const u=c=>{null===a&&(a=c);const d=c-a;var p;d<n?(t.scrollTop=(p=d,p/=n,l*(--p*p*p+1)+i),o&&o(),requestAnimationFrame(u)):(t.scrollTop=e,t.style.scrollBehavior=s,o&&o(),r&&r())};requestAnimationFrame(u)},exports.stripRedlineTags=a,exports.waitForScrollIdle=(t,e=100)=>new Promise(n=>{let r=!1,o=null;const s=()=>{r||(r=!0,t.removeEventListener("scroll",i),n())},i=()=>{o&&(clearTimeout(o),o=setTimeout(s,e))};t.addEventListener("scroll",i),o=setTimeout(s,e)});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("./CognitiveCompareConstants.js");const e=t=>null==t?"":"string"==typeof t?t:Array.isArray(t)?t.map(e).join("\n\n"):"object"==typeof t?JSON.stringify(t):String(t),r=t=>null!=t&&("string"==typeof t?t.trim().length>0:!Array.isArray(t)||t.length>0&&t.some(t=>r(t))),n=t=>{let e=t+1,r="";for(;e>0;){e-=1;const t=97;r=String.fromCharCode(t+e%26)+r,e=Math.floor(e/26)}return r},o=(t,e,r,n={})=>{const o=r[e],s=t?.comparison_inputs?.[o];if(!s)return[];return(Array.isArray(s)?s:[s]).map((t,e)=>{if(t&&"string"==typeof t&&t.trim()){const e=n[t];return e&&"object"==typeof e&&e?{contentId:t,data:e,attributes:e.additional_attributes||{}}:null}if(t&&"object"==typeof t){return{contentId:t.content_id||t.id||`${o}-direct-${e}`,data:t,attributes:t.additional_attributes||{}}}return null}).filter(Boolean)};const s=t=>{if(!t)return!0;const e=t.trim().toLowerCase();return e.includes("no equivalent")||"n/a"===e||"na"===e||"none"===e},i=t=>{if("string"!=typeof t||!t)return!1;const e=/<(updated|deleted|changed|change)\b[^>]*>([\s\S]*?)<\/\1>/gi;let r=null;for(;null!==(r=e.exec(t));){if((r[2]??"").replace(/<[^>]*>/g,"").trim().length>0)return!0}return!1},a=t=>"string"==typeof t&&t?t.replace(/<\/?(updated|deleted|changed|change)\b[^>]*>/gi,""):"",l=["#B91C1C","#A16207","#1D4ED8","#000000"],u=t=>{const e=l.findIndex(e=>e.toLowerCase()===t.toLowerCase());return-1===e?l.length:e},c=(t,e,r)=>{if(!t)return null;if(t.id===r||t.nodeId===r||t.contentId===r)return e;if(!Array.isArray(t.subsections))return null;for(let n=0;n<t.subsections.length;n++){const o=c(t.subsections[n],`${e}-${n}`,r);if(o)return o}return null},d=new WeakMap,p=t=>{if(!t)return;const e=d.get(t);null!=e&&(clearTimeout(e),d.delete(t)),t.style.transition="box-shadow 300ms ease-out, outline 300ms ease-out",requestAnimationFrame(()=>{t.style.outline="",t.style.boxShadow=""}),window.setTimeout(()=>{t.style.transition="",t.style.borderRadius=""},300)},g=t=>{if(!t)return;const e=d.get(t);null!=e&&clearTimeout(e),t.style.transition="box-shadow 300ms ease-in-out, outline 300ms ease-in-out",t.style.outline="2px solid #ff9494",t.style.borderRadius="6px",t.style.boxShadow="0 0 12px 2px rgba(244, 113, 113, 0.33)";const r=window.setTimeout(()=>{p(t)},3e3);d.set(t,r)};exports.DEVIATION_BADGE_SEPARATOR="::",exports.areMarkdownPropsEqual=(t,e)=>{if(t.content!==e.content)return!1;if(t.overlayContent!==e.overlayContent)return!1;if(t.sxStyles!==e.sxStyles)return!1;if(t.maintainRelativeOrder!==e.maintainRelativeOrder)return!1;if(t.highlightBg!==e.highlightBg)return!1;if(t.suppressHighlightBg!==e.suppressHighlightBg)return!1;if(t.collisionKey!==e.collisionKey)return!1;const r=t.highlights||[],n=e.highlights||[];if(r.length!==n.length)return!1;for(let t=0;t<r.length;t++)if(r[t]!==n[t])return!1;const o=t.deviationBadges||[],s=e.deviationBadges||[];if(o.length!==s.length)return!1;for(let t=0;t<o.length;t++){if(o[t].id!==s[t].id)return!1;if(o[t].actionId!==s[t].actionId)return!1;if(o[t].label!==s[t].label)return!1;if(o[t].score!==s[t].score)return!1;if(o[t].isOrphan!==s[t].isOrphan)return!1;if(o[t].isConnected!==s[t].isConnected)return!1;if(o[t].showScrollLockToggle!==s[t].showScrollLockToggle)return!1;if(o[t].scrollSyncLocked!==s[t].scrollSyncLocked)return!1;if(o[t].style?.badgeBg!==s[t].style?.badgeBg)return!1;if(o[t].style?.badgeBorder!==s[t].style?.badgeBorder)return!1;if(o[t].style?.badgeText!==s[t].style?.badgeText)return!1}return!0},exports.debounce=function(t,e){let r;return function(...n){const o=this;clearTimeout(r),r=setTimeout(()=>t.apply(o,n),e)}},exports.extractDeviationScore=(t,e)=>{if(!t)return e;return t.evaluation_output?.output_score??t.evaluation_outputs?.output_score??t.evaluation_outputs?.output_value??t.output_score??e??""},exports.findKeyPathByNodeId=(t,e)=>{for(let r=0;r<t.length;r++){const n=c(t[r],String(r),e);if(n)return n}return null},exports.generateColorPalette=function(t){const e=(t,e)=>{const{r:r,g:n,b:o}=(t=>{const e=(t=>4===t.length?"#"+t[1]+t[1]+t[2]+t[2]+t[3]+t[3]:t)(t).replace("#",""),r=parseInt(e,16);return{r:r>>16&255,g:r>>8&255,b:255&r}})(t);return((t,e,r)=>"#"+[t,e,r].map(t=>t.toString(16).padStart(2,"0")).join("").toUpperCase())(Math.round(r+(255-r)*e),Math.round(n+(255-n)*e),Math.round(o+(255-o)*e))};return{bg:e(t,.8),border:e(t,.5),badgeBg:e(t,.8),badgeBorder:e(t,.5),badgeText:t.toUpperCase(),highlightBg:e(t,.8)}},exports.getAlphabeticSuffix=n,exports.getBentArrowPath=(t,e,r,n,o=14)=>{const s=t+.5*(r-t),i=n-e;if(Math.abs(i)<3)return`M ${t} ${e} H ${r}`;const a=i>0?1:-1,l=Math.min(o,Math.abs(i)/2,Math.abs(s-t)/2,Math.abs(r-s)/2);return[`M ${t} ${e}`,"H "+(s-l),`Q ${s} ${e} ${s} ${e+a*l}`,"V "+(n-a*l),`Q ${s} ${n} ${s+l} ${n}`,`H ${r}`].join(" ")},exports.getFirstDeviationColor=e=>{const r=[],n=Object.keys(e?.deviations||{}).sort((t,e)=>Number(t)-Number(e));for(const t of n){const n=e?.deviations?.[t]?.evaluation_outputs?.metadata?.label_color;n&&r.push(n)}const o=Object.keys(e?.deviation_entries||{}).sort((t,e)=>Number(t)-Number(e));for(const t of o){const n=e?.deviation_entries?.[t]?.evaluation_outputs?.metadata?.label_color;n&&r.push(n)}const s=Object.keys(e||{}).filter(t=>/^\d+$/.test(t)).sort((t,e)=>Number(t)-Number(e));for(const t of s){const n=e?.[t]?.evaluation_outputs?.metadata?.label_color;n&&r.push(n)}return 0===r.length?e?.evaluation_outputs?.metadata?.label_color?e.evaluation_outputs.metadata.label_color:t.DEFAULT_DEVIAION_COLOR:r.sort((t,e)=>u(t)-u(e))[0]},exports.getFirstDeviationOutputValue=t=>{const e=Object.keys(t?.deviations||{}).sort((t,e)=>Number(t)-Number(e));for(const r of e){const e=t?.deviations?.[r]?.evaluation_outputs?.output_value;if(e)return e}const r=Object.keys(t?.deviation_entries||{}).sort((t,e)=>Number(t)-Number(e));for(const e of r){const r=t?.deviation_entries?.[e]?.evaluation_outputs?.output_value;if(r)return r}const n=Object.keys(t||{}).filter(t=>/^\d+$/.test(t)).sort((t,e)=>Number(t)-Number(e));for(const e of n){const r=t?.[e]?.evaluation_outputs?.output_value;if(r)return r}return t?.evaluation_outputs?.output_value?t.evaluation_outputs.output_value:null},exports.getLhsDeviationDisplayIndexes=(t,r,n)=>{const o=new Map;if(!r)return o;const l=t=>{const r=i(t)?a(t):e(t||"");return e(r).replace(/\\n/g,"\n")};return(t||[]).forEach(t=>{const e=new Map,i=t=>{if(!t)return;const o=l(t.content);(t.evaluationResults?.length?t.evaluationResults:t.evaluationResult?[t.evaluationResult]:[]).forEach(i=>{const a=i?.nodeId||t.nodeId||t.id;Object.entries(i?.deviations||{}).forEach(([t,i])=>{const u=i[r],c=l(u);if(!c||s(u)||!o.includes(c))return;const d=`${a}::${t}`,p=n[d];null!=p&&e.set(d,p)})}),(t.subsections||[]).forEach(i)};if(i(t),0===e.size)return;const a=Math.min(...Array.from(e.values()));e.forEach((t,e)=>{o.set(e,t-a+1)})}),o},exports.getRationale=t=>{if(!t.mapping_rationale)return{cognitiveData:{decisioning:[],gap:[],relevance_score:0,isMissingRationale:!0,citations:[]},score:0,relation:"N/A"};const e=t.mapping_rationale,r=parseInt(e.decision_strength||"0");return{cognitiveData:{decisioning:e.decisioning_factors||[],gap:e.gaps_in_decision||[],relevance_score:r,citations:e.citations},score:0,relation:"N/A"}},exports.getRhsMappedSectionNumber=({section:t,proposedSections:e,leftNums:r,fallbackNumber:o,firstOnly:s=!1})=>{if(!t?.id)return o;const i=(e||[]).map(e=>{const o=Array.isArray(e?.refIndexes)?e.refIndexes:[],s=o.findIndex(e=>e===t.selfIndex);if(-1===s)return null;const i=e?.id?r.get(e.id):void 0;return null==i?null:o.length>1?`${i}${n(s)}`:String(i)}).filter(Boolean);return 0===i.length?o:s?i[0]:i.join(", ")},exports.getSideData=(t,r,n,s={})=>{const i=o(t,r,n,s),a=i[0]?.data||{},l=i[0]?.attributes||null;return{title:e(a?.title||""),content:e(a?.content||""),change_history:e(a?.change_history||""),attributes:l,subsections:a?.subsections||[],contentId:i[0]?.contentId,allItems:i}},exports.hasMeaningfulRedlineTags=i,exports.hasSingleMappedLhsSection=(t,e)=>{if(null==t?.selfIndex)return!1;return 1===(e||[]).filter(e=>Array.isArray(e?.refIndexes)&&e.refIndexes.includes(t.selfIndex)).length},exports.hasValue=r,exports.highlightClause=g,exports.isMissingStr=s,exports.mixHexColors=(t,e)=>{const r=t=>{const e=t.replace("#","");return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]},n=t=>{const e=Math.round(t).toString(16);return 1===e.length?"0"+e:e};try{const o=r(t),s=r(e),i=(o[0]+s[0])/2*.95,a=(o[1]+s[1])/2*.95,l=(o[2]+s[2])/2*.95;return`#${n(i)}${n(a)}${n(l)}`}catch(t){return"#FDE68A"}},exports.recursivelyFindSubSectionIdxById=c,exports.resetClauseHighlight=p,exports.resolveComparisonInputItems=o,exports.safeStringify=e,exports.scrollAndHighlightClause=(t,e)=>{const r=e.getBoundingClientRect(),n=t.getBoundingClientRect(),o=e.scrollTop+n.top-r.top-r.height/2+n.height/2;e.scrollTo({top:o,behavior:"smooth"});const s=()=>g(t);if("onscrollend"in e)e.addEventListener("scrollend",s,{once:!0});else{let t=e.scrollTop;const r=()=>{e.scrollTop===t?s():(t=e.scrollTop,requestAnimationFrame(r))};requestAnimationFrame(r)}},exports.scrollAndWait=(t,e,r)=>{if(Math.abs(t.scrollTop-e)<=2)return void r();let n,o=!1;const s=()=>{o||(o=!0,clearTimeout(n),t.removeEventListener("scrollend",i),r())},i=()=>s();t.addEventListener("scrollend",i),t.scrollTo({top:e,behavior:"smooth"}),n=setTimeout(s,800)},exports.smoothScrollTo=(t,e,r=300,n,o)=>{const s=t.style.scrollBehavior;t.style.scrollBehavior="auto";const i=t.scrollTop,a=e-i;let l=null;const u=c=>{null===l&&(l=c);const d=c-l;var p;d<r?(t.scrollTop=(p=d,p/=r,a*(--p*p*p+1)+i),o&&o(),requestAnimationFrame(u)):(t.scrollTop=e,t.style.scrollBehavior=s,o&&o(),n&&n())};requestAnimationFrame(u)},exports.stripRedlineTags=a,exports.waitForScrollIdle=(t,e=100)=>new Promise(r=>{let n,o=!1;const s=()=>{o||(o=!0,t.removeEventListener("scroll",i),r())},i=()=>{clearTimeout(n),n=setTimeout(s,e)};t.addEventListener("scroll",i),n=setTimeout(s,e)});
2
2
  //# sourceMappingURL=CognitiveComparehelpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CognitiveComparehelpers.js","sources":["../../../../src/features/CognitiveCompare/CognitiveComparehelpers.ts"],"sourcesContent":["import React from \"react\";\nimport {\n ComparisonConfig,\n SectionBlock,\n StyleVariant,\n} from \"./CognitiveCompareTypes\";\nimport { DEFAULT_DEVIAION_COLOR } from \"./CognitiveCompareConstants\";\nimport { normalizeRedlineMarkdown } from \"./utils/normalizeRedlineMarkdown\";\n\nexport const safeStringify = (val: unknown): string => {\n if (val === null || val === undefined) return \"\";\n if (typeof val === \"string\") return val;\n if (Array.isArray(val)) return val.map(safeStringify).join(\"\\n\\n\");\n if (typeof val === \"object\") return JSON.stringify(val);\n return String(val);\n};\n\n// Generic \"is non-empty\" guard used to hide empty fields/sections from rendering.\nexport const hasValue = (val: unknown): boolean => {\n if (val === null || val === undefined) return false;\n if (typeof val === \"string\") return val.trim().length > 0;\n if (Array.isArray(val)) return val.length > 0 && val.some((v) => hasValue(v));\n return true;\n};\n\nexport const getAlphabeticSuffix = (index: number) => {\n let value = index + 1;\n let suffix = \"\";\n\n while (value > 0) {\n value -= 1;\n const ASCII_LOWER_A = 97;\n suffix = String.fromCharCode(ASCII_LOWER_A + (value % 26)) + suffix;\n value = Math.floor(value / 26);\n }\n\n return suffix;\n};\n\nexport const getRhsMappedSectionNumber = ({\n section,\n proposedSections,\n leftNums,\n fallbackNumber,\n firstOnly = false,\n}: {\n section: SectionBlock;\n proposedSections: SectionBlock[];\n leftNums: Map<string, number>;\n fallbackNumber?: string;\n firstOnly?: boolean;\n}) => {\n if (!section?.id) return fallbackNumber;\n\n const mappedLabels = (proposedSections || [])\n .map((lhs) => {\n const refIndexes = Array.isArray(lhs?.refIndexes) ? lhs.refIndexes : [];\n const rhsPosition = refIndexes.findIndex(\n (refIndex: number) => refIndex === section.selfIndex,\n );\n if (rhsPosition === -1) return null;\n\n const baseNumber = lhs?.id ? leftNums.get(lhs.id) : undefined;\n if (baseNumber == null) return null;\n\n return refIndexes.length > 1\n ? `${baseNumber}${getAlphabeticSuffix(rhsPosition)}`\n : String(baseNumber);\n })\n .filter(Boolean);\n\n if (mappedLabels.length === 0) return fallbackNumber;\n\n return firstOnly ? mappedLabels[0] : mappedLabels.join(\", \");\n};\n\nexport const hasSingleMappedLhsSection = (\n section: SectionBlock,\n proposedSections: SectionBlock[],\n) => {\n if (section?.selfIndex == null) return false;\n\n const mappedLhsSections = (proposedSections || []).filter((lhs) =>\n Array.isArray(lhs?.refIndexes) && lhs.refIndexes.includes(section.selfIndex as number),\n );\n\n return mappedLhsSections.length === 1;\n};\n\n// Reads one side (left/right) of a node from comparison_inputs using input_index_map indirection.\nexport type ResolvedContentItem = {\n contentId: string;\n data: Record<string, unknown>;\n attributes: Record<string, unknown>;\n};\n\nexport const resolveComparisonInputItems = (\n node: any,\n sideIndex: \"0\" | \"1\",\n indexMap: Record<string, string>,\n contentMapping: Record<string, any> = {},\n): ResolvedContentItem[] => {\n const sideUuid = indexMap[sideIndex];\n const rawInput = node?.comparison_inputs?.[sideUuid];\n\n if (!rawInput) return [];\n\n const normalize = Array.isArray(rawInput) ? rawInput : [rawInput];\n\n return normalize\n .map((item: any, idx: number): ResolvedContentItem | null => {\n // New JSON: comparison_inputs contains content_mapping id\n if (item && typeof item === \"string\" && item.trim()) {\n const mapped = contentMapping[item];\n if (!mapped || typeof mapped !== \"object\") return null;\n if (!mapped) return null;\n\n return {\n contentId: item,\n data: mapped,\n attributes: mapped.additional_attributes || {},\n };\n }\n\n // Old/root-compatible JSON: comparison_inputs contains direct object\n if (item && typeof item === \"object\") {\n const fallbackId =\n item.content_id ||\n item.id ||\n `${sideUuid}-direct-${idx}`;\n\n return {\n contentId: fallbackId,\n data: item,\n attributes: item.additional_attributes || {},\n };\n }\n\n return null;\n })\n .filter(Boolean) as ResolvedContentItem[];\n};\n\nexport const getSideData = (\n node: any,\n sideIndex: \"0\" | \"1\",\n indexMap: Record<string, string>,\n contentMapping: Record<string, any> = {},\n) => {\n const items = resolveComparisonInputItems(\n node,\n sideIndex,\n indexMap,\n contentMapping,\n );\n\n const first = items[0]?.data || {};\n const attributes = items[0]?.attributes || null;\n\n return {\n title: safeStringify(first?.title || \"\"),\n content: safeStringify(first?.content || \"\"),\n change_history: safeStringify(first?.change_history || \"\"),\n attributes,\n subsections: first?.subsections || [],\n contentId: items[0]?.contentId,\n allItems: items,\n };\n};\n\n// Extracts mapping_rationale into UI-friendly score, relation label, and cognitive details.\nexport const getRationale = (node: any) => {\nif (!node.mapping_rationale) {\n return { \n cognitiveData: {\n decisioning: [],\n gap: [],\n relevance_score: 0,\n isMissingRationale: true, \n citations: [],\n },\n score: 0, \n relation: \"N/A\" \n };\n }\n const rat = node.mapping_rationale;\n const strength = parseInt(rat.decision_strength || \"0\");\n \n return {\n cognitiveData: {\n decisioning: rat.decisioning_factors || [],\n gap: rat.gaps_in_decision || [],\n relevance_score: strength,\n citations: rat.citations\n },\n score: 0,\n relation: \"N/A\",\n };\n};\n\n// Converts machine relation keys (e.g. \"no_deviation\") into readable badge labels.\nexport const formatRelationToLabel = (relation: string): string => {\n if (!relation || typeof relation !== \"string\") return \"Unknown\";\n if (relation.toUpperCase() === \"N/A\") return \"N/A\";\n return relation\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n};\n// Resolves relation + score into the visual style token used by cards, fields, and badges.\n// export const getStyleForRelation = (\n// score: number,\n// relation: string,\n// hasContent: boolean,\n// config: ComparisonConfig,\n// ): StyleVariant | null => {\n// const percentage = (score || 0) * 100;\n// const { thresholds, relationStyles } = config;\n\n// if (!hasContent) return null;\n\n// // const displayLabel = formatRelationToLabel(relation);\n// // const normalizedRelation = (relation || \"\").toLowerCase();\n// // return { ...relationStyles.low, label: 'Found 321' };\n\n// // if (normalizedRelation === \"n/a\" || normalizedRelation.includes(\"no_deviation\")) {\n// // return { ...relationStyles.low, label: displayLabel };\n// // }\n// // if (normalizedRelation.includes(\"no_deviation\")) {\n// // return { ...relationStyles.low, label: displayLabel };\n// // }\n// // if (\n// // normalizedRelation.includes(\"deviation\") ||\n// // normalizedRelation.includes(\"high_risk\") ||\n// // normalizedRelation.includes(\"critical\")\n// // ) {\n// // return { ...relationStyles.high, label: displayLabel };\n// // }\n// // if (percentage >= thresholds.exact) {\n// // return { ...relationStyles.exact, label: displayLabel };\n// // }\n// // if (percentage >= thresholds.high) {\n// // return { ...relationStyles.high, label: displayLabel };\n// // }\n// // if (percentage >= thresholds.medium) {\n// // return { ...relationStyles.medium, label: displayLabel };\n// // }\n// // return { ...relationStyles.low, label: displayLabel };\n// };\n\n// Maps cognitive relevance score (0-100) into synthetic relation buckets used for section badges.\n// export const cognitiveScoreToRelation = (\n// relevanceScore: number,\n// ): { score: number; relation: string } => {\n// // if (relevanceScore >= 90) return { score: 1.0, relation: \"exact_match\" };\n// // if (relevanceScore >= 70) return { score: 0.8, relation: \"high_match\" };\n// // if (relevanceScore >= 40) return { score: 0.5, relation: \"partial_match\" };\n// // return { score: 0.0, relation: \"no_deviation\" };\n// return { score: 0.0, relation: \"found the B\" };\n// };\n\ntype ColorPalette = {\n bg: string;\n border: string;\n badgeBg: string;\n badgeBorder: string;\n badgeText: string;\n highlightBg: string;\n};\n\nexport function generateColorPalette(hex: string): ColorPalette {\n const normalizeHex = (hex: string) => {\n if (hex.length === 4) {\n return (\n \"#\" +\n hex[1] +\n hex[1] +\n hex[2] +\n hex[2] +\n hex[3] +\n hex[3]\n );\n }\n return hex;\n };\n\n const hexToRgb = (hex: string) => {\n const normalized = normalizeHex(hex).replace(\"#\", \"\");\n const bigint = parseInt(normalized, 16);\n return {\n r: (bigint >> 16) & 255,\n g: (bigint >> 8) & 255,\n b: bigint & 255,\n };\n };\n\n const rgbToHex = (r: number, g: number, b: number) => {\n return (\n \"#\" +\n [r, g, b]\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase()\n );\n };\n\n // Mix with white based on opacity\n const mixWithWhite = (hex: string, opacity: number) => {\n const { r, g, b } = hexToRgb(hex);\n\n const newR = Math.round(r + (255 - r) * opacity);\n const newG = Math.round(g + (255 - g) * opacity);\n const newB = Math.round(b + (255 - b) * opacity);\n\n return rgbToHex(newR, newG, newB);\n };\n\n return {\n bg: mixWithWhite(hex, 0.8),\n border: mixWithWhite(hex, 0.5),\n badgeBg: mixWithWhite(hex, 0.8),\n badgeBorder: mixWithWhite(hex, 0.5),\n badgeText: hex.toUpperCase(),\n highlightBg: mixWithWhite(hex, 0.8),\n };\n}\n\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n return function(this: ThisParameterType<T>, ...args: Parameters<T>) {\n const context = this;\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func.apply(context, args), delay);\n };\n}\n\nexport const checkPathMatchesIdx = (pathStr: string, idx: number)=>{\n if(!pathStr) return false;\n return pathStr === String(idx) || pathStr.startsWith(`${idx}-`);\n}\nexport const areMarkdownPropsEqual = (prevProps: any, nextProps: any) => {\n if (prevProps.content !== nextProps.content) return false;\n if (prevProps.overlayContent !== nextProps.overlayContent) return false;\n if (prevProps.fallbackContent !== nextProps.fallbackContent) return false;\n if (prevProps.sxStyles !== nextProps.sxStyles) return false;\n if (prevProps.maintainRelativeOrder !== nextProps.maintainRelativeOrder) return false;\n if (prevProps.highlightBg !== nextProps.highlightBg) return false;\n if (prevProps.suppressHighlightBg !== nextProps.suppressHighlightBg) return false;\n if (prevProps.collisionKey !== nextProps.collisionKey) return false;\n\n const prevH = prevProps.highlights || [];\n const nextH = nextProps.highlights || [];\n\n if (prevH.length !== nextH.length) return false;\n \n for (let i = 0; i < prevH.length; i++) {\n if (prevH[i] !== nextH[i]) return false;\n }\n\n const prevB = prevProps.deviationBadges || [];\n const nextB = nextProps.deviationBadges || [];\n\n if (prevB.length !== nextB.length) return false;\n for (let i = 0; i < prevB.length; i++) {\n if (prevB[i].id !== nextB[i].id) return false;\n if (prevB[i].actionId !== nextB[i].actionId) return false;\n if (prevB[i].label !== nextB[i].label) return false;\n if (prevB[i].score !== nextB[i].score) return false;\n if (prevB[i].isOrphan !== nextB[i].isOrphan) return false;\n if (prevB[i].isConnected !== nextB[i].isConnected) return false;\n if (prevB[i].showScrollLockToggle !== nextB[i].showScrollLockToggle) return false;\n if (prevB[i].scrollSyncLocked !== nextB[i].scrollSyncLocked) return false;\n if (prevB[i].style?.badgeBg !== nextB[i].style?.badgeBg) return false;\n if (prevB[i].style?.badgeBorder !== nextB[i].style?.badgeBorder) return false;\n if (prevB[i].style?.badgeText !== nextB[i].style?.badgeText) return false;\n }\n\n return true;\n};\n\nexport const DEVIATION_BADGE_SEPARATOR = \"::\";\n\nexport const isMissingStr = (str: string | undefined | null) => {\n if (!str) return true;\n const s = str.trim().toLowerCase();\n return (\n s.includes(\"no equivalent\") || \n s === \"n/a\" || \n s === \"na\" || \n s === \"none\"\n );\n};\n\nexport const hasMeaningfulRedlineTags = (content: unknown): boolean => {\n if (typeof content !== \"string\" || !content) return false;\n const tagPattern = /<(updated|deleted|changed|change)\\b[^>]*>([\\s\\S]*?)<\\/\\1>/gi;\n let match: RegExpExecArray | null = null;\n while ((match = tagPattern.exec(content)) !== null) {\n const inner = match[2] ?? \"\";\n const innerText = inner.replace(/<[^>]*>/g, \"\").trim();\n if (innerText.length > 0) return true;\n }\n return false;\n};\n\nexport const stripRedlineTags = (content: unknown): string => {\n if (typeof content !== \"string\" || !content) return \"\";\n return content.replace(/<\\/?(updated|deleted|changed|change)\\b[^>]*>/gi, \"\");\n};\n\nexport type TextMatchRange = {\n start: number;\n end: number;\n};\n\nconst canonicalizeTextForMatch = (\n source: string,\n ignorePunctuation: boolean,\n) => {\n let text = \"\";\n const starts: number[] = [];\n const ends: number[] = [];\n\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n const isIgnoredPunctuation =\n ignorePunctuation && /[\\.,;:]/.test(character);\n const isWhitespace = /\\s/.test(character) || isIgnoredPunctuation;\n const canonicalCharacter = isWhitespace\n ? \" \"\n : /[’‘`]/.test(character)\n ? \"'\"\n : /[”“]/.test(character)\n ? '\"'\n : /[—–]/.test(character)\n ? \"-\"\n : character;\n\n if (canonicalCharacter === \" \" && text.endsWith(\" \")) {\n ends[ends.length - 1] = index + 1;\n continue;\n }\n\n text += canonicalCharacter;\n starts.push(index);\n ends.push(index + 1);\n }\n\n return { text, starts, ends };\n};\n\nexport const findTextMatchRange = (\n content: string,\n highlight: string,\n ignorePunctuation = false,\n): TextMatchRange | null => {\n if (!content || !highlight) return null;\n\n const directStart = content.toLowerCase().indexOf(highlight.toLowerCase());\n if (directStart !== -1) {\n return { start: directStart, end: directStart + highlight.length };\n }\n\n const canonicalContent = canonicalizeTextForMatch(\n content,\n ignorePunctuation,\n );\n const canonicalHighlight = canonicalizeTextForMatch(\n highlight,\n ignorePunctuation,\n ).text.trim().toLowerCase();\n if (!canonicalHighlight) return null;\n\n const canonicalStart = canonicalContent.text\n .toLowerCase()\n .indexOf(canonicalHighlight);\n if (canonicalStart === -1) return null;\n\n const canonicalEnd = canonicalStart + canonicalHighlight.length - 1;\n const start = canonicalContent.starts[canonicalStart];\n const end = canonicalContent.ends[canonicalEnd];\n\n return start === undefined || end === undefined ? null : { start, end };\n};\n\n/**\n * Redline highlights can span prose plus one or more Markdown tables. A small\n * structural difference in any later row should not prevent the deviation\n * badge from receiving an inline anchor. Prefer the complete range, then fall\n * back to the first meaningful line that is actually present in the content.\n */\nexport const findRedlineTextAnchorRange = (\n content: string,\n highlight: string,\n): TextMatchRange | null => {\n const completeRange = findTextMatchRange(content, highlight, true);\n if (completeRange) return completeRange;\n\n const candidates = highlight\n .split(/\\n+/)\n .map((line) => line.trim())\n .filter((line) => {\n if (line.length < 12) return false;\n // A GFM delimiter or an empty table row is not a useful visual anchor.\n const structuralOnly = line.replace(/[|:\\-\\s]/g, \"\") === \"\";\n return !structuralOnly;\n });\n\n for (const candidate of candidates) {\n const range = findTextMatchRange(content, candidate, true);\n if (range) return range;\n }\n\n return null;\n};\n\nexport const getLhsDeviationDisplayIndexes = (\n sections: SectionBlock[],\n leftDocId: string | undefined,\n deviationNumberRegistry: Record<string, number>,\n) => {\n const displayIndexes = new Map<string, number>();\n if (!leftDocId) return displayIndexes;\n\n const normalize = (value: unknown) => {\n const raw = safeStringify(value || \"\").replace(/\\\\n/g, \"\\n\");\n return hasMeaningfulRedlineTags(raw)\n ? stripRedlineTags(normalizeRedlineMarkdown(raw))\n : raw;\n };\n\n (sections || []).forEach((root) => {\n const registeredEntries = new Map<string, number>();\n\n const visit = (node: SectionBlock) => {\n if (!node) return;\n const content = normalize(node.content);\n const evaluationResults = node.evaluationResults?.length\n ? node.evaluationResults\n : node.evaluationResult\n ? [node.evaluationResult]\n : [];\n\n evaluationResults.forEach((evaluationResult: any) => {\n const registryNodeId =\n evaluationResult?.nodeId || node.nodeId || node.id;\n Object.entries(evaluationResult?.deviations || {}).forEach(\n ([deviationKey, deviationMap]: [string, any]) => {\n const highlight = deviationMap[leftDocId];\n const normalizedHighlight = normalize(highlight);\n if (\n !normalizedHighlight ||\n isMissingStr(highlight) ||\n !findTextMatchRange(content, normalizedHighlight)\n ) return;\n\n const refId = `${registryNodeId}${DEVIATION_BADGE_SEPARATOR}${deviationKey}`;\n const registryIndex = deviationNumberRegistry[refId];\n if (registryIndex !== undefined && registryIndex !== null) {\n registeredEntries.set(refId, registryIndex);\n }\n },\n );\n });\n\n (node.subsections || []).forEach(visit);\n };\n\n visit(root);\n if (registeredEntries.size === 0) return;\n\n const firstIndex = Math.min(...Array.from(registeredEntries.values()));\n registeredEntries.forEach((registryIndex, refId) => {\n displayIndexes.set(refId, registryIndex - firstIndex + 1);\n });\n });\n\n return displayIndexes;\n};\n\nexport const extractDeviationScore = (evaluationResult: any, fallbackLabel?: any) => {\n if (!evaluationResult) return fallbackLabel;\n const score = evaluationResult.evaluation_output?.output_score \n ?? evaluationResult.evaluation_outputs?.output_score \n ?? evaluationResult.evaluation_outputs?.output_value \n ?? evaluationResult.output_score;\n return score ?? fallbackLabel ?? '';\n};\n\nexport const getBentArrowPath = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n radius: number = 14,\n): string => {\n const midX = x1 + (x2 - x1) * 0.5;\n const dy = y2 - y1;\n\n if (Math.abs(dy) < 3) {\n return `M ${x1} ${y1} H ${x2}`;\n }\n\n const dir = dy > 0 ? 1 : -1;\n\n const r = Math.min(\n radius,\n Math.abs(dy) / 2,\n Math.abs(midX - x1) / 2,\n Math.abs(x2 - midX) / 2,\n );\n\n return [\n `M ${x1} ${y1}`,\n `H ${midX - r}`,\n `Q ${midX} ${y1} ${midX} ${y1 + dir * r}`,\n `V ${y2 - dir * r}`,\n `Q ${midX} ${y2} ${midX + r} ${y2}`,\n `H ${x2}`,\n ].join(\" \");\n};\n\nexport const smoothScrollTo = (\n element: HTMLElement,\n targetPosition: number,\n duration: number = 300,\n onComplete?: () => void,\n onProgress?: () => void,\n) => {\n const originalScrollBehavior = element.style.scrollBehavior;\n element.style.scrollBehavior = \"auto\";\n\n const startPosition = element.scrollTop;\n const distance = targetPosition - startPosition;\n let startTime: number | null = null;\n\n const easeOutCubic = (time: number, start: number, change: number, dur: number) => {\n time /= dur;\n time--;\n return change * (time * time * time + 1) + start;\n };\n\n const animation = (currentTime: number) => {\n if (startTime === null) startTime = currentTime;\n const timeElapsed = currentTime - startTime;\n \n if (timeElapsed < duration) {\n element.scrollTop = easeOutCubic(timeElapsed, startPosition, distance, duration);\n if (onProgress) onProgress();\n requestAnimationFrame(animation);\n } else {\n element.scrollTop = targetPosition;\n element.style.scrollBehavior = originalScrollBehavior;\n if (onProgress) onProgress();\n if (onComplete) onComplete();\n }\n };\n\n requestAnimationFrame(animation);\n};\n\nexport const escapeRegExp = (string: string) => {\n let escaped = string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n escaped = escaped.replace(/['’‘`]/g, \"['’‘`]\");\n escaped = escaped.replace(/[\"”“]/g, '[\"”“]');\n escaped = escaped.replace(/[-—–]/g, '[-—–]');\n escaped = escaped.replace(/\\s+/g, '\\\\s+');\n\n return escaped;\n};\n\nconst SEVERITY_ORDER = [\"#B91C1C\", \"#A16207\", \"#1D4ED8\", \"#000000\"];\n\nconst getColorSeverityRank = (color: string): number => {\n const idx = SEVERITY_ORDER.findIndex(\n c => c.toLowerCase() === color.toLowerCase()\n );\n return idx === -1 ? SEVERITY_ORDER.length : idx;\n};\n\nexport const getFirstDeviationColor = (evaluationResult: any): string => {\n const allColors: string[] = [];\n\n const deviationKeys = Object.keys(evaluationResult?.deviations || {})\n .sort((a, b) => Number(a) - Number(b));\n for (const key of deviationKeys) {\n const color = evaluationResult?.deviations?.[key]?.evaluation_outputs?.metadata?.label_color;\n if (color) allColors.push(color);\n }\n\n const entryKeys = Object.keys(evaluationResult?.deviation_entries || {})\n .sort((a, b) => Number(a) - Number(b));\n for (const key of entryKeys) {\n const color = evaluationResult?.deviation_entries?.[key]?.evaluation_outputs?.metadata?.label_color;\n if (color) allColors.push(color);\n }\n\n const numericKeys = Object.keys(evaluationResult || {})\n .filter(k => /^\\d+$/.test(k))\n .sort((a, b) => Number(a) - Number(b));\n for (const key of numericKeys) {\n const color = evaluationResult?.[key]?.evaluation_outputs?.metadata?.label_color;\n if (color) allColors.push(color);\n }\n\n if (allColors.length === 0) {\n if (evaluationResult?.evaluation_outputs?.metadata?.label_color) {\n return evaluationResult.evaluation_outputs.metadata.label_color;\n }\n return DEFAULT_DEVIAION_COLOR;\n }\n\n return allColors.sort(\n (a, b) => getColorSeverityRank(a) - getColorSeverityRank(b)\n )[0];\n};\n\nexport const getFirstDeviationOutputValue = (evaluationResult: any): string | null => {\n const deviationKeys = Object.keys(evaluationResult?.deviations || {})\n .sort((a, b) => Number(a) - Number(b));\n for (const key of deviationKeys) {\n const value = evaluationResult?.deviations?.[key]?.evaluation_outputs?.output_value;\n if (value) return value;\n }\n\n const entryKeys = Object.keys(evaluationResult?.deviation_entries || {})\n .sort((a, b) => Number(a) - Number(b));\n for (const key of entryKeys) {\n const value = evaluationResult?.deviation_entries?.[key]?.evaluation_outputs?.output_value;\n if (value) return value;\n }\n\n const numericKeys = Object.keys(evaluationResult || {})\n .filter(k => /^\\d+$/.test(k))\n .sort((a, b) => Number(a) - Number(b));\n for (const key of numericKeys) {\n const value = evaluationResult?.[key]?.evaluation_outputs?.output_value;\n if (value) return value;\n }\n\n if (evaluationResult?.evaluation_outputs?.output_value) {\n return evaluationResult.evaluation_outputs.output_value;\n }\n\n return null;\n};\n\nexport const mixHexColors = (hex1: string, hex2: string): string => {\n // Helper to convert hex to RGB array\n const hexToRgb = (hex: string) => {\n const cleanHex = hex.replace(\"#\", \"\");\n const r = parseInt(cleanHex.substring(0, 2), 16);\n const g = parseInt(cleanHex.substring(2, 4), 16);\n const b = parseInt(cleanHex.substring(4, 6), 16);\n return [r, g, b];\n };\n\n // Helper to convert RGB value back to 2-digit hex\n const toHex = (c: number) => {\n const hex = Math.round(c).toString(16);\n return hex.length === 1 ? \"0\" + hex : hex;\n };\n\n try {\n const rgb1 = hexToRgb(hex1);\n const rgb2 = hexToRgb(hex2);\n\n // Average the RGB values (Multiply by 0.95 to slightly darken the overlap for better visibility)\n const r = ((rgb1[0] + rgb2[0]) / 2) * 0.95;\n const g = ((rgb1[1] + rgb2[1]) / 2) * 0.95;\n const b = ((rgb1[2] + rgb2[2]) / 2) * 0.95;\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n } catch (e) {\n // Fallback to a default overlap color if invalid hex is passed\n return \"#FDE68A\"; \n }\n};\n\n// Recursively find the keyPath (e.g. \"2-1-0\") of a node by its id\n// path here is the running position string built up as we recurse deeper\nexport const recursivelyFindSubSectionIdxById = (\n node: any,\n path: string,\n targetId: string,\n): string | null => {\n if (!node) return null;\n if (node.id === targetId || node.nodeId === targetId || node.contentId === targetId) return path;\n if (!Array.isArray(node.subsections)) return null;\n\n for (let i = 0; i < node.subsections.length; i++) {\n const next = recursivelyFindSubSectionIdxById(\n node.subsections[i],\n `${path}-${i}`,\n targetId,\n );\n if (next) return next;\n }\n return null;\n};\n\nexport const findKeyPathByNodeId = (\n sections: SectionBlock[],\n nodeId: string,\n): string | null => {\n for (let i = 0; i < sections.length; i++) {\n const found = recursivelyFindSubSectionIdxById(\n sections[i],\n String(i),\n nodeId,\n );\n if (found) return found;\n }\n return null;\n};\n\nconst highlightTimeouts = new WeakMap<HTMLElement, number>();\n\nexport const resetClauseHighlight = (element: HTMLElement) => {\n if (!element) return;\n\n const timeoutId = highlightTimeouts.get(element);\n if (timeoutId != null) {\n clearTimeout(timeoutId);\n highlightTimeouts.delete(element);\n }\n\n element.style.transition = \"box-shadow 300ms ease-out, outline 300ms ease-out\";\n requestAnimationFrame(() => {\n element.style.outline = \"\";\n element.style.boxShadow = \"\";\n });\n window.setTimeout(() => {\n element.style.transition = \"\";\n element.style.borderRadius = \"\";\n }, 300);\n};\n\nexport const highlightClause = (element: HTMLElement) => {\n if (!element) return;\n\n const existingTimeout = highlightTimeouts.get(element);\n if (existingTimeout != null) {\n clearTimeout(existingTimeout);\n }\n\n element.style.transition = \"box-shadow 300ms ease-in-out, outline 300ms ease-in-out\";\n element.style.outline = \"2px solid #ff9494\";\n element.style.borderRadius = \"6px\";\n element.style.boxShadow = \"0 0 12px 2px rgba(244, 113, 113, 0.33)\";\n\n const timeoutId = window.setTimeout(() => {\n resetClauseHighlight(element);\n }, 3000);\n highlightTimeouts.set(element, timeoutId);\n};\n\nexport const scrollAndHighlightClause = (\n element: HTMLElement,\n scrollContainer: HTMLElement,\n) => {\n const containerRect = scrollContainer.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n\n const targetScrollTop =\n scrollContainer.scrollTop +\n elementRect.top -\n containerRect.top -\n containerRect.height / 2 +\n elementRect.height / 2;\n\n scrollContainer.scrollTo({ top: targetScrollTop, behavior: \"smooth\" });\n\n const doHighlight = () => highlightClause(element);\n\n const supportsScrollEnd =\n \"onscrollend\" in (scrollContainer as HTMLElement & { onscrollend?: unknown });\n\n if (supportsScrollEnd) {\n scrollContainer.addEventListener(\"scrollend\", doHighlight, { once: true });\n } else {\n let lastScrollTop = scrollContainer.scrollTop;\n const pollScroll = () => {\n if (scrollContainer.scrollTop === lastScrollTop) {\n doHighlight();\n } else {\n lastScrollTop = scrollContainer.scrollTop;\n requestAnimationFrame(pollScroll);\n }\n };\n requestAnimationFrame(pollScroll);\n }\n};\n\n\nexport const waitForElementVisible = (\n element: HTMLElement,\n onVisible: () => void,\n) => {\n if (element.getBoundingClientRect().height > 0) {\n requestAnimationFrame(onVisible);\n return;\n }\n\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.height > 0) {\n ro.disconnect();\n requestAnimationFrame(onVisible);\n return;\n }\n }\n });\n\n ro.observe(element);\n};\n\n\nexport const scrollAndWait = (\n container: HTMLElement,\n top: number,\n callback: () => void\n) => {\n if (Math.abs(container.scrollTop - top) <= 2) {\n callback();\n return;\n }\n\n let called = false;\n let fallbackTimer: number | null = null;\n\n const fire = () => {\n if (called) return;\n called = true;\n if(!fallbackTimer) return;\n clearTimeout(fallbackTimer);\n container.removeEventListener(\"scrollend\", handleScrollEnd);\n callback();\n };\n\n const handleScrollEnd = () => fire();\n\n container.addEventListener(\"scrollend\", handleScrollEnd);\n container.scrollTo({ top, behavior: \"smooth\" });\n fallbackTimer = setTimeout(fire, 800);\n};\n\nexport const waitForScrollIdle = (\n container: HTMLElement,\n idleMs = 100\n ): Promise<void> =>\n new Promise((resolve) => {\n let called = false;\n let timer: number | null = null;\n\n const fire = () => {\n if (called) return;\n called = true;\n container.removeEventListener(\"scroll\", onScroll);\n resolve();\n };\n\n const onScroll = () => {\n if(!timer) return;\n clearTimeout(timer);\n timer = setTimeout(fire, idleMs);\n };\n\n container.addEventListener(\"scroll\", onScroll);\n timer = setTimeout(fire, idleMs);\n });\n"],"names":["safeStringify","val","Array","isArray","map","join","JSON","stringify","String","hasValue","trim","length","some","v","getAlphabeticSuffix","index","value","suffix","ASCII_LOWER_A","fromCharCode","Math","floor","resolveComparisonInputItems","node","sideIndex","indexMap","contentMapping","sideUuid","rawInput","comparison_inputs","item","idx","mapped","contentId","data","attributes","additional_attributes","content_id","id","filter","Boolean","isMissingStr","str","s","toLowerCase","includes","hasMeaningfulRedlineTags","content","tagPattern","match","exec","replace","stripRedlineTags","canonicalizeTextForMatch","source","ignorePunctuation","text","starts","ends","character","isIgnoredPunctuation","test","canonicalCharacter","endsWith","push","findTextMatchRange","highlight","directStart","indexOf","start","end","canonicalContent","canonicalHighlight","canonicalStart","canonicalEnd","SEVERITY_ORDER","getColorSeverityRank","color","findIndex","c","recursivelyFindSubSectionIdxById","path","targetId","nodeId","subsections","i","next","highlightTimeouts","WeakMap","resetClauseHighlight","element","timeoutId","get","clearTimeout","delete","style","transition","requestAnimationFrame","outline","boxShadow","window","setTimeout","borderRadius","highlightClause","existingTimeout","set","prevProps","nextProps","overlayContent","fallbackContent","sxStyles","maintainRelativeOrder","highlightBg","suppressHighlightBg","collisionKey","prevH","highlights","nextH","prevB","deviationBadges","nextB","actionId","label","score","isOrphan","isConnected","showScrollLockToggle","scrollSyncLocked","badgeBg","badgeBorder","badgeText","func","delay","args","context","this","apply","evaluationResult","fallbackLabel","evaluation_output","output_score","evaluation_outputs","output_value","sections","found","completeRange","candidates","split","line","candidate","range","hex","mixWithWhite","opacity","r","g","b","normalized","normalizeHex","bigint","parseInt","hexToRgb","x","toString","padStart","toUpperCase","rgbToHex","round","bg","border","x1","y1","x2","y2","radius","midX","dy","abs","dir","min","allColors","deviationKeys","Object","keys","deviations","sort","a","Number","key","metadata","label_color","entryKeys","deviation_entries","numericKeys","k","DEFAULT_DEVIAION_COLOR","leftDocId","deviationNumberRegistry","displayIndexes","Map","normalize","raw","normalizeRedlineMarkdown","forEach","root","registeredEntries","visit","evaluationResults","registryNodeId","entries","deviationKey","deviationMap","normalizedHighlight","refId","registryIndex","size","firstIndex","from","values","mapping_rationale","cognitiveData","decisioning","gap","relevance_score","isMissingRationale","citations","relation","rat","strength","decision_strength","decisioning_factors","gaps_in_decision","section","proposedSections","leftNums","fallbackNumber","firstOnly","mappedLabels","lhs","refIndexes","rhsPosition","refIndex","selfIndex","baseNumber","items","first","title","change_history","allItems","hex1","hex2","cleanHex","substring","toHex","rgb1","rgb2","e","scrollContainer","containerRect","getBoundingClientRect","elementRect","targetScrollTop","scrollTop","top","height","scrollTo","behavior","doHighlight","addEventListener","once","lastScrollTop","pollScroll","container","callback","called","fallbackTimer","fire","removeEventListener","handleScrollEnd","targetPosition","duration","onComplete","onProgress","originalScrollBehavior","scrollBehavior","startPosition","distance","startTime","animation","currentTime","timeElapsed","time","idleMs","Promise","resolve","timer","onScroll"],"mappings":"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"}
1
+ {"version":3,"file":"CognitiveComparehelpers.js","sources":["../../../../src/features/CognitiveCompare/CognitiveComparehelpers.ts"],"sourcesContent":["import React from \"react\";\nimport {\n ComparisonConfig,\n SectionBlock,\n StyleVariant,\n} from \"./CognitiveCompareTypes\";\nimport { DEFAULT_DEVIAION_COLOR } from \"./CognitiveCompareConstants\";\n\nexport const safeStringify = (val: unknown): string => {\n if (val === null || val === undefined) return \"\";\n if (typeof val === \"string\") return val;\n if (Array.isArray(val)) return val.map(safeStringify).join(\"\\n\\n\");\n if (typeof val === \"object\") return JSON.stringify(val);\n return String(val);\n};\n\n// Generic \"is non-empty\" guard used to hide empty fields/sections from rendering.\nexport const hasValue = (val: unknown): boolean => {\n if (val === null || val === undefined) return false;\n if (typeof val === \"string\") return val.trim().length > 0;\n if (Array.isArray(val)) return val.length > 0 && val.some((v) => hasValue(v));\n return true;\n};\n\nexport const getAlphabeticSuffix = (index: number) => {\n let value = index + 1;\n let suffix = \"\";\n\n while (value > 0) {\n value -= 1;\n const ASCII_LOWER_A = 97;\n suffix = String.fromCharCode(ASCII_LOWER_A + (value % 26)) + suffix;\n value = Math.floor(value / 26);\n }\n\n return suffix;\n};\n\nexport const getRhsMappedSectionNumber = ({\n section,\n proposedSections,\n leftNums,\n fallbackNumber,\n firstOnly = false,\n}: {\n section: SectionBlock;\n proposedSections: SectionBlock[];\n leftNums: Map<string, number>;\n fallbackNumber?: string;\n firstOnly?: boolean;\n}) => {\n if (!section?.id) return fallbackNumber;\n\n const mappedLabels = (proposedSections || [])\n .map((lhs) => {\n const refIndexes = Array.isArray(lhs?.refIndexes) ? lhs.refIndexes : [];\n const rhsPosition = refIndexes.findIndex(\n (refIndex: number) => refIndex === section.selfIndex,\n );\n if (rhsPosition === -1) return null;\n\n const baseNumber = lhs?.id ? leftNums.get(lhs.id) : undefined;\n if (baseNumber == null) return null;\n\n return refIndexes.length > 1\n ? `${baseNumber}${getAlphabeticSuffix(rhsPosition)}`\n : String(baseNumber);\n })\n .filter(Boolean);\n\n if (mappedLabels.length === 0) return fallbackNumber;\n\n return firstOnly ? mappedLabels[0] : mappedLabels.join(\", \");\n};\n\nexport const hasSingleMappedLhsSection = (\n section: SectionBlock,\n proposedSections: SectionBlock[],\n) => {\n if (section?.selfIndex == null) return false;\n\n const mappedLhsSections = (proposedSections || []).filter((lhs) =>\n Array.isArray(lhs?.refIndexes) && lhs.refIndexes.includes(section.selfIndex as number),\n );\n\n return mappedLhsSections.length === 1;\n};\n\n// Reads one side (left/right) of a node from comparison_inputs using input_index_map indirection.\nexport type ResolvedContentItem = {\n contentId: string;\n data: Record<string, unknown>;\n attributes: Record<string, unknown>;\n};\n\nexport const resolveComparisonInputItems = (\n node: any,\n sideIndex: \"0\" | \"1\",\n indexMap: Record<string, string>,\n contentMapping: Record<string, any> = {},\n): ResolvedContentItem[] => {\n const sideUuid = indexMap[sideIndex];\n const rawInput = node?.comparison_inputs?.[sideUuid];\n\n if (!rawInput) return [];\n\n const normalize = Array.isArray(rawInput) ? rawInput : [rawInput];\n\n return normalize\n .map((item: any, idx: number): ResolvedContentItem | null => {\n // New JSON: comparison_inputs contains content_mapping id\n if (item && typeof item === \"string\" && item.trim()) {\n const mapped = contentMapping[item];\n if (!mapped || typeof mapped !== \"object\") return null;\n if (!mapped) return null;\n\n return {\n contentId: item,\n data: mapped,\n attributes: mapped.additional_attributes || {},\n };\n }\n\n // Old/root-compatible JSON: comparison_inputs contains direct object\n if (item && typeof item === \"object\") {\n const fallbackId =\n item.content_id ||\n item.id ||\n `${sideUuid}-direct-${idx}`;\n\n return {\n contentId: fallbackId,\n data: item,\n attributes: item.additional_attributes || {},\n };\n }\n\n return null;\n })\n .filter(Boolean) as ResolvedContentItem[];\n};\n\nexport const getSideData = (\n node: any,\n sideIndex: \"0\" | \"1\",\n indexMap: Record<string, string>,\n contentMapping: Record<string, any> = {},\n) => {\n const items = resolveComparisonInputItems(\n node,\n sideIndex,\n indexMap,\n contentMapping,\n );\n\n const first = items[0]?.data || {};\n const attributes = items[0]?.attributes || null;\n\n return {\n title: safeStringify(first?.title || \"\"),\n content: safeStringify(first?.content || \"\"),\n change_history: safeStringify(first?.change_history || \"\"),\n attributes,\n subsections: first?.subsections || [],\n contentId: items[0]?.contentId,\n allItems: items,\n };\n};\n\n// Extracts mapping_rationale into UI-friendly score, relation label, and cognitive details.\nexport const getRationale = (node: any) => {\nif (!node.mapping_rationale) {\n return { \n cognitiveData: {\n decisioning: [],\n gap: [],\n relevance_score: 0,\n isMissingRationale: true, \n citations: [],\n },\n score: 0, \n relation: \"N/A\" \n };\n }\n const rat = node.mapping_rationale;\n const strength = parseInt(rat.decision_strength || \"0\");\n \n return {\n cognitiveData: {\n decisioning: rat.decisioning_factors || [],\n gap: rat.gaps_in_decision || [],\n relevance_score: strength,\n citations: rat.citations\n },\n score: 0,\n relation: \"N/A\",\n };\n};\n\n// Converts machine relation keys (e.g. \"no_deviation\") into readable badge labels.\nexport const formatRelationToLabel = (relation: string): string => {\n if (!relation || typeof relation !== \"string\") return \"Unknown\";\n if (relation.toUpperCase() === \"N/A\") return \"N/A\";\n return relation\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n};\n// Resolves relation + score into the visual style token used by cards, fields, and badges.\n// export const getStyleForRelation = (\n// score: number,\n// relation: string,\n// hasContent: boolean,\n// config: ComparisonConfig,\n// ): StyleVariant | null => {\n// const percentage = (score || 0) * 100;\n// const { thresholds, relationStyles } = config;\n\n// if (!hasContent) return null;\n\n// // const displayLabel = formatRelationToLabel(relation);\n// // const normalizedRelation = (relation || \"\").toLowerCase();\n// // return { ...relationStyles.low, label: 'Found 321' };\n\n// // if (normalizedRelation === \"n/a\" || normalizedRelation.includes(\"no_deviation\")) {\n// // return { ...relationStyles.low, label: displayLabel };\n// // }\n// // if (normalizedRelation.includes(\"no_deviation\")) {\n// // return { ...relationStyles.low, label: displayLabel };\n// // }\n// // if (\n// // normalizedRelation.includes(\"deviation\") ||\n// // normalizedRelation.includes(\"high_risk\") ||\n// // normalizedRelation.includes(\"critical\")\n// // ) {\n// // return { ...relationStyles.high, label: displayLabel };\n// // }\n// // if (percentage >= thresholds.exact) {\n// // return { ...relationStyles.exact, label: displayLabel };\n// // }\n// // if (percentage >= thresholds.high) {\n// // return { ...relationStyles.high, label: displayLabel };\n// // }\n// // if (percentage >= thresholds.medium) {\n// // return { ...relationStyles.medium, label: displayLabel };\n// // }\n// // return { ...relationStyles.low, label: displayLabel };\n// };\n\n// Maps cognitive relevance score (0-100) into synthetic relation buckets used for section badges.\n// export const cognitiveScoreToRelation = (\n// relevanceScore: number,\n// ): { score: number; relation: string } => {\n// // if (relevanceScore >= 90) return { score: 1.0, relation: \"exact_match\" };\n// // if (relevanceScore >= 70) return { score: 0.8, relation: \"high_match\" };\n// // if (relevanceScore >= 40) return { score: 0.5, relation: \"partial_match\" };\n// // return { score: 0.0, relation: \"no_deviation\" };\n// return { score: 0.0, relation: \"found the B\" };\n// };\n\ntype ColorPalette = {\n bg: string;\n border: string;\n badgeBg: string;\n badgeBorder: string;\n badgeText: string;\n highlightBg: string;\n};\n\nexport function generateColorPalette(hex: string): ColorPalette {\n const normalizeHex = (hex: string) => {\n if (hex.length === 4) {\n return (\n \"#\" +\n hex[1] +\n hex[1] +\n hex[2] +\n hex[2] +\n hex[3] +\n hex[3]\n );\n }\n return hex;\n };\n\n const hexToRgb = (hex: string) => {\n const normalized = normalizeHex(hex).replace(\"#\", \"\");\n const bigint = parseInt(normalized, 16);\n return {\n r: (bigint >> 16) & 255,\n g: (bigint >> 8) & 255,\n b: bigint & 255,\n };\n };\n\n const rgbToHex = (r: number, g: number, b: number) => {\n return (\n \"#\" +\n [r, g, b]\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase()\n );\n };\n\n // Mix with white based on opacity\n const mixWithWhite = (hex: string, opacity: number) => {\n const { r, g, b } = hexToRgb(hex);\n\n const newR = Math.round(r + (255 - r) * opacity);\n const newG = Math.round(g + (255 - g) * opacity);\n const newB = Math.round(b + (255 - b) * opacity);\n\n return rgbToHex(newR, newG, newB);\n };\n\n return {\n bg: mixWithWhite(hex, 0.8),\n border: mixWithWhite(hex, 0.5),\n badgeBg: mixWithWhite(hex, 0.8),\n badgeBorder: mixWithWhite(hex, 0.5),\n badgeText: hex.toUpperCase(),\n highlightBg: mixWithWhite(hex, 0.8),\n };\n}\n\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n return function(this: ThisParameterType<T>, ...args: Parameters<T>) {\n const context = this;\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func.apply(context, args), delay);\n };\n}\n\nexport const checkPathMatchesIdx = (pathStr: string, idx: number)=>{\n if(!pathStr) return false;\n return pathStr === String(idx) || pathStr.startsWith(`${idx}-`);\n}\nexport const areMarkdownPropsEqual = (prevProps: any, nextProps: any) => {\n if (prevProps.content !== nextProps.content) return false;\n if (prevProps.overlayContent !== nextProps.overlayContent) return false;\n if (prevProps.sxStyles !== nextProps.sxStyles) return false;\n if (prevProps.maintainRelativeOrder !== nextProps.maintainRelativeOrder) return false;\n if (prevProps.highlightBg !== nextProps.highlightBg) return false;\n if (prevProps.suppressHighlightBg !== nextProps.suppressHighlightBg) return false;\n if (prevProps.collisionKey !== nextProps.collisionKey) return false;\n\n const prevH = prevProps.highlights || [];\n const nextH = nextProps.highlights || [];\n\n if (prevH.length !== nextH.length) return false;\n \n for (let i = 0; i < prevH.length; i++) {\n if (prevH[i] !== nextH[i]) return false;\n }\n\n const prevB = prevProps.deviationBadges || [];\n const nextB = nextProps.deviationBadges || [];\n\n if (prevB.length !== nextB.length) return false;\n for (let i = 0; i < prevB.length; i++) {\n if (prevB[i].id !== nextB[i].id) return false;\n if (prevB[i].actionId !== nextB[i].actionId) return false;\n if (prevB[i].label !== nextB[i].label) return false;\n if (prevB[i].score !== nextB[i].score) return false;\n if (prevB[i].isOrphan !== nextB[i].isOrphan) return false;\n if (prevB[i].isConnected !== nextB[i].isConnected) return false;\n if (prevB[i].showScrollLockToggle !== nextB[i].showScrollLockToggle) return false;\n if (prevB[i].scrollSyncLocked !== nextB[i].scrollSyncLocked) return false;\n if (prevB[i].style?.badgeBg !== nextB[i].style?.badgeBg) return false;\n if (prevB[i].style?.badgeBorder !== nextB[i].style?.badgeBorder) return false;\n if (prevB[i].style?.badgeText !== nextB[i].style?.badgeText) return false;\n }\n\n return true;\n};\n\nexport const DEVIATION_BADGE_SEPARATOR = \"::\";\n\nexport const isMissingStr = (str: string | undefined | null) => {\n if (!str) return true;\n const s = str.trim().toLowerCase();\n return (\n s.includes(\"no equivalent\") || \n s === \"n/a\" || \n s === \"na\" || \n s === \"none\"\n );\n};\n\nexport const hasMeaningfulRedlineTags = (content: unknown): boolean => {\n if (typeof content !== \"string\" || !content) return false;\n const tagPattern = /<(updated|deleted|changed|change)\\b[^>]*>([\\s\\S]*?)<\\/\\1>/gi;\n let match: RegExpExecArray | null = null;\n while ((match = tagPattern.exec(content)) !== null) {\n const inner = match[2] ?? \"\";\n const innerText = inner.replace(/<[^>]*>/g, \"\").trim();\n if (innerText.length > 0) return true;\n }\n return false;\n};\n\nexport const stripRedlineTags = (content: unknown): string => {\n if (typeof content !== \"string\" || !content) return \"\";\n return content.replace(/<\\/?(updated|deleted|changed|change)\\b[^>]*>/gi, \"\");\n};\n\nexport const getLhsDeviationDisplayIndexes = (\n sections: SectionBlock[],\n leftDocId: string | undefined,\n deviationNumberRegistry: Record<string, number>,\n) => {\n const displayIndexes = new Map<string, number>();\n if (!leftDocId) return displayIndexes;\n\n const normalize = (value: unknown) => {\n const raw = hasMeaningfulRedlineTags(value)\n ? stripRedlineTags(value)\n : safeStringify(value || \"\");\n return safeStringify(raw).replace(/\\\\n/g, \"\\n\");\n };\n\n (sections || []).forEach((root) => {\n const registeredEntries = new Map<string, number>();\n\n const visit = (node: SectionBlock) => {\n if (!node) return;\n const content = normalize(node.content);\n const evaluationResults = node.evaluationResults?.length\n ? node.evaluationResults\n : node.evaluationResult\n ? [node.evaluationResult]\n : [];\n\n evaluationResults.forEach((evaluationResult: any) => {\n const registryNodeId =\n evaluationResult?.nodeId || node.nodeId || node.id;\n Object.entries(evaluationResult?.deviations || {}).forEach(\n ([deviationKey, deviationMap]: [string, any]) => {\n const highlight = deviationMap[leftDocId];\n const normalizedHighlight = normalize(highlight);\n if (\n !normalizedHighlight ||\n isMissingStr(highlight) ||\n !content.includes(normalizedHighlight)\n ) return;\n\n const refId = `${registryNodeId}${DEVIATION_BADGE_SEPARATOR}${deviationKey}`;\n const registryIndex = deviationNumberRegistry[refId];\n if (registryIndex !== undefined && registryIndex !== null) {\n registeredEntries.set(refId, registryIndex);\n }\n },\n );\n });\n\n (node.subsections || []).forEach(visit);\n };\n\n visit(root);\n if (registeredEntries.size === 0) return;\n\n const firstIndex = Math.min(...Array.from(registeredEntries.values()));\n registeredEntries.forEach((registryIndex, refId) => {\n displayIndexes.set(refId, registryIndex - firstIndex + 1);\n });\n });\n\n return displayIndexes;\n};\n\nexport const extractDeviationScore = (evaluationResult: any, fallbackLabel?: any) => {\n if (!evaluationResult) return fallbackLabel;\n const score = evaluationResult.evaluation_output?.output_score \n ?? evaluationResult.evaluation_outputs?.output_score \n ?? evaluationResult.evaluation_outputs?.output_value \n ?? evaluationResult.output_score;\n return score ?? fallbackLabel ?? '';\n};\n\nexport const getBentArrowPath = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n radius: number = 14,\n): string => {\n const midX = x1 + (x2 - x1) * 0.5;\n const dy = y2 - y1;\n\n if (Math.abs(dy) < 3) {\n return `M ${x1} ${y1} H ${x2}`;\n }\n\n const dir = dy > 0 ? 1 : -1;\n\n const r = Math.min(\n radius,\n Math.abs(dy) / 2,\n Math.abs(midX - x1) / 2,\n Math.abs(x2 - midX) / 2,\n );\n\n return [\n `M ${x1} ${y1}`,\n `H ${midX - r}`,\n `Q ${midX} ${y1} ${midX} ${y1 + dir * r}`,\n `V ${y2 - dir * r}`,\n `Q ${midX} ${y2} ${midX + r} ${y2}`,\n `H ${x2}`,\n ].join(\" \");\n};\n\nexport const smoothScrollTo = (\n element: HTMLElement,\n targetPosition: number,\n duration: number = 300,\n onComplete?: () => void,\n onProgress?: () => void,\n) => {\n const originalScrollBehavior = element.style.scrollBehavior;\n element.style.scrollBehavior = \"auto\";\n\n const startPosition = element.scrollTop;\n const distance = targetPosition - startPosition;\n let startTime: number | null = null;\n\n const easeOutCubic = (time: number, start: number, change: number, dur: number) => {\n time /= dur;\n time--;\n return change * (time * time * time + 1) + start;\n };\n\n const animation = (currentTime: number) => {\n if (startTime === null) startTime = currentTime;\n const timeElapsed = currentTime - startTime;\n \n if (timeElapsed < duration) {\n element.scrollTop = easeOutCubic(timeElapsed, startPosition, distance, duration);\n if (onProgress) onProgress();\n requestAnimationFrame(animation);\n } else {\n element.scrollTop = targetPosition;\n element.style.scrollBehavior = originalScrollBehavior;\n if (onProgress) onProgress();\n if (onComplete) onComplete();\n }\n };\n\n requestAnimationFrame(animation);\n};\n\nexport const escapeRegExp = (string: string) => {\n let escaped = string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n escaped = escaped.replace(/['’‘`]/g, \"['’‘`]\");\n escaped = escaped.replace(/[\"”“]/g, '[\"”“]');\n escaped = escaped.replace(/[-—–]/g, '[-—–]');\n escaped = escaped.replace(/\\s+/g, '\\\\s+');\n\n return escaped;\n};\n\nconst SEVERITY_ORDER = [\"#B91C1C\", \"#A16207\", \"#1D4ED8\", \"#000000\"];\n\nconst getColorSeverityRank = (color: string): number => {\n const idx = SEVERITY_ORDER.findIndex(\n c => c.toLowerCase() === color.toLowerCase()\n );\n return idx === -1 ? SEVERITY_ORDER.length : idx;\n};\n\nexport const getFirstDeviationColor = (evaluationResult: any): string => {\n const allColors: string[] = [];\n\n const deviationKeys = Object.keys(evaluationResult?.deviations || {})\n .sort((a, b) => Number(a) - Number(b));\n for (const key of deviationKeys) {\n const color = evaluationResult?.deviations?.[key]?.evaluation_outputs?.metadata?.label_color;\n if (color) allColors.push(color);\n }\n\n const entryKeys = Object.keys(evaluationResult?.deviation_entries || {})\n .sort((a, b) => Number(a) - Number(b));\n for (const key of entryKeys) {\n const color = evaluationResult?.deviation_entries?.[key]?.evaluation_outputs?.metadata?.label_color;\n if (color) allColors.push(color);\n }\n\n const numericKeys = Object.keys(evaluationResult || {})\n .filter(k => /^\\d+$/.test(k))\n .sort((a, b) => Number(a) - Number(b));\n for (const key of numericKeys) {\n const color = evaluationResult?.[key]?.evaluation_outputs?.metadata?.label_color;\n if (color) allColors.push(color);\n }\n\n if (allColors.length === 0) {\n if (evaluationResult?.evaluation_outputs?.metadata?.label_color) {\n return evaluationResult.evaluation_outputs.metadata.label_color;\n }\n return DEFAULT_DEVIAION_COLOR;\n }\n\n return allColors.sort(\n (a, b) => getColorSeverityRank(a) - getColorSeverityRank(b)\n )[0];\n};\n\nexport const getFirstDeviationOutputValue = (evaluationResult: any): string | null => {\n const deviationKeys = Object.keys(evaluationResult?.deviations || {})\n .sort((a, b) => Number(a) - Number(b));\n for (const key of deviationKeys) {\n const value = evaluationResult?.deviations?.[key]?.evaluation_outputs?.output_value;\n if (value) return value;\n }\n\n const entryKeys = Object.keys(evaluationResult?.deviation_entries || {})\n .sort((a, b) => Number(a) - Number(b));\n for (const key of entryKeys) {\n const value = evaluationResult?.deviation_entries?.[key]?.evaluation_outputs?.output_value;\n if (value) return value;\n }\n\n const numericKeys = Object.keys(evaluationResult || {})\n .filter(k => /^\\d+$/.test(k))\n .sort((a, b) => Number(a) - Number(b));\n for (const key of numericKeys) {\n const value = evaluationResult?.[key]?.evaluation_outputs?.output_value;\n if (value) return value;\n }\n\n if (evaluationResult?.evaluation_outputs?.output_value) {\n return evaluationResult.evaluation_outputs.output_value;\n }\n\n return null;\n};\n\nexport const mixHexColors = (hex1: string, hex2: string): string => {\n // Helper to convert hex to RGB array\n const hexToRgb = (hex: string) => {\n const cleanHex = hex.replace(\"#\", \"\");\n const r = parseInt(cleanHex.substring(0, 2), 16);\n const g = parseInt(cleanHex.substring(2, 4), 16);\n const b = parseInt(cleanHex.substring(4, 6), 16);\n return [r, g, b];\n };\n\n // Helper to convert RGB value back to 2-digit hex\n const toHex = (c: number) => {\n const hex = Math.round(c).toString(16);\n return hex.length === 1 ? \"0\" + hex : hex;\n };\n\n try {\n const rgb1 = hexToRgb(hex1);\n const rgb2 = hexToRgb(hex2);\n\n // Average the RGB values (Multiply by 0.95 to slightly darken the overlap for better visibility)\n const r = ((rgb1[0] + rgb2[0]) / 2) * 0.95;\n const g = ((rgb1[1] + rgb2[1]) / 2) * 0.95;\n const b = ((rgb1[2] + rgb2[2]) / 2) * 0.95;\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n } catch (e) {\n // Fallback to a default overlap color if invalid hex is passed\n return \"#FDE68A\"; \n }\n};\n\n// Recursively find the keyPath (e.g. \"2-1-0\") of a node by its id\n// path here is the running position string built up as we recurse deeper\nexport const recursivelyFindSubSectionIdxById = (\n node: any,\n path: string,\n targetId: string,\n): string | null => {\n if (!node) return null;\n if (node.id === targetId || node.nodeId === targetId || node.contentId === targetId) return path;\n if (!Array.isArray(node.subsections)) return null;\n\n for (let i = 0; i < node.subsections.length; i++) {\n const next = recursivelyFindSubSectionIdxById(\n node.subsections[i],\n `${path}-${i}`,\n targetId,\n );\n if (next) return next;\n }\n return null;\n};\n\nexport const findKeyPathByNodeId = (\n sections: SectionBlock[],\n nodeId: string,\n): string | null => {\n for (let i = 0; i < sections.length; i++) {\n const found = recursivelyFindSubSectionIdxById(\n sections[i],\n String(i),\n nodeId,\n );\n if (found) return found;\n }\n return null;\n};\n\nconst highlightTimeouts = new WeakMap<HTMLElement, number>();\n\nexport const resetClauseHighlight = (element: HTMLElement) => {\n if (!element) return;\n\n const timeoutId = highlightTimeouts.get(element);\n if (timeoutId != null) {\n clearTimeout(timeoutId);\n highlightTimeouts.delete(element);\n }\n\n element.style.transition = \"box-shadow 300ms ease-out, outline 300ms ease-out\";\n requestAnimationFrame(() => {\n element.style.outline = \"\";\n element.style.boxShadow = \"\";\n });\n window.setTimeout(() => {\n element.style.transition = \"\";\n element.style.borderRadius = \"\";\n }, 300);\n};\n\nexport const highlightClause = (element: HTMLElement) => {\n if (!element) return;\n\n const existingTimeout = highlightTimeouts.get(element);\n if (existingTimeout != null) {\n clearTimeout(existingTimeout);\n }\n\n element.style.transition = \"box-shadow 300ms ease-in-out, outline 300ms ease-in-out\";\n element.style.outline = \"2px solid #ff9494\";\n element.style.borderRadius = \"6px\";\n element.style.boxShadow = \"0 0 12px 2px rgba(244, 113, 113, 0.33)\";\n\n const timeoutId = window.setTimeout(() => {\n resetClauseHighlight(element);\n }, 3000);\n highlightTimeouts.set(element, timeoutId);\n};\n\nexport const scrollAndHighlightClause = (\n element: HTMLElement,\n scrollContainer: HTMLElement,\n) => {\n const containerRect = scrollContainer.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n\n const targetScrollTop =\n scrollContainer.scrollTop +\n elementRect.top -\n containerRect.top -\n containerRect.height / 2 +\n elementRect.height / 2;\n\n scrollContainer.scrollTo({ top: targetScrollTop, behavior: \"smooth\" });\n\n const doHighlight = () => highlightClause(element);\n\n const supportsScrollEnd =\n \"onscrollend\" in (scrollContainer as HTMLElement & { onscrollend?: unknown });\n\n if (supportsScrollEnd) {\n scrollContainer.addEventListener(\"scrollend\", doHighlight, { once: true });\n } else {\n let lastScrollTop = scrollContainer.scrollTop;\n const pollScroll = () => {\n if (scrollContainer.scrollTop === lastScrollTop) {\n doHighlight();\n } else {\n lastScrollTop = scrollContainer.scrollTop;\n requestAnimationFrame(pollScroll);\n }\n };\n requestAnimationFrame(pollScroll);\n }\n};\n\n\nexport const waitForElementVisible = (\n element: HTMLElement,\n onVisible: () => void,\n) => {\n if (element.getBoundingClientRect().height > 0) {\n requestAnimationFrame(onVisible);\n return;\n }\n\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.height > 0) {\n ro.disconnect();\n requestAnimationFrame(onVisible);\n return;\n }\n }\n });\n\n ro.observe(element);\n};\n\n\nexport const scrollAndWait = (\n container: HTMLElement,\n top: number,\n callback: () => void\n) => {\n if (Math.abs(container.scrollTop - top) <= 2) {\n callback();\n return;\n }\n\n let called = false;\n let fallbackTimer: ReturnType<typeof setTimeout>;\n\n const fire = () => {\n if (called) return;\n called = true;\n clearTimeout(fallbackTimer);\n container.removeEventListener(\"scrollend\", handleScrollEnd);\n callback();\n };\n\n const handleScrollEnd = () => fire();\n\n container.addEventListener(\"scrollend\", handleScrollEnd);\n container.scrollTo({ top, behavior: \"smooth\" });\n fallbackTimer = setTimeout(fire, 800);\n};\n\nexport const waitForScrollIdle = (\n container: HTMLElement,\n idleMs = 100\n ): Promise<void> =>\n new Promise((resolve) => {\n let called = false;\n let timer: ReturnType<typeof setTimeout>;\n\n const fire = () => {\n if (called) return;\n called = true;\n container.removeEventListener(\"scroll\", onScroll);\n resolve();\n };\n\n const onScroll = () => {\n clearTimeout(timer);\n timer = setTimeout(fire, idleMs);\n };\n\n container.addEventListener(\"scroll\", onScroll);\n timer = setTimeout(fire, idleMs);\n });\n"],"names":["safeStringify","val","Array","isArray","map","join","JSON","stringify","String","hasValue","trim","length","some","v","getAlphabeticSuffix","index","value","suffix","ASCII_LOWER_A","fromCharCode","Math","floor","resolveComparisonInputItems","node","sideIndex","indexMap","contentMapping","sideUuid","rawInput","comparison_inputs","item","idx","mapped","contentId","data","attributes","additional_attributes","content_id","id","filter","Boolean","isMissingStr","str","s","toLowerCase","includes","hasMeaningfulRedlineTags","content","tagPattern","match","exec","replace","stripRedlineTags","SEVERITY_ORDER","getColorSeverityRank","color","findIndex","c","recursivelyFindSubSectionIdxById","path","targetId","nodeId","subsections","i","next","highlightTimeouts","WeakMap","resetClauseHighlight","element","timeoutId","get","clearTimeout","delete","style","transition","requestAnimationFrame","outline","boxShadow","window","setTimeout","borderRadius","highlightClause","existingTimeout","set","prevProps","nextProps","overlayContent","sxStyles","maintainRelativeOrder","highlightBg","suppressHighlightBg","collisionKey","prevH","highlights","nextH","prevB","deviationBadges","nextB","actionId","label","score","isOrphan","isConnected","showScrollLockToggle","scrollSyncLocked","badgeBg","badgeBorder","badgeText","func","delay","args","context","this","apply","evaluationResult","fallbackLabel","evaluation_output","output_score","evaluation_outputs","output_value","sections","found","hex","mixWithWhite","opacity","r","g","b","normalized","normalizeHex","bigint","parseInt","hexToRgb","x","toString","padStart","toUpperCase","rgbToHex","round","bg","border","x1","y1","x2","y2","radius","midX","dy","abs","dir","min","allColors","deviationKeys","Object","keys","deviations","sort","a","Number","key","metadata","label_color","push","entryKeys","deviation_entries","numericKeys","k","test","DEFAULT_DEVIAION_COLOR","leftDocId","deviationNumberRegistry","displayIndexes","Map","normalize","raw","forEach","root","registeredEntries","visit","evaluationResults","registryNodeId","entries","deviationKey","deviationMap","highlight","normalizedHighlight","refId","registryIndex","size","firstIndex","from","values","mapping_rationale","cognitiveData","decisioning","gap","relevance_score","isMissingRationale","citations","relation","rat","strength","decision_strength","decisioning_factors","gaps_in_decision","section","proposedSections","leftNums","fallbackNumber","firstOnly","mappedLabels","lhs","refIndexes","rhsPosition","refIndex","selfIndex","baseNumber","items","first","title","change_history","allItems","hex1","hex2","cleanHex","substring","toHex","rgb1","rgb2","e","scrollContainer","containerRect","getBoundingClientRect","elementRect","targetScrollTop","scrollTop","top","height","scrollTo","behavior","doHighlight","addEventListener","once","lastScrollTop","pollScroll","container","callback","fallbackTimer","called","fire","removeEventListener","handleScrollEnd","targetPosition","duration","onComplete","onProgress","originalScrollBehavior","scrollBehavior","startPosition","distance","startTime","animation","currentTime","timeElapsed","time","idleMs","Promise","resolve","timer","onScroll"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),o=require("@mui/material"),i=require("lucide-react"),n=require("react-dom"),a=require("../../assests/svg/SparkleIcon.js"),s=require("./CognitiveCompareConfig.js"),r=require("./CitationRenderer.js"),c=require("./CognitiveCompareConstants.js"),d=require("./CompareContext.js"),l=require("./onDemandCitations/contextBuilder.js"),p=require("./onDemandCitations/payload.js");function x(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var g=x(n);const b=e=>Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.trim().length>0):"string"==typeof e&&e.trim().length>0?[e]:[];exports.default=({open:n,onClose:x,sectionTitle:h,referenceSectionTitle:u,cognitiveData:f,relevanceScore:m,anchorEl:v,badgeStyle:y,popupRef:C,position:I,markdownStyles:_,docData:R,popupConfig:S,deviationData:F=null,isLoading:E,sourceNodeId:j,deviationKey:w,baseContentId:D,compareContentIds:A})=>{const{treeData:O,onDemandCitationConfig:W,prefetchOnDemandCitationContexts:k,abortOnDemandCitationContexts:T,getOnDemandCitationCacheEntry:B}=d.useCompareContext(),$={...s.SHARED_MARKDOWN_STYLES,..._},P=t.useMemo(()=>({...s.DEFAULT_POPUP_CONFIG,...S,tabs:{deviation:{...s.DEFAULT_POPUP_CONFIG.tabs.deviation,...S?.tabs?.deviation},association:{...s.DEFAULT_POPUP_CONFIG.tabs.association,...S?.tabs?.association}},sectionTitles:{...s.DEFAULT_POPUP_CONFIG.sectionTitles,...S?.sectionTitles}}),[S]),Z=f?.isMissingRationale,[z,N]=t.useState(Z?P.tabs.deviation.key:P.tabs.association.key),[q,K]=t.useState(!1),L=t.useCallback(e=>{K(e)},[]);t.useEffect(()=>{n?N(Z?P.tabs.deviation.key:P.tabs.association.key):K(!1)},[n,Z,P.tabs.deviation.key,P.tabs.association.key]),t.useEffect(()=>{if(!n||!W?.enabled)return;const e=e=>{const t="deviation"===e,o=t?[...b(F?.cognitive_decisioning?.decisioning_factors),...b(F?.cognitive_decisioning?.gaps_in_decision)]:[...b(f?.decisioning),...b(f?.gap)];return l.buildOnDemandCitationContexts({treeData:O,content:o,requestId:W.requestId,tabKey:e,popupNodeId:j||F?.nodeId||f?.section_id,deviationKey:w,sectionTitle:h,referenceSectionTitle:u,docData:R,staticCitations:t?F?.cognitive_decisioning?.citations:f?.citations,deviationData:F,cognitiveData:f,baseContentId:D,compareContentIds:A})},t=z===P.tabs.deviation.key,o="prefetchAllTabs"===W.strategy?[...e("deviation"),...e("association")]:e(t?"deviation":"association"),i=o.map(e=>p.buildOnDemandCitationPayload(W,e));return W.onContextsBuilt?.(o),W.onPayloadsBuilt?.(i,o),W.debug&&(console.groupCollapsed("[CognitiveCompare:onDemandCitations]"),console.log("contexts",o),console.log("payloads",i),console.log("cacheEntries",o.map(e=>B(e))),console.groupEnd()),"prefetchActiveTab"!==W.strategy&&"prefetchAllTabs"!==W.strategy||k(o).catch(e=>{W.debug&&console.error("[CognitiveCompare:onDemandCitations] prefetch failed",e)}),()=>{W.abortOnPopupClose&&T(o)}},[T,z,P.tabs.deviation.key,f,F,R,B,W,n,k,u,h,j,w,D,A,O]);const M=t.useMemo(()=>{if(!y)return{border:P.accentColor,shadow:`${P.accentColor}2E`};const e=y.badgeText;return"#9F1239"===e||"#B42318"===e?{border:"#E11D48",shadow:"rgba(225,29,72,0.15)"}:"#1D4ED8"===e?{border:"#3B82F6",shadow:"rgba(59,130,246,0.15)"}:"#A16207"===e?{border:"#F59E0B",shadow:"rgba(245,158,11,0.15)"}:{border:P.accentColor,shadow:`${P.accentColor}2E`}},[y,P.accentColor]);t.useEffect(()=>{if(!n||q)return;const e=e=>{C.current?.contains(e.target)||v?.contains(e.target)||x()};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[n,x,v,C,q]);const U=Z?[]:[P.tabs.deviation,P.tabs.association];if(1===U.length&&U[0].key===P.tabs.deviation.key)return null;if(!n||!f)return null;const H=(z===P.tabs.deviation.key?F?.cognitive_decisioning?.decision_strength:f.relevance_score)??m??0,G=f.decisioning,X=Array.isArray(G)?G:"string"==typeof G&&G.trim()?[G]:[],V=f.gap,Y=Array.isArray(V)?V:"string"==typeof V&&V.trim()?[V]:[],J=I?.arrowLeft??60,Q=e.jsxs(o.Box,{ref:C,sx:{position:"fixed",top:I?.top??-9999,left:I?.left??-9999,zIndex:9999,width:`min(${c.POPUP_WIDTH}px, calc(100vw - ${2*c.VIEWPORT_MARGIN}px))`,maxWidth:`calc(100vw - ${2*c.VIEWPORT_MARGIN}px)`,boxSizing:"border-box",bgcolor:"#FFFFFF",borderRadius:"14px",border:`1.5px solid ${M.border}`,boxShadow:`0px 8px 32px ${M.shadow}, 0px 0px 0px 3px ${M.shadow}`,overflow:"visible",display:q?"none":"flex",flexDirection:"column",maxHeight:I?.maxHeight?`min(60vh, ${I.maxHeight}px)`:"60vh",visibility:I?"visible":"hidden",pointerEvents:q?"none":"auto"},children:[I&&(I.openAbove?e.jsxs(e.Fragment,{children:[e.jsx(o.Box,{sx:{position:"absolute",bottom:-(c.ARROW_SIZE+1),left:J-c.ARROW_SIZE,width:0,height:0,borderLeft:`${c.ARROW_SIZE}px solid transparent`,borderRight:`${c.ARROW_SIZE}px solid transparent`,borderTop:`${c.ARROW_SIZE+1}px solid ${M.border}`,zIndex:1}}),e.jsx(o.Box,{sx:{position:"absolute",bottom:-(c.ARROW_SIZE-1),left:J-c.ARROW_SIZE+1,width:0,height:0,borderLeft:c.ARROW_SIZE-1+"px solid transparent",borderRight:c.ARROW_SIZE-1+"px solid transparent",borderTop:`${c.ARROW_SIZE}px solid #FFFFFF`,zIndex:2}})]}):e.jsxs(e.Fragment,{children:[e.jsx(o.Box,{sx:{position:"absolute",top:-(c.ARROW_SIZE+1),left:J-c.ARROW_SIZE,width:0,height:0,borderLeft:`${c.ARROW_SIZE}px solid transparent`,borderRight:`${c.ARROW_SIZE}px solid transparent`,borderBottom:`${c.ARROW_SIZE+1}px solid ${M.border}`,zIndex:1}}),e.jsx(o.Box,{sx:{position:"absolute",top:-(c.ARROW_SIZE-1),left:J-c.ARROW_SIZE+1,width:0,height:0,borderLeft:c.ARROW_SIZE-1+"px solid transparent",borderRight:c.ARROW_SIZE-1+"px solid transparent",borderBottom:`${c.ARROW_SIZE}px solid #FFFFFF`,zIndex:2}})]})),e.jsxs(o.Box,{sx:{px:2.5,pt:2,pb:1.5,display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:2,flexWrap:{xs:"wrap",sm:"nowrap"},flexShrink:0},children:[e.jsxs(o.Box,{sx:{flex:{xs:"1 1 100%",sm:1},minWidth:0},children:[("no counterpart"!==h||"no counterpart"!==u)&&e.jsxs(o.Typography,{sx:{fontSize:"16px",fontWeight:600,color:"#101828",lineHeight:1.3,display:"flex",alignItems:"center",gap:1,flexWrap:"nowrap",overflow:"hidden",width:"100%"},children:[e.jsx(o.Box,{component:"span",title:h,sx:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:"0 1 auto",maxWidth:"calc(50% - 16px)",minWidth:0},children:h}),e.jsx(o.Box,{component:"span",sx:{color:"#667085",fontWeight:400,flexShrink:0,mx:.5},children:"↔"}),e.jsx(o.Box,{component:"span",title:u||"Reference Section",sx:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1,minWidth:0},children:u||"Reference Section"})]}),e.jsx(o.Box,{sx:{mt:.75,display:"inline-flex",alignItems:"center",gap:.75},children:e.jsx(o.Typography,{sx:{fontSize:"no counterpart"!==h||"no counterpart"!==u?"13px":"16px",fontWeight:400,color:"#5928ED",lineHeight:1},children:Object.values(P.tabs).find(e=>e.key===z)?.subtitle})})]}),e.jsxs(o.Box,{sx:{display:"flex",alignItems:"center",gap:1.5,flexShrink:0,maxWidth:"100%",ml:{xs:"auto",sm:0}},children:[e.jsxs(o.Box,{sx:{display:"inline-flex",alignItems:"center",gap:"5px",px:1.5,py:.5,borderRadius:"20px",bgcolor:"#FFFFFF",border:"1px solid #5928ED",fontSize:"12px",fontWeight:600,color:"#5928ED",maxWidth:"100%",whiteSpace:"nowrap",overflow:"hidden"},children:[e.jsx(a.default,{}),P.decisionStrengthLabel," ",H,"%"]}),e.jsx(o.IconButton,{onClick:x,size:"small",sx:{color:"#667085",width:24,height:24,"&:hover":{bgcolor:"transparent",color:"#101828"}},children:e.jsx(i.X,{size:22})})]})]}),e.jsx(o.Box,{sx:{display:"flex",borderBottom:"1px solid #E4E7EC",px:2.5,flexShrink:0,maxWidth:"100%",overflowX:"auto"},children:U.map(t=>{const i=z===t.key,n=t.key===P.tabs.deviation.key,a=U.length>1&&n&&E,s=e.jsx(o.Box,{onClick:()=>{a||N(t.key)},sx:{pb:"10px",pt:"4px",mr:3,px:2,cursor:a?"not-allowed":"pointer",opacity:a?.5:1,fontSize:"14px",fontWeight:i?600:400,color:i?P.accentColor:"#667085",backgroundColor:i?`${P.accentColor}14`:"transparent",borderBottom:i?`2px solid ${P.accentColor}`:"2px solid transparent",transition:"all 0.15s",userSelect:"none",flexShrink:0},children:t.label},t.key);return a?e.jsx(o.Tooltip,{title:"Fetching deviation data",arrow:!0,placement:"top",children:e.jsx("span",{children:s})},t.key):s})}),e.jsx(o.Box,{sx:{flex:1,minHeight:0,overflowY:"auto",overflowX:"auto",maxWidth:"100%",boxSizing:"border-box",px:2.5,py:2,display:"flex",flexDirection:"column",gap:1.5,"&::-webkit-scrollbar":{width:"6px"},"&::-webkit-scrollbar-track":{background:"transparent"},"&::-webkit-scrollbar-thumb":{background:`${M.border}55`,borderRadius:"10px"},"&::-webkit-scrollbar-thumb:hover":{background:M.border},scrollbarWidth:"thin",scrollbarColor:`${M.border}55 transparent`},children:z===P.tabs.deviation.key?F?e.jsxs(e.Fragment,{children:[(F?.cognitive_decisioning?.decisioning_factors||[])?.length>0&&e.jsx(r.default,{title:"Decision Making Factors",content:F?.cognitive_decisioning?.decisioning_factors?.join("\n\n"),citations:F?.cognitive_decisioning?.citations,styles:$,docData:R,deviationData:F,open:n,onCitationFullscreenChange:L,tabKey:"deviation",sectionTitle:h,referenceSectionTitle:u,sourceNodeId:j,deviationKey:w,baseContentId:D,compareContentIds:A}),(F?.cognitive_decisioning?.gaps_in_decision||[])?.length>0&&e.jsx(r.default,{title:"Gaps in Decision",content:F?.cognitive_decisioning?.gaps_in_decision?.join("\n\n"),citations:F?.cognitive_decisioning?.citations,styles:$,docData:R,deviationData:F,open:n,onCitationFullscreenChange:L,tabKey:"deviation",sectionTitle:h,referenceSectionTitle:u,sourceNodeId:j,deviationKey:w,baseContentId:D,compareContentIds:A}),0===(F?.cognitive_decisioning?.decisioning_factors||[])?.length&&0===(F?.cognitive_decisioning?.gaps_in_decision||[])?.length&&e.jsx(o.Box,{sx:{p:2,bgcolor:"#F8FAFC",borderRadius:"8px",border:"1px solid #E2E8F0"},children:e.jsx(o.Typography,{sx:{fontSize:"13px",color:"#64748B"},children:"No cognitive decisioning data available for this section."})})]}):e.jsx(r.default,{title:"Deviation Analysis",content:"Deviation analysis content will appear here. This tab shows\n structural and semantic deviations identified between the two\n sections being compared.",citations:{},styles:$,docData:R,open:n,onCitationFullscreenChange:L,tabKey:"deviation",sectionTitle:h,referenceSectionTitle:u,sourceNodeId:j,deviationKey:w,baseContentId:D,compareContentIds:A}):e.jsxs(e.Fragment,{children:[X.length>0&&e.jsx(r.default,{title:P.sectionTitles.decisioningFactors,content:X.join("\n\n"),citations:f.citations,styles:$,open:n,docData:R,onCitationFullscreenChange:L,tabKey:"association",sectionTitle:h,referenceSectionTitle:u,sourceNodeId:j,deviationKey:w,baseContentId:D,compareContentIds:A}),Y.length>0&&e.jsx(r.default,{title:P.sectionTitles.gaps,content:Y.join("\n\n"),citations:f.citations,styles:$,open:n,docData:R,onCitationFullscreenChange:L,tabKey:"association",sectionTitle:h,referenceSectionTitle:u,sourceNodeId:j,deviationKey:w,baseContentId:D,compareContentIds:A}),0===X.length&&0===Y.length&&e.jsx(o.Box,{sx:{p:2,bgcolor:"#F8FAFC",borderRadius:"8px",border:"1px solid #E2E8F0"},children:e.jsx(o.Typography,{sx:{fontSize:"13px",color:"#64748B"},children:P.emptyStateMessage})})]})})]});return g.default.createPortal(Q,document.body)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),o=require("@mui/material"),i=require("lucide-react"),n=require("react-dom"),s=require("../../assests/svg/SparkleIcon.js"),r=require("./CognitiveCompareConfig.js"),a=require("./CitationRenderer.js");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c=l(n);const d=10;exports.default=({open:n,onClose:l,sectionTitle:x,referenceSectionTitle:p,cognitiveData:h,relevanceScore:g,anchorEl:b,badgeStyle:u,popupRef:f,position:m,markdownStyles:v,docData:y,popupConfig:F,deviationData:j=null,isLoading:w})=>{const C={...r.SHARED_MARKDOWN_STYLES,...v},k=t.useMemo(()=>({...r.DEFAULT_POPUP_CONFIG,...F,tabs:{deviation:{...r.DEFAULT_POPUP_CONFIG.tabs.deviation,...F?.tabs?.deviation},association:{...r.DEFAULT_POPUP_CONFIG.tabs.association,...F?.tabs?.association}},sectionTitles:{...r.DEFAULT_POPUP_CONFIG.sectionTitles,...F?.sectionTitles}}),[F]),_=h?.isMissingRationale,[B,D]=t.useState(_?k.tabs.deviation.key:k.tabs.association.key),[S,E]=t.useState(!1),T=t.useCallback(e=>{E(e)},[]);t.useEffect(()=>{n?D(_?k.tabs.deviation.key:k.tabs.association.key):E(!1)},[n,_,k.tabs.deviation.key,k.tabs.association.key]);const I=t.useMemo(()=>{if(!u)return{border:k.accentColor,shadow:`${k.accentColor}2E`};const e=u.badgeText;return"#9F1239"===e||"#B42318"===e?{border:"#E11D48",shadow:"rgba(225,29,72,0.15)"}:"#1D4ED8"===e?{border:"#3B82F6",shadow:"rgba(59,130,246,0.15)"}:"#A16207"===e?{border:"#F59E0B",shadow:"rgba(245,158,11,0.15)"}:{border:k.accentColor,shadow:`${k.accentColor}2E`}},[u,k.accentColor]);t.useEffect(()=>{if(!n||S)return;const e=e=>{f.current?.contains(e.target)||b?.contains(e.target)||l()};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[n,l,b,f,S]);const R=_?[]:[k.tabs.deviation,k.tabs.association];if(1===R.length&&R[0].key===k.tabs.deviation.key)return null;if(!n||!h)return null;const A=(B===k.tabs.deviation.key?j?.cognitive_decisioning?.decision_strength:h.relevance_score)??g??0,L=h.decisioning,P=Array.isArray(L)?L:"string"==typeof L&&L.trim()?[L]:[],z=h.gap,O=Array.isArray(z)?z:"string"==typeof z&&z.trim()?[z]:[],W=m?m.left-150:-9999,$=(m?.arrowLeft??60)+150,q=e.jsxs(o.Box,{ref:f,sx:{position:"fixed",top:m?.top??-9999,left:W,zIndex:9999,width:"1050px",maxWidth:`min(1050px, calc(100vw - ${W>0?W:0}px - 12px))`,bgcolor:"#FFFFFF",borderRadius:"14px",border:`1.5px solid ${I.border}`,boxShadow:`0px 8px 32px ${I.shadow}, 0px 0px 0px 3px ${I.shadow}`,overflow:"visible",display:"flex",flexDirection:"column",maxHeight:m?.maxHeight?`min(60vh, ${m.maxHeight}px)`:"60vh",visibility:!S&&m?"visible":"hidden",pointerEvents:S?"none":"auto"},children:[m&&(m.openAbove?e.jsxs(e.Fragment,{children:[e.jsx(o.Box,{sx:{position:"absolute",bottom:-11,left:$-d,width:0,height:0,borderLeft:"10px solid transparent",borderRight:"10px solid transparent",borderTop:`11px solid ${I.border}`,zIndex:1}}),e.jsx(o.Box,{sx:{position:"absolute",bottom:-9,left:$-d+1,width:0,height:0,borderLeft:"9px solid transparent",borderRight:"9px solid transparent",borderTop:"10px solid #FFFFFF",zIndex:2}})]}):e.jsxs(e.Fragment,{children:[e.jsx(o.Box,{sx:{position:"absolute",top:-11,left:$-d,width:0,height:0,borderLeft:"10px solid transparent",borderRight:"10px solid transparent",borderBottom:`11px solid ${I.border}`,zIndex:1}}),e.jsx(o.Box,{sx:{position:"absolute",top:-9,left:$-d+1,width:0,height:0,borderLeft:"9px solid transparent",borderRight:"9px solid transparent",borderBottom:"10px solid #FFFFFF",zIndex:2}})]})),e.jsxs(o.Box,{sx:{px:2.5,pt:2,pb:1.5,display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:2,flexShrink:0},children:[e.jsxs(o.Box,{sx:{flex:1,minWidth:0},children:[("no counterpart"!==x||"no counterpart"!==p)&&e.jsxs(o.Typography,{sx:{fontSize:"16px",fontWeight:600,color:"#101828",lineHeight:1.3,display:"flex",alignItems:"center",gap:1,flexWrap:"nowrap",overflow:"hidden",width:"100%"},children:[e.jsx(o.Box,{component:"span",title:x,sx:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:"0 1 auto",maxWidth:"calc(50% - 16px)",minWidth:0},children:x}),e.jsx(o.Box,{component:"span",sx:{color:"#667085",fontWeight:400,flexShrink:0,mx:.5},children:"↔"}),e.jsx(o.Box,{component:"span",title:p||"Reference Section",sx:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1,minWidth:0},children:p||"Reference Section"})]}),e.jsx(o.Box,{sx:{mt:.75,display:"inline-flex",alignItems:"center",gap:.75},children:e.jsx(o.Typography,{sx:{fontSize:"no counterpart"!==x||"no counterpart"!==p?"13px":"16px",fontWeight:400,color:"#5928ED",lineHeight:1},children:Object.values(k.tabs).find(e=>e.key===B)?.subtitle})})]}),e.jsxs(o.Box,{sx:{display:"flex",alignItems:"center",gap:1.5,flexShrink:0},children:[e.jsxs(o.Box,{sx:{display:"inline-flex",alignItems:"center",gap:"5px",px:1.5,py:.5,borderRadius:"20px",bgcolor:"#FFFFFF",border:"1px solid #5928ED",fontSize:"12px",fontWeight:600,color:"#5928ED"},children:[e.jsx(s.default,{}),k.decisionStrengthLabel," ",A,"%"]}),e.jsx(o.IconButton,{onClick:l,size:"small",sx:{color:"#667085",width:24,height:24,"&:hover":{bgcolor:"transparent",color:"#101828"}},children:e.jsx(i.X,{size:22})})]})]}),e.jsx(o.Box,{sx:{display:"flex",borderBottom:"1px solid #E4E7EC",px:2.5,flexShrink:0},children:R.map(t=>{const i=B===t.key,n=t.key===k.tabs.deviation.key,s=R.length>1&&n&&w,r=e.jsx(o.Box,{onClick:()=>{s||D(t.key)},sx:{pb:"10px",pt:"4px",mr:3,px:2,cursor:s?"not-allowed":"pointer",opacity:s?.5:1,fontSize:"14px",fontWeight:i?600:400,color:i?k.accentColor:"#667085",backgroundColor:i?`${k.accentColor}14`:"transparent",borderBottom:i?`2px solid ${k.accentColor}`:"2px solid transparent",transition:"all 0.15s",userSelect:"none"},children:t.label},t.key);return s?e.jsx(o.Tooltip,{title:"Fetching deviation data",arrow:!0,placement:"top",children:e.jsx("span",{children:r})},t.key):r})}),e.jsx(o.Box,{sx:{flex:1,minHeight:0,overflowY:"auto",px:2.5,py:2,display:"flex",flexDirection:"column",gap:1.5,"&::-webkit-scrollbar":{width:"6px"},"&::-webkit-scrollbar-track":{background:"transparent"},"&::-webkit-scrollbar-thumb":{background:`${I.border}55`,borderRadius:"10px"},"&::-webkit-scrollbar-thumb:hover":{background:I.border},scrollbarWidth:"thin",scrollbarColor:`${I.border}55 transparent`},children:B===k.tabs.deviation.key?j?e.jsxs(e.Fragment,{children:[(j?.cognitive_decisioning?.decisioning_factors||[])?.length>0&&e.jsx(a.default,{title:"Decision Making Factors",content:j?.cognitive_decisioning?.decisioning_factors?.join("\n\n"),citations:j?.cognitive_decisioning?.citations,styles:C,docData:y,deviationData:j,open:n,onCitationFullscreenChange:T}),(j?.cognitive_decisioning?.gaps_in_decision||[])?.length>0&&e.jsx(a.default,{title:"Gaps in Decision",content:j?.cognitive_decisioning?.gaps_in_decision?.join("\n\n"),citations:j?.cognitive_decisioning?.citations,styles:C,docData:y,deviationData:j,open:n,onCitationFullscreenChange:T}),0===(j?.cognitive_decisioning?.decisioning_factors||[])?.length&&0===(j?.cognitive_decisioning?.gaps_in_decision||[])?.length&&e.jsx(o.Box,{sx:{p:2,bgcolor:"#F8FAFC",borderRadius:"8px",border:"1px solid #E2E8F0"},children:e.jsx(o.Typography,{sx:{fontSize:"13px",color:"#64748B"},children:"No cognitive decisioning data available for this section."})})]}):e.jsx(a.default,{title:"Deviation Analysis",content:"Deviation analysis content will appear here. This tab shows\n structural and semantic deviations identified between the two\n sections being compared.",citations:{},styles:C,docData:y,open:n,onCitationFullscreenChange:T}):e.jsxs(e.Fragment,{children:[P.length>0&&e.jsx(a.default,{title:k.sectionTitles.decisioningFactors,content:P.join("\n\n"),citations:h.citations,styles:C,open:n,docData:y,onCitationFullscreenChange:T}),O.length>0&&e.jsx(a.default,{title:k.sectionTitles.gaps,content:O.join("\n\n"),citations:h.citations,styles:C,open:n,docData:y,onCitationFullscreenChange:T}),0===P.length&&0===O.length&&e.jsx(o.Box,{sx:{p:2,bgcolor:"#F8FAFC",borderRadius:"8px",border:"1px solid #E2E8F0"},children:e.jsx(o.Typography,{sx:{fontSize:"13px",color:"#64748B"},children:k.emptyStateMessage})})]})})]});return c.default.createPortal(q,document.body)};
2
2
  //# sourceMappingURL=CognitivePopup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CognitivePopup.js","sources":["../../../../src/features/CognitiveCompare/CognitivePopup.tsx"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback } from \"react\";\nimport { Box, Typography, IconButton, Tooltip } from \"@mui/material\";\nimport { X } from \"lucide-react\";\nimport ReactDOM from \"react-dom\";\nimport SparkleIcon from \"../../assests/svg/SparkleIcon\";\nimport ReactMarkdown from \"react-markdown\";\nimport CitationAnchor from \"./CitationAnchor\";\nimport {\n CognitivePopupConfig,\n CognitivePopupProps,\n} from \"./CognitiveCompareTypes\";\nimport { DEFAULT_POPUP_CONFIG, SHARED_MARKDOWN_STYLES } from \"./CognitiveCompareConfig\";\nimport CitationRenderer from \"./CitationRenderer\";\nimport {\n ARROW_SIZE,\n POPUP_WIDTH,\n VIEWPORT_MARGIN,\n} from \"./CognitiveCompareConstants\";\nimport { useCompareContext } from \"./CompareContext\";\nimport {\n buildOnDemandCitationContexts,\n buildOnDemandCitationPayload,\n} from \"./onDemandCitations\";\n\n// ─── CognitivePopup ───────────────────────────────────────────────────────────\n\nconst LEFT_OFFSET = 150;\n\nconst toTextArray = (value: unknown): string[] => {\n if (Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0);\n }\n\n return typeof value === \"string\" && value.trim().length > 0 ? [value] : [];\n};\n\nconst CognitivePopup: React.FC<\n CognitivePopupProps & { popupConfig?: CognitivePopupConfig }\n> = ({\n open,\n onClose,\n sectionTitle,\n referenceSectionTitle,\n cognitiveData,\n relevanceScore,\n anchorEl,\n badgeStyle,\n popupRef,\n position,\n markdownStyles,\n docData,\n popupConfig,\n deviationData = null,\n isLoading,\n sourceNodeId,\n deviationKey,\n baseContentId,\n compareContentIds,\n}) => {\n const {\n treeData,\n onDemandCitationConfig,\n prefetchOnDemandCitationContexts,\n abortOnDemandCitationContexts,\n getOnDemandCitationCacheEntry,\n } = useCompareContext();\n const resolvedMarkdownStyles = {\n ...SHARED_MARKDOWN_STYLES,\n ...markdownStyles,\n };\n const cfg = useMemo(() => ({\n ...DEFAULT_POPUP_CONFIG,\n ...popupConfig,\n tabs: {\n deviation: { ...DEFAULT_POPUP_CONFIG.tabs.deviation, ...popupConfig?.tabs?.deviation },\n association: { ...DEFAULT_POPUP_CONFIG.tabs.association, ...popupConfig?.tabs?.association },\n },\n sectionTitles: { ...DEFAULT_POPUP_CONFIG.sectionTitles, ...popupConfig?.sectionTitles },\n }), [popupConfig]);\n \n const isMissingRationale = (cognitiveData as any)?.isMissingRationale;\n const [activeTab, setActiveTab] = useState<string>(\n isMissingRationale ? cfg.tabs.deviation.key : cfg.tabs.association.key,\n );\n const [isCitationFullscreenOpen, setIsCitationFullscreenOpen] = useState(false);\n\n const handleCitationFullscreenChange = useCallback((isFullscreen: boolean) => {\n setIsCitationFullscreenOpen(isFullscreen);\n }, []);\n\n useEffect(() => {\n if (open) {\n setActiveTab(\n isMissingRationale ? cfg.tabs.deviation.key : cfg.tabs.association.key,\n );\n } else {\n setIsCitationFullscreenOpen(false);\n }\n }, [\n open,\n isMissingRationale,\n cfg.tabs.deviation.key,\n cfg.tabs.association.key,\n ]);\n\n useEffect(() => {\n if (!open || !onDemandCitationConfig?.enabled) return;\n\n const buildContextsForTab = (tabKey: \"deviation\" | \"association\") => {\n const isDeviationTab = tabKey === \"deviation\";\n const content = isDeviationTab\n ? [\n ...toTextArray((deviationData as any)?.cognitive_decisioning?.decisioning_factors),\n ...toTextArray((deviationData as any)?.cognitive_decisioning?.gaps_in_decision),\n ]\n : [\n ...toTextArray(cognitiveData?.decisioning),\n ...toTextArray(cognitiveData?.gap),\n ];\n\n return buildOnDemandCitationContexts({\n treeData,\n content,\n requestId: onDemandCitationConfig.requestId,\n tabKey,\n popupNodeId: sourceNodeId || (deviationData as any)?.nodeId || cognitiveData?.section_id,\n deviationKey,\n sectionTitle,\n referenceSectionTitle,\n docData,\n staticCitations: isDeviationTab\n ? (deviationData as any)?.cognitive_decisioning?.citations\n : cognitiveData?.citations,\n deviationData: deviationData as any,\n cognitiveData: cognitiveData as any,\n baseContentId,\n compareContentIds,\n });\n };\n\n const isDeviationTab = activeTab === cfg.tabs.deviation.key;\n const contexts =\n onDemandCitationConfig.strategy === \"prefetchAllTabs\"\n ? [\n ...buildContextsForTab(\"deviation\"),\n ...buildContextsForTab(\"association\"),\n ]\n : buildContextsForTab(isDeviationTab ? \"deviation\" : \"association\");\n const payloads = contexts.map((context) =>\n buildOnDemandCitationPayload(onDemandCitationConfig, context),\n );\n\n onDemandCitationConfig.onContextsBuilt?.(contexts);\n onDemandCitationConfig.onPayloadsBuilt?.(payloads, contexts);\n\n if (onDemandCitationConfig.debug) {\n console.groupCollapsed(\"[CognitiveCompare:onDemandCitations]\");\n console.log(\"contexts\", contexts);\n console.log(\"payloads\", payloads);\n console.log(\"cacheEntries\", contexts.map((context) => getOnDemandCitationCacheEntry(context)));\n console.groupEnd();\n }\n\n if (\n onDemandCitationConfig.strategy === \"prefetchActiveTab\" ||\n onDemandCitationConfig.strategy === \"prefetchAllTabs\"\n ) {\n prefetchOnDemandCitationContexts(contexts).catch((error) => {\n if (onDemandCitationConfig.debug) {\n console.error(\"[CognitiveCompare:onDemandCitations] prefetch failed\", error);\n }\n });\n }\n\n return () => {\n if (onDemandCitationConfig.abortOnPopupClose) {\n abortOnDemandCitationContexts(contexts);\n }\n };\n }, [\n abortOnDemandCitationContexts,\n activeTab,\n cfg.tabs.deviation.key,\n cognitiveData,\n deviationData,\n docData,\n getOnDemandCitationCacheEntry,\n onDemandCitationConfig,\n open,\n prefetchOnDemandCitationContexts,\n referenceSectionTitle,\n sectionTitle,\n sourceNodeId,\n deviationKey,\n baseContentId,\n compareContentIds,\n treeData,\n ]);\n\n // ── Glow colour ────────────────────────────────────────────────────────────\n const glow = useMemo(() => {\n if (!badgeStyle)\n return { border: cfg.accentColor, shadow: `${cfg.accentColor}2E` }; // 2E ≈ 18% opacity\n const t = badgeStyle.badgeText;\n if (t === \"#9F1239\" || t === \"#B42318\")\n return { border: \"#E11D48\", shadow: \"rgba(225,29,72,0.15)\" };\n if (t === \"#1D4ED8\")\n return { border: \"#3B82F6\", shadow: \"rgba(59,130,246,0.15)\" };\n if (t === \"#A16207\")\n return { border: \"#F59E0B\", shadow: \"rgba(245,158,11,0.15)\" };\n return { border: cfg.accentColor, shadow: `${cfg.accentColor}2E` };\n }, [badgeStyle, cfg.accentColor]);\n\n useEffect(() => {\n if (!open || isCitationFullscreenOpen) return;\n const onMouseDown = (e: MouseEvent) => {\n if (\n popupRef.current?.contains(e.target as Node) ||\n anchorEl?.contains(e.target as Node)\n )\n return;\n onClose();\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [open, onClose, anchorEl, popupRef, isCitationFullscreenOpen]);\n\n const visibleTabs = !isMissingRationale\n ? [cfg.tabs.deviation, cfg.tabs.association]\n : [];\n\n const hasOnlyDeviationTab =\n visibleTabs.length === 1 &&\n visibleTabs[0].key === cfg.tabs.deviation.key;\n\n // Prevent popup open when only deviation exists\n if (hasOnlyDeviationTab) return null;\n\n if (!open || !cognitiveData) return null;\n\n const score = (activeTab === cfg.tabs.deviation.key ? deviationData?.cognitive_decisioning?.decision_strength : cognitiveData.relevance_score) ?? relevanceScore ?? 0;\n\n const decisioningRaw = cognitiveData.decisioning;\n const decisioningPoints = Array.isArray(decisioningRaw)\n ? decisioningRaw\n : typeof decisioningRaw === \"string\" && decisioningRaw.trim()\n ? [decisioningRaw]\n : [];\n const gapRaw = cognitiveData.gap;\n const gapPoints = Array.isArray(gapRaw)\n ? gapRaw\n : typeof gapRaw === \"string\" && gapRaw.trim()\n ? [gapRaw]\n : [];\n\n // ── Popup node ─────────────────────────────────────────────────────────────\n const arrowLeft = position?.arrowLeft ?? 60;\n\n const popupNode = (\n <Box\n ref={popupRef}\n sx={{\n position: \"fixed\",\n top: position?.top ?? -9999,\n left: position?.left ?? -9999,\n zIndex: 9999,\n width: `min(${POPUP_WIDTH}px, calc(100vw - ${VIEWPORT_MARGIN * 2}px))`,\n maxWidth: `calc(100vw - ${VIEWPORT_MARGIN * 2}px)`,\n boxSizing: \"border-box\",\n bgcolor: \"#FFFFFF\",\n borderRadius: \"14px\",\n border: `1.5px solid ${glow.border}`,\n boxShadow: `0px 8px 32px ${glow.shadow}, 0px 0px 0px 3px ${glow.shadow}`,\n overflow: \"visible\",\n display: isCitationFullscreenOpen ? \"none\" : \"flex\",\n flexDirection: \"column\",\n // maxHeight: \"60vh\",\n maxHeight: position?.maxHeight\n ? `min(60vh, ${position.maxHeight}px)`\n : \"60vh\",\n\n visibility: position ? \"visible\" : \"hidden\",\n pointerEvents: isCitationFullscreenOpen ? \"none\" : \"auto\",\n }}\n >\n {position &&\n (position.openAbove ? (\n <>\n <Box\n sx={{\n position: \"absolute\",\n bottom: -(ARROW_SIZE + 1),\n left: arrowLeft - ARROW_SIZE,\n width: 0,\n height: 0,\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderTop: `${ARROW_SIZE + 1}px solid ${glow.border}`,\n zIndex: 1,\n }}\n />\n <Box\n sx={{\n position: \"absolute\",\n bottom: -(ARROW_SIZE - 1),\n left: arrowLeft - ARROW_SIZE + 1,\n width: 0,\n height: 0,\n borderLeft: `${ARROW_SIZE - 1}px solid transparent`,\n borderRight: `${ARROW_SIZE - 1}px solid transparent`,\n borderTop: `${ARROW_SIZE}px solid #FFFFFF`,\n zIndex: 2,\n }}\n />\n </>\n ) : (\n <>\n <Box\n sx={{\n position: \"absolute\",\n top: -(ARROW_SIZE + 1),\n left: arrowLeft - ARROW_SIZE,\n width: 0,\n height: 0,\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE + 1}px solid ${glow.border}`,\n zIndex: 1,\n }}\n />\n <Box\n sx={{\n position: \"absolute\",\n top: -(ARROW_SIZE - 1),\n left: arrowLeft - ARROW_SIZE + 1,\n width: 0,\n height: 0,\n borderLeft: `${ARROW_SIZE - 1}px solid transparent`,\n borderRight: `${ARROW_SIZE - 1}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid #FFFFFF`,\n zIndex: 2,\n }}\n />\n </>\n ))}\n <Box\n sx={{\n px: 2.5,\n pt: 2,\n pb: 1.5,\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n gap: 2,\n flexWrap: { xs: \"wrap\", sm: \"nowrap\" },\n flexShrink: 0,\n }}\n >\n <Box sx={{ flex: { xs: \"1 1 100%\", sm: 1 }, minWidth: 0 }}>\n {(sectionTitle !== 'no counterpart' || referenceSectionTitle !== 'no counterpart') && (\n <Typography\n sx={{\n fontSize: \"16px\",\n fontWeight: 600,\n color: \"#101828\",\n lineHeight: 1.3,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n flexWrap: \"nowrap\",\n overflow: \"hidden\",\n width: \"100%\",\n }}\n >\n <Box\n component=\"span\"\n title={sectionTitle}\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: \"0 1 auto\",\n maxWidth: \"calc(50% - 16px)\",\n minWidth: 0,\n }}\n >\n {sectionTitle}\n </Box>\n <Box\n component=\"span\"\n sx={{ color: \"#667085\", fontWeight: 400, flexShrink: 0, mx: 0.5 }}\n >\n ↔\n </Box>\n <Box\n component=\"span\"\n title={referenceSectionTitle || \"Reference Section\"}\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n minWidth: 0,\n }}\n >\n {referenceSectionTitle || \"Reference Section\"}\n </Box>\n </Typography>\n )}\n <Box\n sx={{\n mt: 0.75,\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0.75,\n }}\n >\n <Typography\n sx={{\n fontSize: (sectionTitle !== 'no counterpart' || referenceSectionTitle !== 'no counterpart') ? \"13px\" : \"16px\",\n fontWeight: 400,\n color: \"#5928ED\",\n lineHeight: 1,\n }}\n >\n {\n Object.values(cfg.tabs).find((t) => t.key === activeTab)\n ?.subtitle\n }\n </Typography>\n </Box>\n </Box>\n\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1.5,\n flexShrink: 0,\n maxWidth: \"100%\",\n ml: { xs: \"auto\", sm: 0 },\n }}\n >\n <Box\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"5px\",\n px: 1.5,\n py: 0.5,\n borderRadius: \"20px\",\n bgcolor: \"#FFFFFF\",\n border: \"1px solid #5928ED\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"#5928ED\",\n maxWidth: \"100%\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n }}\n >\n <SparkleIcon />\n {cfg.decisionStrengthLabel} {score}%\n </Box>\n <IconButton\n onClick={onClose}\n size=\"small\"\n sx={{\n color: \"#667085\",\n width: 24,\n height: 24,\n \"&:hover\": { bgcolor: \"transparent\", color: \"#101828\" },\n }}\n >\n <X size={22} />\n </IconButton>\n </Box>\n </Box>\n\n {/* ── Tabs (flexShrink: 0 — never shrinks) ── */}\n {/* ── Tabs ── */}\n <Box\n sx={{\n display: \"flex\",\n borderBottom: \"1px solid #E4E7EC\",\n px: 2.5,\n flexShrink: 0,\n maxWidth: \"100%\",\n overflowX: \"auto\",\n }}\n >\n {visibleTabs.map((tab) => {\n const isActive = activeTab === tab.key;\n\n const isDeviationTab = tab.key === cfg.tabs.deviation.key;\n\n const shouldDisableDeviationSelection =\n visibleTabs.length > 1 &&\n isDeviationTab &&\n isLoading;\n\n const tabNode = (\n <Box\n key={tab.key}\n onClick={() => {\n if (shouldDisableDeviationSelection) return;\n setActiveTab(tab.key);\n }}\n sx={{\n pb: \"10px\",\n pt: \"4px\",\n mr: 3,\n px: 2,\n cursor: shouldDisableDeviationSelection\n ? \"not-allowed\"\n : \"pointer\",\n opacity: shouldDisableDeviationSelection ? 0.5 : 1,\n fontSize: \"14px\",\n fontWeight: isActive ? 600 : 400,\n color: isActive ? cfg.accentColor : \"#667085\",\n backgroundColor: isActive\n ? `${cfg.accentColor}14`\n : \"transparent\",\n borderBottom: isActive\n ? `2px solid ${cfg.accentColor}`\n : \"2px solid transparent\",\n transition: \"all 0.15s\",\n userSelect: \"none\",\n flexShrink: 0,\n }}\n >\n {tab.label}\n </Box>\n );\n\n return shouldDisableDeviationSelection ? (\n <Tooltip\n key={tab.key}\n title=\"Fetching deviation data\"\n arrow\n placement=\"top\"\n >\n <span>{tabNode}</span>\n </Tooltip>\n ) : (\n tabNode\n );\n })}\n </Box>\n {/* Content */}\n <Box\n sx={{\n flex: 1,\n minHeight: 0,\n overflowY: \"auto\",\n overflowX: \"auto\",\n maxWidth: \"100%\",\n boxSizing: \"border-box\",\n px: 2.5,\n py: 2,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 1.5,\n \"&::-webkit-scrollbar\": { width: \"6px\" },\n \"&::-webkit-scrollbar-track\": { background: \"transparent\" },\n \"&::-webkit-scrollbar-thumb\": {\n background: `${glow.border}55`,\n borderRadius: \"10px\",\n },\n \"&::-webkit-scrollbar-thumb:hover\": { background: glow.border },\n scrollbarWidth: \"thin\",\n scrollbarColor: `${glow.border}55 transparent`,\n }}\n >\n {activeTab === cfg.tabs.deviation.key ? (\n deviationData ?\n <>\n {(deviationData?.cognitive_decisioning?.decisioning_factors || [])?.length > 0 && (\n <CitationRenderer\n title=\"Decision Making Factors\"\n content={deviationData?.cognitive_decisioning?.decisioning_factors?.join(\"\\n\\n\")}\n citations={deviationData?.cognitive_decisioning?.citations}\n styles={resolvedMarkdownStyles} \n docData={docData} \n deviationData={deviationData}\n open={open} \n onCitationFullscreenChange={handleCitationFullscreenChange}\n tabKey=\"deviation\"\n sectionTitle={sectionTitle}\n referenceSectionTitle={referenceSectionTitle}\n sourceNodeId={sourceNodeId}\n deviationKey={deviationKey}\n baseContentId={baseContentId}\n compareContentIds={compareContentIds}\n />\n )}\n\n {(deviationData?.cognitive_decisioning?.gaps_in_decision || [])?.length > 0 && (\n <CitationRenderer\n title=\"Gaps in Decision\"\n content={deviationData?.cognitive_decisioning?.gaps_in_decision?.join(\"\\n\\n\")}\n citations={deviationData?.cognitive_decisioning?.citations}\n styles={resolvedMarkdownStyles}\n docData={docData}\n deviationData={deviationData}\n open={open}\n onCitationFullscreenChange={handleCitationFullscreenChange}\n tabKey=\"deviation\"\n sectionTitle={sectionTitle}\n referenceSectionTitle={referenceSectionTitle}\n sourceNodeId={sourceNodeId}\n deviationKey={deviationKey}\n baseContentId={baseContentId}\n compareContentIds={compareContentIds}\n />\n )}\n {(deviationData?.cognitive_decisioning?.decisioning_factors || [])?.length === 0 && (deviationData?.cognitive_decisioning?.gaps_in_decision || [])?.length === 0 && (\n <Box\n sx={{\n p: 2,\n bgcolor: \"#F8FAFC\",\n borderRadius: \"8px\",\n border: \"1px solid #E2E8F0\",\n }}\n >\n <Typography sx={{ fontSize: \"13px\", color: \"#64748B\" }}>\n No cognitive decisioning data available for this section.\n </Typography>\n </Box>\n )}\n </>:\n <CitationRenderer\n title={`Deviation Analysis`}\n content={`Deviation analysis content will appear here. This tab shows\n structural and semantic deviations identified between the two\n sections being compared.`}\n citations={{}}\n styles={resolvedMarkdownStyles} \n docData={docData} \n open={open} \n onCitationFullscreenChange={handleCitationFullscreenChange}\n tabKey=\"deviation\"\n sectionTitle={sectionTitle}\n referenceSectionTitle={referenceSectionTitle}\n sourceNodeId={sourceNodeId}\n deviationKey={deviationKey}\n baseContentId={baseContentId}\n compareContentIds={compareContentIds}\n />\n ) : (\n <>\n {decisioningPoints.length > 0 && (\n <CitationRenderer\n title={cfg.sectionTitles.decisioningFactors}\n content={decisioningPoints.join(\"\\n\\n\")}\n citations={cognitiveData.citations}\n styles={resolvedMarkdownStyles} \n open={open}\n docData={docData}\n onCitationFullscreenChange={handleCitationFullscreenChange}\n tabKey=\"association\"\n sectionTitle={sectionTitle}\n referenceSectionTitle={referenceSectionTitle}\n sourceNodeId={sourceNodeId}\n deviationKey={deviationKey}\n baseContentId={baseContentId}\n compareContentIds={compareContentIds}\n />\n )}\n\n {gapPoints.length > 0 && (\n <CitationRenderer\n title={cfg.sectionTitles.gaps}\n content={gapPoints.join(\"\\n\\n\")}\n citations={cognitiveData.citations}\n styles={resolvedMarkdownStyles}\n open={open}\n docData={docData}\n onCitationFullscreenChange={handleCitationFullscreenChange}\n tabKey=\"association\"\n sectionTitle={sectionTitle}\n referenceSectionTitle={referenceSectionTitle}\n sourceNodeId={sourceNodeId}\n deviationKey={deviationKey}\n baseContentId={baseContentId}\n compareContentIds={compareContentIds}\n />\n )}\n\n {decisioningPoints.length === 0 && gapPoints.length === 0 && (\n <Box\n sx={{\n p: 2,\n bgcolor: \"#F8FAFC\",\n borderRadius: \"8px\",\n border: \"1px solid #E2E8F0\",\n }}\n >\n {/* ── Dynamic empty state ── */}\n <Typography sx={{ fontSize: \"13px\", color: \"#64748B\" }}>\n {cfg.emptyStateMessage}\n </Typography>\n </Box>\n )}\n </>\n )}\n </Box>\n </Box>\n );\n\n return ReactDOM.createPortal(popupNode, document.body);\n};\n\nexport default CognitivePopup;\n"],"names":["toTextArray","value","Array","isArray","filter","item","trim","length","open","onClose","sectionTitle","referenceSectionTitle","cognitiveData","relevanceScore","anchorEl","badgeStyle","popupRef","position","markdownStyles","docData","popupConfig","deviationData","isLoading","sourceNodeId","deviationKey","baseContentId","compareContentIds","treeData","onDemandCitationConfig","prefetchOnDemandCitationContexts","abortOnDemandCitationContexts","getOnDemandCitationCacheEntry","useCompareContext","resolvedMarkdownStyles","SHARED_MARKDOWN_STYLES","cfg","useMemo","DEFAULT_POPUP_CONFIG","tabs","deviation","association","sectionTitles","isMissingRationale","activeTab","setActiveTab","useState","key","isCitationFullscreenOpen","setIsCitationFullscreenOpen","handleCitationFullscreenChange","useCallback","isFullscreen","useEffect","enabled","buildContextsForTab","tabKey","isDeviationTab","content","cognitive_decisioning","decisioning_factors","gaps_in_decision","decisioning","gap","buildOnDemandCitationContexts","requestId","popupNodeId","nodeId","section_id","staticCitations","citations","contexts","strategy","payloads","map","context","buildOnDemandCitationPayload","onContextsBuilt","onPayloadsBuilt","debug","console","groupCollapsed","log","groupEnd","catch","error","abortOnPopupClose","glow","border","accentColor","shadow","t","badgeText","onMouseDown","e","current","contains","target","document","addEventListener","removeEventListener","visibleTabs","score","decision_strength","relevance_score","decisioningRaw","decisioningPoints","gapRaw","gapPoints","arrowLeft","popupNode","jsxs","Box","ref","sx","top","left","zIndex","width","POPUP_WIDTH","VIEWPORT_MARGIN","maxWidth","boxSizing","bgcolor","borderRadius","boxShadow","overflow","display","flexDirection","maxHeight","visibility","pointerEvents","children","openAbove","Fragment","jsx","bottom","ARROW_SIZE","height","borderLeft","borderRight","borderTop","borderBottom","px","pt","pb","alignItems","justifyContent","flexWrap","xs","sm","flexShrink","flex","minWidth","Typography","fontSize","fontWeight","color","lineHeight","component","title","textOverflow","whiteSpace","mx","mt","Object","values","find","subtitle","ml","py","SparkleIcon","decisionStrengthLabel","IconButton","onClick","size","X","overflowX","tab","isActive","shouldDisableDeviationSelection","tabNode","mr","cursor","opacity","backgroundColor","transition","userSelect","label","Tooltip","arrow","placement","minHeight","overflowY","background","scrollbarWidth","scrollbarColor","CitationRenderer","join","styles","onCitationFullscreenChange","p","decisioningFactors","gaps","emptyStateMessage","ReactDOM","createPortal","body"],"mappings":"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"}
1
+ {"version":3,"file":"CognitivePopup.js","sources":["../../../../src/features/CognitiveCompare/CognitivePopup.tsx"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback } from \"react\";\nimport { Box, Typography, IconButton, Tooltip } from \"@mui/material\";\nimport { X } from \"lucide-react\";\nimport ReactDOM from \"react-dom\";\nimport SparkleIcon from \"../../assests/svg/SparkleIcon\";\nimport ReactMarkdown from \"react-markdown\";\nimport CitationAnchor from \"./CitationAnchor\";\nimport {\n CognitivePopupConfig,\n CognitivePopupProps,\n} from \"./CognitiveCompareTypes\";\nimport { DEFAULT_POPUP_CONFIG, SHARED_MARKDOWN_STYLES } from \"./CognitiveCompareConfig\";\nimport CitationRenderer from \"./CitationRenderer\";\n\n// ─── CognitivePopup ───────────────────────────────────────────────────────────\n\nconst POPUP_WIDTH = 1050;\nconst LEFT_OFFSET = 150;\nconst VIEWPORT_MARGIN = 12;\nconst ARROW_SIZE = 10;\n\nconst CognitivePopup: React.FC<\n CognitivePopupProps & { popupConfig?: CognitivePopupConfig }\n> = ({\n open,\n onClose,\n sectionTitle,\n referenceSectionTitle,\n cognitiveData,\n relevanceScore,\n anchorEl,\n badgeStyle,\n popupRef,\n position,\n markdownStyles,\n docData,\n popupConfig,\n deviationData = null,\n isLoading\n}) => {\n const resolvedMarkdownStyles = {\n ...SHARED_MARKDOWN_STYLES,\n ...markdownStyles,\n };\n const cfg = useMemo(() => ({\n ...DEFAULT_POPUP_CONFIG,\n ...popupConfig,\n tabs: {\n deviation: { ...DEFAULT_POPUP_CONFIG.tabs.deviation, ...popupConfig?.tabs?.deviation },\n association: { ...DEFAULT_POPUP_CONFIG.tabs.association, ...popupConfig?.tabs?.association },\n },\n sectionTitles: { ...DEFAULT_POPUP_CONFIG.sectionTitles, ...popupConfig?.sectionTitles },\n }), [popupConfig]);\n \n const isMissingRationale = (cognitiveData as any)?.isMissingRationale;\n const [activeTab, setActiveTab] = useState<string>(\n isMissingRationale ? cfg.tabs.deviation.key : cfg.tabs.association.key,\n );\n const [isCitationFullscreenOpen, setIsCitationFullscreenOpen] = useState(false);\n\n const handleCitationFullscreenChange = useCallback((isFullscreen: boolean) => {\n setIsCitationFullscreenOpen(isFullscreen);\n }, []);\n\n useEffect(() => {\n if (open) {\n setActiveTab(\n isMissingRationale ? cfg.tabs.deviation.key : cfg.tabs.association.key,\n );\n } else {\n setIsCitationFullscreenOpen(false);\n }\n }, [\n open,\n isMissingRationale,\n cfg.tabs.deviation.key,\n cfg.tabs.association.key,\n ]);\n // ── Glow colour ────────────────────────────────────────────────────────────\n const glow = useMemo(() => {\n if (!badgeStyle)\n return { border: cfg.accentColor, shadow: `${cfg.accentColor}2E` }; // 2E ≈ 18% opacity\n const t = badgeStyle.badgeText;\n if (t === \"#9F1239\" || t === \"#B42318\")\n return { border: \"#E11D48\", shadow: \"rgba(225,29,72,0.15)\" };\n if (t === \"#1D4ED8\")\n return { border: \"#3B82F6\", shadow: \"rgba(59,130,246,0.15)\" };\n if (t === \"#A16207\")\n return { border: \"#F59E0B\", shadow: \"rgba(245,158,11,0.15)\" };\n return { border: cfg.accentColor, shadow: `${cfg.accentColor}2E` };\n }, [badgeStyle, cfg.accentColor]);\n\n useEffect(() => {\n if (!open || isCitationFullscreenOpen) return;\n const onMouseDown = (e: MouseEvent) => {\n if (\n popupRef.current?.contains(e.target as Node) ||\n anchorEl?.contains(e.target as Node)\n )\n return;\n onClose();\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [open, onClose, anchorEl, popupRef, isCitationFullscreenOpen]);\n\n const visibleTabs = !isMissingRationale\n ? [cfg.tabs.deviation, cfg.tabs.association]\n : [];\n\n const hasOnlyDeviationTab =\n visibleTabs.length === 1 &&\n visibleTabs[0].key === cfg.tabs.deviation.key;\n\n // Prevent popup open when only deviation exists\n if (hasOnlyDeviationTab) return null;\n\n if (!open || !cognitiveData) return null;\n\n const score = (activeTab === cfg.tabs.deviation.key ? deviationData?.cognitive_decisioning?.decision_strength : cognitiveData.relevance_score) ?? relevanceScore ?? 0;\n\n const decisioningRaw = cognitiveData.decisioning;\n const decisioningPoints = Array.isArray(decisioningRaw)\n ? decisioningRaw\n : typeof decisioningRaw === \"string\" && decisioningRaw.trim()\n ? [decisioningRaw]\n : [];\n const gapRaw = cognitiveData.gap;\n const gapPoints = Array.isArray(gapRaw)\n ? gapRaw\n : typeof gapRaw === \"string\" && gapRaw.trim()\n ? [gapRaw]\n : [];\n\n // ── Popup node ─────────────────────────────────────────────────────────────\n const calculatedLeft = position ? position.left - LEFT_OFFSET : -9999;\n const al = (position?.arrowLeft ?? 60) + LEFT_OFFSET;\n\n const popupNode = (\n <Box\n ref={popupRef}\n sx={{\n position: \"fixed\",\n top: position?.top ?? -9999,\n left: calculatedLeft,\n zIndex: 9999,\n width: `${POPUP_WIDTH}px`, \n maxWidth: `min(${POPUP_WIDTH}px, calc(100vw - ${calculatedLeft > 0 ? calculatedLeft : 0}px - ${VIEWPORT_MARGIN}px))`,\n bgcolor: \"#FFFFFF\",\n borderRadius: \"14px\",\n border: `1.5px solid ${glow.border}`,\n boxShadow: `0px 8px 32px ${glow.shadow}, 0px 0px 0px 3px ${glow.shadow}`,\n overflow: \"visible\",\n display: \"flex\",\n flexDirection: \"column\",\n // maxHeight: \"60vh\",\n maxHeight: position?.maxHeight\n ? `min(60vh, ${position.maxHeight}px)`\n : \"60vh\",\n\n visibility: !isCitationFullscreenOpen && position ? \"visible\" : \"hidden\",\n pointerEvents: isCitationFullscreenOpen ? \"none\" : \"auto\",\n }}\n >\n {position &&\n (position.openAbove ? (\n <>\n <Box\n sx={{\n position: \"absolute\",\n bottom: -(ARROW_SIZE + 1),\n left: al - ARROW_SIZE,\n width: 0,\n height: 0,\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderTop: `${ARROW_SIZE + 1}px solid ${glow.border}`,\n zIndex: 1,\n }}\n />\n <Box\n sx={{\n position: \"absolute\",\n bottom: -(ARROW_SIZE - 1),\n left: al - ARROW_SIZE + 1,\n width: 0,\n height: 0,\n borderLeft: `${ARROW_SIZE - 1}px solid transparent`,\n borderRight: `${ARROW_SIZE - 1}px solid transparent`,\n borderTop: `${ARROW_SIZE}px solid #FFFFFF`,\n zIndex: 2,\n }}\n />\n </>\n ) : (\n <>\n <Box\n sx={{\n position: \"absolute\",\n top: -(ARROW_SIZE + 1),\n left: al - ARROW_SIZE,\n width: 0,\n height: 0,\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE + 1}px solid ${glow.border}`,\n zIndex: 1,\n }}\n />\n <Box\n sx={{\n position: \"absolute\",\n top: -(ARROW_SIZE - 1),\n left: al - ARROW_SIZE + 1,\n width: 0,\n height: 0,\n borderLeft: `${ARROW_SIZE - 1}px solid transparent`,\n borderRight: `${ARROW_SIZE - 1}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid #FFFFFF`,\n zIndex: 2,\n }}\n />\n </>\n ))}\n <Box\n sx={{\n px: 2.5,\n pt: 2,\n pb: 1.5,\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n gap: 2,\n flexShrink: 0,\n }}\n >\n <Box sx={{ flex: 1, minWidth: 0 }}>\n {(sectionTitle !== 'no counterpart' || referenceSectionTitle !== 'no counterpart') && (\n <Typography\n sx={{\n fontSize: \"16px\",\n fontWeight: 600,\n color: \"#101828\",\n lineHeight: 1.3,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n flexWrap: \"nowrap\",\n overflow: \"hidden\",\n width: \"100%\",\n }}\n >\n <Box\n component=\"span\"\n title={sectionTitle}\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: \"0 1 auto\",\n maxWidth: \"calc(50% - 16px)\",\n minWidth: 0,\n }}\n >\n {sectionTitle}\n </Box>\n <Box\n component=\"span\"\n sx={{ color: \"#667085\", fontWeight: 400, flexShrink: 0, mx: 0.5 }}\n >\n ↔\n </Box>\n <Box\n component=\"span\"\n title={referenceSectionTitle || \"Reference Section\"}\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n minWidth: 0,\n }}\n >\n {referenceSectionTitle || \"Reference Section\"}\n </Box>\n </Typography>\n )}\n <Box\n sx={{\n mt: 0.75,\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0.75,\n }}\n >\n <Typography\n sx={{\n fontSize: (sectionTitle !== 'no counterpart' || referenceSectionTitle !== 'no counterpart') ? \"13px\" : \"16px\",\n fontWeight: 400,\n color: \"#5928ED\",\n lineHeight: 1,\n }}\n >\n {\n Object.values(cfg.tabs).find((t) => t.key === activeTab)\n ?.subtitle\n }\n </Typography>\n </Box>\n </Box>\n\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1.5,\n flexShrink: 0,\n }}\n >\n <Box\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"5px\",\n px: 1.5,\n py: 0.5,\n borderRadius: \"20px\",\n bgcolor: \"#FFFFFF\",\n border: \"1px solid #5928ED\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"#5928ED\",\n }}\n >\n <SparkleIcon />\n {cfg.decisionStrengthLabel} {score}%\n </Box>\n <IconButton\n onClick={onClose}\n size=\"small\"\n sx={{\n color: \"#667085\",\n width: 24,\n height: 24,\n \"&:hover\": { bgcolor: \"transparent\", color: \"#101828\" },\n }}\n >\n <X size={22} />\n </IconButton>\n </Box>\n </Box>\n\n {/* ── Tabs (flexShrink: 0 — never shrinks) ── */}\n {/* ── Tabs ── */}\n <Box\n sx={{\n display: \"flex\",\n borderBottom: \"1px solid #E4E7EC\",\n px: 2.5,\n flexShrink: 0,\n }}\n >\n {visibleTabs.map((tab) => {\n const isActive = activeTab === tab.key;\n\n const isDeviationTab = tab.key === cfg.tabs.deviation.key;\n\n const shouldDisableDeviationSelection =\n visibleTabs.length > 1 &&\n isDeviationTab &&\n isLoading;\n\n const tabNode = (\n <Box\n key={tab.key}\n onClick={() => {\n if (shouldDisableDeviationSelection) return;\n setActiveTab(tab.key);\n }}\n sx={{\n pb: \"10px\",\n pt: \"4px\",\n mr: 3,\n px: 2,\n cursor: shouldDisableDeviationSelection\n ? \"not-allowed\"\n : \"pointer\",\n opacity: shouldDisableDeviationSelection ? 0.5 : 1,\n fontSize: \"14px\",\n fontWeight: isActive ? 600 : 400,\n color: isActive ? cfg.accentColor : \"#667085\",\n backgroundColor: isActive\n ? `${cfg.accentColor}14`\n : \"transparent\",\n borderBottom: isActive\n ? `2px solid ${cfg.accentColor}`\n : \"2px solid transparent\",\n transition: \"all 0.15s\",\n userSelect: \"none\",\n }}\n >\n {tab.label}\n </Box>\n );\n\n return shouldDisableDeviationSelection ? (\n <Tooltip\n key={tab.key}\n title=\"Fetching deviation data\"\n arrow\n placement=\"top\"\n >\n <span>{tabNode}</span>\n </Tooltip>\n ) : (\n tabNode\n );\n })}\n </Box>\n {/* Content */}\n <Box\n sx={{\n flex: 1,\n minHeight: 0,\n overflowY: \"auto\",\n px: 2.5,\n py: 2,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 1.5,\n \"&::-webkit-scrollbar\": { width: \"6px\" },\n \"&::-webkit-scrollbar-track\": { background: \"transparent\" },\n \"&::-webkit-scrollbar-thumb\": {\n background: `${glow.border}55`,\n borderRadius: \"10px\",\n },\n \"&::-webkit-scrollbar-thumb:hover\": { background: glow.border },\n scrollbarWidth: \"thin\",\n scrollbarColor: `${glow.border}55 transparent`,\n }}\n >\n {activeTab === cfg.tabs.deviation.key ? (\n deviationData ?\n <>\n {(deviationData?.cognitive_decisioning?.decisioning_factors || [])?.length > 0 && (\n <CitationRenderer\n title=\"Decision Making Factors\"\n content={deviationData?.cognitive_decisioning?.decisioning_factors?.join(\"\\n\\n\")}\n citations={deviationData?.cognitive_decisioning?.citations}\n styles={resolvedMarkdownStyles} \n docData={docData} \n deviationData={deviationData}\n open={open} \n onCitationFullscreenChange={handleCitationFullscreenChange}\n />\n )}\n\n {(deviationData?.cognitive_decisioning?.gaps_in_decision || [])?.length > 0 && (\n <CitationRenderer\n title=\"Gaps in Decision\"\n content={deviationData?.cognitive_decisioning?.gaps_in_decision?.join(\"\\n\\n\")}\n citations={deviationData?.cognitive_decisioning?.citations}\n styles={resolvedMarkdownStyles}\n docData={docData}\n deviationData={deviationData}\n open={open}\n onCitationFullscreenChange={handleCitationFullscreenChange}\n />\n )}\n {(deviationData?.cognitive_decisioning?.decisioning_factors || [])?.length === 0 && (deviationData?.cognitive_decisioning?.gaps_in_decision || [])?.length === 0 && (\n <Box\n sx={{\n p: 2,\n bgcolor: \"#F8FAFC\",\n borderRadius: \"8px\",\n border: \"1px solid #E2E8F0\",\n }}\n >\n <Typography sx={{ fontSize: \"13px\", color: \"#64748B\" }}>\n No cognitive decisioning data available for this section.\n </Typography>\n </Box>\n )}\n </>:\n <CitationRenderer\n title={`Deviation Analysis`}\n content={`Deviation analysis content will appear here. This tab shows\n structural and semantic deviations identified between the two\n sections being compared.`}\n citations={{}}\n styles={resolvedMarkdownStyles} \n docData={docData} \n open={open} \n onCitationFullscreenChange={handleCitationFullscreenChange}\n />\n ) : (\n <>\n {decisioningPoints.length > 0 && (\n <CitationRenderer\n title={cfg.sectionTitles.decisioningFactors}\n content={decisioningPoints.join(\"\\n\\n\")}\n citations={cognitiveData.citations}\n styles={resolvedMarkdownStyles} \n open={open}\n docData={docData}\n onCitationFullscreenChange={handleCitationFullscreenChange}\n />\n )}\n\n {gapPoints.length > 0 && (\n <CitationRenderer\n title={cfg.sectionTitles.gaps}\n content={gapPoints.join(\"\\n\\n\")}\n citations={cognitiveData.citations}\n styles={resolvedMarkdownStyles}\n open={open}\n docData={docData}\n onCitationFullscreenChange={handleCitationFullscreenChange}\n />\n )}\n\n {decisioningPoints.length === 0 && gapPoints.length === 0 && (\n <Box\n sx={{\n p: 2,\n bgcolor: \"#F8FAFC\",\n borderRadius: \"8px\",\n border: \"1px solid #E2E8F0\",\n }}\n >\n {/* ── Dynamic empty state ── */}\n <Typography sx={{ fontSize: \"13px\", color: \"#64748B\" }}>\n {cfg.emptyStateMessage}\n </Typography>\n </Box>\n )}\n </>\n )}\n </Box>\n </Box>\n );\n\n return ReactDOM.createPortal(popupNode, document.body);\n};\n\nexport default CognitivePopup;\n"],"names":["ARROW_SIZE","open","onClose","sectionTitle","referenceSectionTitle","cognitiveData","relevanceScore","anchorEl","badgeStyle","popupRef","position","markdownStyles","docData","popupConfig","deviationData","isLoading","resolvedMarkdownStyles","SHARED_MARKDOWN_STYLES","cfg","useMemo","DEFAULT_POPUP_CONFIG","tabs","deviation","association","sectionTitles","isMissingRationale","activeTab","setActiveTab","useState","key","isCitationFullscreenOpen","setIsCitationFullscreenOpen","handleCitationFullscreenChange","useCallback","isFullscreen","useEffect","glow","border","accentColor","shadow","t","badgeText","onMouseDown","e","current","contains","target","document","addEventListener","removeEventListener","visibleTabs","length","score","cognitive_decisioning","decision_strength","relevance_score","decisioningRaw","decisioning","decisioningPoints","Array","isArray","trim","gapRaw","gap","gapPoints","calculatedLeft","left","al","arrowLeft","popupNode","jsxs","Box","ref","sx","top","zIndex","width","maxWidth","bgcolor","borderRadius","boxShadow","overflow","display","flexDirection","maxHeight","visibility","pointerEvents","children","openAbove","Fragment","jsx","bottom","height","borderLeft","borderRight","borderTop","borderBottom","px","pt","pb","alignItems","justifyContent","flexShrink","flex","minWidth","Typography","fontSize","fontWeight","color","lineHeight","flexWrap","component","title","textOverflow","whiteSpace","mx","mt","Object","values","find","subtitle","py","SparkleIcon","decisionStrengthLabel","IconButton","onClick","size","X","map","tab","isActive","isDeviationTab","shouldDisableDeviationSelection","tabNode","mr","cursor","opacity","backgroundColor","transition","userSelect","label","Tooltip","arrow","placement","minHeight","overflowY","background","scrollbarWidth","scrollbarColor","decisioning_factors","CitationRenderer","content","join","citations","styles","onCitationFullscreenChange","gaps_in_decision","p","decisioningFactors","gaps","emptyStateMessage","ReactDOM","createPortal","body"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");const t=e.createContext(null),r=t.Provider;exports.CompareContextProvider=r,exports.useCompareContext=()=>{const r=e.useContext(t);if(!r)throw new Error("useCompareContext must be used within CompareContextProvider");return r},exports.useOptionalCompareContext=()=>e.useContext(t);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");const r=e.createContext(null),t=r.Provider;exports.CompareContextProvider=t,exports.useCompareContext=()=>{const t=e.useContext(r);if(!t)throw new Error("useCompareContext must be used within CompareContextProvider");return t};
2
2
  //# sourceMappingURL=CompareContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CompareContext.js","sources":["../../../../src/features/CognitiveCompare/CompareContext.tsx"],"sourcesContent":["import React, { createContext, useContext } from \"react\";\nimport {\n OnDemandCitationCacheEntry,\n OnDemandCitationContext,\n CognitiveCompareOnDemandCitationConfig,\n GptWebCitationConfig,\n IDisplayConfig,\n SectionBlock,\n StyleVariant,\n} from \"./CognitiveCompareTypes\";\n\nexport type UnifiedNumbering = {\n leftNums: Map<string, number>;\n rightNums: Map<string, string>;\n};\n\nexport type CompareContextValue = {\n isGuidelineMode: boolean;\n maintainRelativeOrder: boolean;\n showDeviationBadges: boolean;\n isProposingFix?: boolean;\n proposingFixNodeId?: string;\n isRedlineFlow?: boolean;\n isSideBySide: boolean;\n activeSideBySideSection: number | string | null;\n scrollSyncLocked: boolean;\n toggleScrollSyncLocked: (e?: React.MouseEvent) => void;\n summaryPopupAnchorEl: HTMLElement | null;\n connectedSections: Set<number | string>;\n proposedSections: SectionBlock[];\n existingSections: SectionBlock[];\n deviationNumberRegistry: Record<string, number>;\n deviationParentRegistry: Record<string, unknown>;\n treeData: Record<string, any> | null | undefined;\n displayConfig: IDisplayConfig;\n resolvedMarkdownStyles: Record<string, any>;\n unifiedNumbering: UnifiedNumbering;\n expandedSections: Record<string, boolean>;\n expandedSubSections: Record<string, boolean>;\n setExpandedSubSections: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;\n getSectionCompareStyle: (idx: number, side?: \"left\" | \"right\") => StyleVariant | null;\n getSubSectionCompareStyle: (path: string) => StyleVariant | null;\n getBadgeRef: (side: \"left\" | \"right\", id: string) => React.RefObject<HTMLDivElement>;\n getSectionRowRef: (idx: string | number) => React.RefObject<HTMLDivElement>;\n getSubSectionRef: (side: \"left\" | \"right\", path: string) => React.RefObject<HTMLDivElement>;\n sectionLeftRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n sectionRightRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n sectionRowRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n sectionRightRowRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n subSectionLeftRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n subSectionRightRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n lhsBadgeRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n rhsBadgeRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n openMoreFunctionsPopup: (\n e: React.MouseEvent,\n baseSec: SectionBlock,\n isOrphan: boolean,\n refSec: SectionBlock,\n id: string | number,\n style?: StyleVariant | null,\n ) => void;\n handleOpenSummaryPopup: (\n e: React.MouseEvent,\n actionId: string,\n isOrphan: boolean,\n summary: any,\n displayImpact?: boolean,\n ) => void;\n openSummaryPopup: (\n e: React.MouseEvent,\n actionId: string,\n isOrphan: boolean,\n summary: any,\n ) => void;\n handleCloseSummaryPopup: () => void;\n toggleSection: (idx: number, columnKey: \"left\" | \"right\") => void;\n handleSubSectionToggle: (keyPath: string) => void;\n renderSubSectionAccordion: (args: {\n section: SectionBlock;\n keyPath: string;\n depth: number;\n columnKey: \"left\" | \"right\";\n parentNodeId: string;\n sectionOffset?: number;\n rhsOrphanVisualIndexes?: ReadonlyMap<string, number>;\n }) => React.ReactNode;\n resetSideBySide: () => void;\n setConnectedSections: React.Dispatch<React.SetStateAction<Set<number | string>>>;\n setConnectedLines: React.Dispatch<React.SetStateAction<any[]>>;\n cachedConnectedPositions: React.MutableRefObject<any[]>;\n showDeviationNavigation: Record<string, any>;\n showOpenNodeRef: React.MutableRefObject<string | undefined>;\n deviationNodeIdToView?: string | undefined;\n deviationTargetParentId?: string | null;\n guidelinesData?: any;\n gptWebCitationConfig?: GptWebCitationConfig;\n onDemandCitationConfig?: CognitiveCompareOnDemandCitationConfig;\n onDemandCitationCacheVersion: number;\n getOnDemandCitationCacheKey: (context: OnDemandCitationContext) => string;\n getOnDemandCitationCacheEntry: (\n contextOrKey: OnDemandCitationContext | string,\n ) => OnDemandCitationCacheEntry | undefined;\n fetchOnDemandCitationContext: (\n context: OnDemandCitationContext,\n ) => Promise<any>;\n prefetchOnDemandCitationContexts: (\n contexts: OnDemandCitationContext[],\n ) => Promise<void>;\n abortOnDemandCitationContexts: (\n contexts: OnDemandCitationContext[],\n ) => void;\n};\n\nconst CompareContext = createContext<CompareContextValue | null>(null);\n\nexport const CompareContextProvider = CompareContext.Provider;\n\nexport const useOptionalCompareContext = () => useContext(CompareContext);\n\nexport const useCompareContext = () => {\n const context = useContext(CompareContext);\n if (!context) {\n throw new Error(\"useCompareContext must be used within CompareContextProvider\");\n }\n return context;\n};\n"],"names":["CompareContext","createContext","CompareContextProvider","Provider","context","useContext","Error"],"mappings":"2FAiHA,MAAMA,EAAiBC,EAAAA,cAA0C,MAEpDC,EAAyBF,EAAeG,oEAIpB,KACzB,MAAAC,EAAUC,aAAWL,GAC3B,IAAKI,EACG,MAAA,IAAIE,MAAM,gEAEX,OAAAF,qCAPgC,IAAMC,EAAAA,WAAWL"}
1
+ {"version":3,"file":"CompareContext.js","sources":["../../../../src/features/CognitiveCompare/CompareContext.tsx"],"sourcesContent":["import React, { createContext, useContext } from \"react\";\nimport { DeviationAnalysisStatus, GptWebCitationConfig, IDisplayConfig, SectionBlock, StyleVariant } from \"./CognitiveCompareTypes\";\n\nexport type UnifiedNumbering = {\n leftNums: Map<string, number>;\n rightNums: Map<string, string>;\n};\n\nexport type CompareContextValue = {\n isGuidelineMode: boolean;\n maintainRelativeOrder: boolean;\n showDeviationBadges: boolean;\n isProposingFix?: boolean;\n proposingFixNodeId?: string;\n isRedlineFlow?: boolean;\n isSideBySide: boolean;\n activeSideBySideSection: number | string | null;\n scrollSyncLocked: boolean;\n toggleScrollSyncLocked: (e?: React.MouseEvent) => void;\n summaryPopupAnchorEl: HTMLElement | null;\n connectedSections: Set<number | string>;\n proposedSections: SectionBlock[];\n existingSections: SectionBlock[];\n deviationNumberRegistry: Record<string, number>;\n deviationParentRegistry: Record<string, unknown>;\n treeData: Record<string, any> | null | undefined;\n displayConfig: IDisplayConfig;\n deviationAnalysisStatus: DeviationAnalysisStatus;\n resolvedMarkdownStyles: Record<string, any>;\n unifiedNumbering: UnifiedNumbering;\n expandedSections: Record<string, boolean>;\n expandedSubSections: Record<string, boolean>;\n setExpandedSubSections: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;\n getSectionCompareStyle: (idx: number, side?: \"left\" | \"right\") => StyleVariant | null;\n getSubSectionCompareStyle: (path: string) => StyleVariant | null;\n getBadgeRef: (side: \"left\" | \"right\", id: string) => React.RefObject<HTMLDivElement>;\n getSectionRowRef: (idx: string | number) => React.RefObject<HTMLDivElement>;\n getSubSectionRef: (side: \"left\" | \"right\", path: string) => React.RefObject<HTMLDivElement>;\n sectionLeftRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n sectionRightRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n sectionRowRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n sectionRightRowRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n subSectionLeftRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n subSectionRightRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n lhsBadgeRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n rhsBadgeRefs: React.MutableRefObject<Record<string | number, React.RefObject<HTMLDivElement>>>;\n openMoreFunctionsPopup: (\n e: React.MouseEvent,\n baseSec: SectionBlock,\n isOrphan: boolean,\n refSec: SectionBlock,\n id: string | number,\n style?: StyleVariant | null,\n ) => void;\n handleOpenSummaryPopup: (\n e: React.MouseEvent,\n actionId: string,\n isOrphan: boolean,\n summary: any,\n displayImpact?: boolean,\n ) => void;\n openSummaryPopup: (\n e: React.MouseEvent,\n actionId: string,\n isOrphan: boolean,\n summary: any,\n ) => void;\n handleCloseSummaryPopup: () => void;\n toggleSection: (idx: number, columnKey: \"left\" | \"right\") => void;\n handleSubSectionToggle: (keyPath: string) => void;\n renderSubSectionAccordion: (args: {\n section: SectionBlock;\n keyPath: string;\n depth: number;\n columnKey: \"left\" | \"right\";\n parentNodeId: string;\n sectionOffset?: number;\n rhsOrphanVisualIndexes?: ReadonlyMap<string, number>;\n }) => React.ReactNode;\n resetSideBySide: () => void;\n setConnectedSections: React.Dispatch<React.SetStateAction<Set<number | string>>>;\n setConnectedLines: React.Dispatch<React.SetStateAction<any[]>>;\n cachedConnectedPositions: React.MutableRefObject<any[]>;\n showDeviationNavigation: Record<string, any>;\n showOpenNodeRef: React.MutableRefObject<string | undefined>;\n deviationNodeIdToView?: string | undefined;\n deviationTargetParentId?: string | null;\n guidelinesData?: any;\n gptWebCitationConfig?: GptWebCitationConfig;\n};\n\nconst CompareContext = createContext<CompareContextValue | null>(null);\n\nexport const CompareContextProvider = CompareContext.Provider;\n\nexport const useCompareContext = () => {\n const context = useContext(CompareContext);\n if (!context) {\n throw new Error(\"useCompareContext must be used within CompareContextProvider\");\n }\n return context;\n};\n"],"names":["CompareContext","createContext","CompareContextProvider","Provider","context","useContext","Error"],"mappings":"2FA2FA,MAAMA,EAAiBC,EAAAA,cAA0C,MAEpDC,EAAyBF,EAAeG,oEAEpB,KACzB,MAAAC,EAAUC,aAAWL,GAC3B,IAAKI,EACG,MAAA,IAAIE,MAAM,gEAEX,OAAAF"}