@viswa-test/test-citation 0.0.390 → 0.0.391
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/features/CognitiveCompare/CitationAnchor.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CitationAnchor.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CitationRenderer.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CitationRenderer.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitivePopup.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitivePopup.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CompareContext.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CompareContext.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
- package/dist/cjs/features/PdfViewer/PdfToolbar.js +1 -1
- package/dist/cjs/features/PdfViewer/PdfToolbar.js.map +1 -1
- package/dist/cjs/features/PdfViewer/PdfViewer.css.js +1 -1
- package/dist/cjs/features/PdfViewer/PdfViewer.js +1 -1
- package/dist/cjs/features/PdfViewer/PdfViewer.js.map +1 -1
- package/dist/cjs/features/PdfViewer/rotationManager.js +1 -1
- package/dist/cjs/features/PdfViewer/rotationManager.js.map +1 -1
- package/dist/cjs/features/PdfViewer/usePdfHighlight.js +1 -1
- package/dist/cjs/features/PdfViewer/usePdfHighlight.js.map +1 -1
- package/dist/cjs/features/PdfViewer/zoomStateManager.js +2 -0
- package/dist/cjs/features/PdfViewer/zoomStateManager.js.map +1 -0
- package/dist/cjs/features/SegmentReviewComponents/CognitiveScoreBadge.js +1 -1
- package/dist/cjs/features/SegmentReviewComponents/CognitiveScoreBadge.js.map +1 -1
- package/dist/cjs/features/SegmentReviewComponents/reviewStepAdapters.js +1 -1
- package/dist/cjs/features/SegmentReviewComponents/reviewStepAdapters.js.map +1 -1
- package/dist/features/CognitiveCompare/CitationAnchor.js +1 -1
- package/dist/features/CognitiveCompare/CitationAnchor.js.map +1 -1
- package/dist/features/CognitiveCompare/CitationRenderer.js +1 -1
- package/dist/features/CognitiveCompare/CitationRenderer.js.map +1 -1
- package/dist/features/CognitiveCompare/CognitiveCompare.js +1 -1
- package/dist/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
- package/dist/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
- package/dist/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
- package/dist/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
- package/dist/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
- package/dist/features/CognitiveCompare/CognitivePopup.js +1 -1
- package/dist/features/CognitiveCompare/CognitivePopup.js.map +1 -1
- package/dist/features/CognitiveCompare/CompareContext.js +1 -1
- package/dist/features/CognitiveCompare/CompareContext.js.map +1 -1
- package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
- package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
- package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
- package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
- package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
- package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
- package/dist/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
- package/dist/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
- package/dist/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
- package/dist/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
- package/dist/features/CognitiveCompare/components/SectionAccordion.js +1 -1
- package/dist/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
- package/dist/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
- package/dist/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
- package/dist/features/CognitiveCompare/components/SvgConnectors.js +1 -1
- package/dist/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
- package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/useCompareData.js +1 -1
- package/dist/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
- package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
- package/dist/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
- package/dist/features/PdfViewer/PdfToolbar.js +1 -1
- package/dist/features/PdfViewer/PdfToolbar.js.map +1 -1
- package/dist/features/PdfViewer/PdfViewer.css.js +1 -1
- package/dist/features/PdfViewer/PdfViewer.js +1 -1
- package/dist/features/PdfViewer/PdfViewer.js.map +1 -1
- package/dist/features/PdfViewer/rotationManager.js +1 -1
- package/dist/features/PdfViewer/rotationManager.js.map +1 -1
- package/dist/features/PdfViewer/usePdfHighlight.js +1 -1
- package/dist/features/PdfViewer/usePdfHighlight.js.map +1 -1
- package/dist/features/PdfViewer/zoomStateManager.js +2 -0
- package/dist/features/PdfViewer/zoomStateManager.js.map +1 -0
- package/dist/features/SegmentReviewComponents/CognitiveScoreBadge.js +1 -1
- package/dist/features/SegmentReviewComponents/CognitiveScoreBadge.js.map +1 -1
- package/dist/features/SegmentReviewComponents/reviewStepAdapters.js +1 -1
- package/dist/features/SegmentReviewComponents/reviewStepAdapters.js.map +1 -1
- package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts +0 -2
- package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts +1 -8
- package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts +3 -12
- package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts +0 -12
- package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitivePopup.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CompareContext.d.ts +2 -9
- package/dist/types/features/CognitiveCompare/CompareContext.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/Guidelines/components/GuidelinePanel.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/Guidelines/components/WebGptPanel.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts +1 -14
- package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/LHSSectionRow.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/RHSSectionRow.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/SectionAccordion.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/SubSectionAccordion.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts +3 -2
- package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts +1 -2
- package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useLinesCalculator.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useSideBySide.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/PdfToolbar.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/PdfViewer.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/rotationManager.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/usePdfHighlight.d.ts +1 -2
- package/dist/types/features/PdfViewer/usePdfHighlight.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/zoomStateManager.d.ts +21 -0
- package/dist/types/features/PdfViewer/zoomStateManager.d.ts.map +1 -0
- package/package.json +4 -4
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const n="#3730A3",l=12,o=
|
|
1
|
+
const n="#3730A3",l=12,o=680,a=12,t=10,e="Contract Comparison",i={isLoading:!1,open:!1,sectionTitle:"",refSectionTitle:"",cognitiveData:null,anchorEl:null,sectionAnchorEl:null,badgeStyle:null,sectionIdx:null,isOrphan:!1,docData:null,deviationData:null},c={open:!1,anchorEl:null,summary:"",markdownStyles:{},displayImpact:!1};export{t as ARROW_SIZE,e as DEFAULT_COMPONENT_HEADER_TEXT,n as DEFAULT_DEVIAION_COLOR,i as EMPTY_SECTION_POPUP_STATE,c as EMPTY_SUMMARY_POPUP_STATE,l as POPUP_GAP,o as POPUP_WIDTH,a as VIEWPORT_MARGIN};
|
|
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 =
|
|
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":["DEFAULT_DEVIAION_COLOR","POPUP_GAP","POPUP_WIDTH","VIEWPORT_MARGIN","ARROW_SIZE","DEFAULT_COMPONENT_HEADER_TEXT","EMPTY_SECTION_POPUP_STATE","isLoading","open","sectionTitle","refSectionTitle","cognitiveData","anchorEl","sectionAnchorEl","badgeStyle","sectionIdx","isOrphan","docData","deviationData","EMPTY_SUMMARY_POPUP_STATE","summary","markdownStyles","displayImpact"],"mappings":"AAEO,MAAMA,EAAyB,UAEzBC,EAAY,GACZC,EAAc,IACdC,EAAkB,GAClBC,EAAa,GAIbC,EAAgC,sBAChCC,EAA+C,CAC1DC,WAAW,EACXC,MAAM,EACNC,aAAc,GACdC,gBAAiB,GACjBC,cAAe,KACfC,SAAU,KACVC,gBAAiB,KACjBC,WAAY,KACZC,WAAY,KACZC,UAAU,EACVC,QAAS,KACTC,cAAe,MAGJC,EAA8C,CACzDX,MAAM,EACNI,SAAU,KACVQ,QAAS,GACTC,eAAgB,CAAC,EACjBC,eAAe"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{DEFAULT_DEVIAION_COLOR as t}from"./CognitiveCompareConstants.js";import{normalizeRedlineMarkdown as e}from"./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=({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(", ")},i=(t,e)=>{if(null==t?.selfIndex)return!1;return 1===(e||[]).filter(e=>Array.isArray(e?.refIndexes)&&e.refIndexes.includes(t.selfIndex)).length},l=(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)},a=(t,e,r,o={})=>{const s=l(t,e,r,o),i=s[0]?.data||{},a=s[0]?.attributes||null;return{title:n(i?.title||""),content:n(i?.content||""),change_history:n(i?.change_history||""),attributes:a,subsections:i?.subsections||[],contentId:s[0]?.contentId,allItems:s}},u=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"}};function c(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)}}function d(t,e){let n;return function(...r){const o=this;clearTimeout(n),n=setTimeout(()=>t.apply(o,r),e)}}const f=(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},g="::",p=t=>{if(!t)return!0;const e=t.trim().toLowerCase();return e.includes("no equivalent")||"n/a"===e||"na"===e||"none"===e},h=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},b=t=>"string"==typeof t&&t?t.replace(/<\/?(updated|deleted|changed|change)\b[^>]*>/gi,""):"",m=(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}},v=(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=m(t,n),s=m(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],u=o.ends[l];return void 0===a||void 0===u?null:{start:a,end:u}},y=(t,e)=>{const n=v(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=v(t,e,!0);if(n)return n}return null},_=(t,r,o)=>{const s=new Map;if(!r)return s;const i=t=>{const r=n(t||"").replace(/\\n/g,"\n");return h(r)?b(e(r)):r};return(t||[]).forEach(t=>{const e=new Map,n=t=>{if(!t)return;const s=i(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],u=i(a);if(!u||p(a)||!v(s,u))return;const c=`${l}::${t}`,d=o[c];null!=d&&e.set(c,d)})}),(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},x=(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??""},$=(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(" ")},T=(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 f;d<n?(t.scrollTop=(f=d,f/=n,l*(--f*f*f+1)+i),o&&o(),requestAnimationFrame(u)):(t.scrollTop=e,t.style.scrollBehavior=s,o&&o(),r&&r())};requestAnimationFrame(u)},I=["#B91C1C","#A16207","#1D4ED8","#000000"],C=t=>{const e=I.findIndex(e=>e.toLowerCase()===t.toLowerCase());return-1===e?I.length:e},w=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:n.sort((t,e)=>C(t)-C(e))[0]},A=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},B=(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"}},M=(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=M(t.subsections[r],`${e}-${r}`,n);if(o)return o}return null},S=(t,e)=>{for(let n=0;n<t.length;n++){const r=M(t[n],String(n),e);if(r)return r}return null},N=new WeakMap,j=t=>{if(!t)return;const e=N.get(t);null!=e&&(clearTimeout(e),N.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)},L=t=>{if(!t)return;const e=N.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(()=>{j(t)},3e3);N.set(t,n)},k=(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=()=>L(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)}},O=(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)},E=(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)});export{g as DEVIATION_BADGE_SEPARATOR,f as areMarkdownPropsEqual,d as debounce,x as extractDeviationScore,S as findKeyPathByNodeId,y as findRedlineTextAnchorRange,v as findTextMatchRange,c as generateColorPalette,o as getAlphabeticSuffix,$ as getBentArrowPath,w as getFirstDeviationColor,A as getFirstDeviationOutputValue,_ as getLhsDeviationDisplayIndexes,u as getRationale,s as getRhsMappedSectionNumber,a as getSideData,h as hasMeaningfulRedlineTags,i as hasSingleMappedLhsSection,r as hasValue,L as highlightClause,p as isMissingStr,B as mixHexColors,M as recursivelyFindSubSectionIdxById,j as resetClauseHighlight,l as resolveComparisonInputItems,n as safeStringify,k as scrollAndHighlightClause,O as scrollAndWait,T as smoothScrollTo,b as stripRedlineTags,E as waitForScrollIdle};
|
|
1
|
+
import{DEFAULT_DEVIAION_COLOR as t}from"./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),n=t=>null!=t&&("string"==typeof t?t.trim().length>0:!Array.isArray(t)||t.length>0&&t.some(t=>n(t))),r=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},o=({section:t,proposedSections:e,leftNums:n,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?n.get(e.id):void 0;return null==i?null:o.length>1?`${i}${r(s)}`:String(i)}).filter(Boolean);return 0===i.length?o:s?i[0]:i.join(", ")},s=(t,e)=>{if(null==t?.selfIndex)return!1;return 1===(e||[]).filter(e=>Array.isArray(e?.refIndexes)&&e.refIndexes.includes(t.selfIndex)).length},i=(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)},a=(t,n,r,o={})=>{const s=i(t,n,r,o),a=s[0]?.data||{},l=s[0]?.attributes||null;return{title:e(a?.title||""),content:e(a?.content||""),change_history:e(a?.change_history||""),attributes:l,subsections:a?.subsections||[],contentId:s[0]?.contentId,allItems:s}},l=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"}};function u(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)}}function c(t,e){let n;return function(...r){const o=this;clearTimeout(n),n=setTimeout(()=>t.apply(o,r),e)}}const d=(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 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},f="::",g=t=>{if(!t)return!0;const e=t.trim().toLowerCase();return e.includes("no equivalent")||"n/a"===e||"na"===e||"none"===e},p=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},h=t=>"string"==typeof t&&t?t.replace(/<\/?(updated|deleted|changed|change)\b[^>]*>/gi,""):"",b=(t,n,r)=>{const o=new Map;if(!n)return o;const s=t=>{const n=p(t)?h(t):e(t||"");return e(n).replace(/\\n/g,"\n")};return(t||[]).forEach(t=>{const e=new Map,i=t=>{if(!t)return;const o=s(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 l=i[n],u=s(l);if(!u||g(l)||!o.includes(u))return;const c=`${a}::${t}`,d=r[c];null!=d&&e.set(c,d)})}),(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},m=(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??""},v=(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 a=i>0?1:-1,l=Math.min(o,Math.abs(i)/2,Math.abs(s-t)/2,Math.abs(n-s)/2);return[`M ${t} ${e}`,"H "+(s-l),`Q ${s} ${e} ${s} ${e+a*l}`,"V "+(r-a*l),`Q ${s} ${r} ${s+l} ${r}`,`H ${n}`].join(" ")},y=(t,e,n=300,r,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 f;d<n?(t.scrollTop=(f=d,f/=n,a*(--f*f*f+1)+i),o&&o(),requestAnimationFrame(u)):(t.scrollTop=e,t.style.scrollBehavior=s,o&&o(),r&&r())};requestAnimationFrame(u)},_=["#B91C1C","#A16207","#1D4ED8","#000000"],$=t=>{const e=_.findIndex(e=>e.toLowerCase()===t.toLowerCase());return-1===e?_.length:e},T=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:n.sort((t,e)=>$(t)-$(e))[0]},I=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},x=(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,a=(o[1]+s[1])/2*.95,l=(o[2]+s[2])/2*.95;return`#${r(i)}${r(a)}${r(l)}`}catch(t){return"#FDE68A"}},A=(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=A(t.subsections[r],`${e}-${r}`,n);if(o)return o}return null},B=(t,e)=>{for(let n=0;n<t.length;n++){const r=A(t[n],String(n),e);if(r)return r}return null},C=new WeakMap,M=t=>{if(!t)return;const e=C.get(t);null!=e&&(clearTimeout(e),C.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)},S=t=>{if(!t)return;const e=C.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(()=>{M(t)},3e3);C.set(t,n)},w=(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=()=>S(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)}},N=(t,e,n)=>{if(Math.abs(t.scrollTop-e)<=2)return void n();let r,o=!1;const s=()=>{o||(o=!0,clearTimeout(r),t.removeEventListener("scrollend",i),n())},i=()=>s();t.addEventListener("scrollend",i),t.scrollTo({top:e,behavior:"smooth"}),r=setTimeout(s,800)},j=(t,e=100)=>new Promise(n=>{let r,o=!1;const s=()=>{o||(o=!0,t.removeEventListener("scroll",i),n())},i=()=>{clearTimeout(r),r=setTimeout(s,e)};t.addEventListener("scroll",i),r=setTimeout(s,e)});export{f as DEVIATION_BADGE_SEPARATOR,d as areMarkdownPropsEqual,c as debounce,m as extractDeviationScore,B as findKeyPathByNodeId,u as generateColorPalette,r as getAlphabeticSuffix,v as getBentArrowPath,T as getFirstDeviationColor,I as getFirstDeviationOutputValue,b as getLhsDeviationDisplayIndexes,l as getRationale,o as getRhsMappedSectionNumber,a as getSideData,p as hasMeaningfulRedlineTags,s as hasSingleMappedLhsSection,n as hasValue,S as highlightClause,g as isMissingStr,x as mixHexColors,A as recursivelyFindSubSectionIdxById,M as resetClauseHighlight,i as resolveComparisonInputItems,e as safeStringify,w as scrollAndHighlightClause,N as scrollAndWait,y as smoothScrollTo,h as stripRedlineTags,j as waitForScrollIdle};
|
|
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","getRhsMappedSectionNumber","section","proposedSections","leftNums","fallbackNumber","firstOnly","id","mappedLabels","lhs","refIndexes","rhsPosition","findIndex","refIndex","selfIndex","baseNumber","get","filter","Boolean","hasSingleMappedLhsSection","includes","resolveComparisonInputItems","node","sideIndex","indexMap","contentMapping","sideUuid","rawInput","comparison_inputs","item","idx","mapped","contentId","data","attributes","additional_attributes","content_id","getSideData","items","first","title","content","change_history","subsections","allItems","getRationale","mapping_rationale","cognitiveData","decisioning","gap","relevance_score","isMissingRationale","citations","score","relation","rat","strength","parseInt","decision_strength","decisioning_factors","gaps_in_decision","generateColorPalette","hex","mixWithWhite","opacity","r","g","b","normalized","normalizeHex","replace","bigint","hexToRgb","x","toString","padStart","toUpperCase","rgbToHex","round","bg","border","badgeBg","badgeBorder","badgeText","highlightBg","debounce","func","delay","timeoutId","args","context","this","clearTimeout","setTimeout","apply","areMarkdownPropsEqual","prevProps","nextProps","overlayContent","fallbackContent","sxStyles","maintainRelativeOrder","suppressHighlightBg","collisionKey","prevH","highlights","nextH","i","prevB","deviationBadges","nextB","actionId","label","isOrphan","isConnected","showScrollLockToggle","scrollSyncLocked","style","DEVIATION_BADGE_SEPARATOR","isMissingStr","str","s","toLowerCase","hasMeaningfulRedlineTags","tagPattern","match","exec","stripRedlineTags","canonicalizeTextForMatch","source","ignorePunctuation","text","starts","ends","character","isIgnoredPunctuation","test","canonicalCharacter","endsWith","push","findTextMatchRange","highlight","directStart","indexOf","start","end","canonicalContent","canonicalHighlight","canonicalStart","canonicalEnd","findRedlineTextAnchorRange","completeRange","candidates","split","line","candidate","range","getLhsDeviationDisplayIndexes","sections","leftDocId","deviationNumberRegistry","displayIndexes","Map","normalize","raw","normalizeRedlineMarkdown","forEach","root","registeredEntries","visit","evaluationResults","evaluationResult","registryNodeId","nodeId","Object","entries","deviations","deviationKey","deviationMap","normalizedHighlight","refId","registryIndex","set","size","firstIndex","min","from","values","extractDeviationScore","fallbackLabel","evaluation_output","output_score","evaluation_outputs","output_value","getBentArrowPath","x1","y1","x2","y2","radius","midX","dy","abs","dir","smoothScrollTo","element","targetPosition","duration","onComplete","onProgress","originalScrollBehavior","scrollBehavior","startPosition","scrollTop","distance","startTime","animation","currentTime","timeElapsed","time","requestAnimationFrame","SEVERITY_ORDER","getColorSeverityRank","color","c","getFirstDeviationColor","allColors","deviationKeys","keys","sort","a","Number","key","metadata","label_color","entryKeys","deviation_entries","numericKeys","k","DEFAULT_DEVIAION_COLOR","getFirstDeviationOutputValue","mixHexColors","hex1","hex2","cleanHex","substring","toHex","rgb1","rgb2","e","recursivelyFindSubSectionIdxById","path","targetId","next","findKeyPathByNodeId","found","highlightTimeouts","WeakMap","resetClauseHighlight","delete","transition","outline","boxShadow","window","borderRadius","highlightClause","existingTimeout","scrollAndHighlightClause","scrollContainer","containerRect","getBoundingClientRect","elementRect","targetScrollTop","top","height","scrollTo","behavior","doHighlight","addEventListener","once","lastScrollTop","pollScroll","scrollAndWait","container","callback","called","fallbackTimer","fire","removeEventListener","handleScrollEnd","waitForScrollIdle","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","getRhsMappedSectionNumber","section","proposedSections","leftNums","fallbackNumber","firstOnly","id","mappedLabels","lhs","refIndexes","rhsPosition","findIndex","refIndex","selfIndex","baseNumber","get","filter","Boolean","hasSingleMappedLhsSection","includes","resolveComparisonInputItems","node","sideIndex","indexMap","contentMapping","sideUuid","rawInput","comparison_inputs","item","idx","mapped","contentId","data","attributes","additional_attributes","content_id","getSideData","items","first","title","content","change_history","subsections","allItems","getRationale","mapping_rationale","cognitiveData","decisioning","gap","relevance_score","isMissingRationale","citations","score","relation","rat","strength","parseInt","decision_strength","decisioning_factors","gaps_in_decision","generateColorPalette","hex","mixWithWhite","opacity","r","g","b","normalized","normalizeHex","replace","bigint","hexToRgb","x","toString","padStart","toUpperCase","rgbToHex","round","bg","border","badgeBg","badgeBorder","badgeText","highlightBg","debounce","func","delay","timeoutId","args","context","this","clearTimeout","setTimeout","apply","areMarkdownPropsEqual","prevProps","nextProps","overlayContent","sxStyles","maintainRelativeOrder","suppressHighlightBg","collisionKey","prevH","highlights","nextH","i","prevB","deviationBadges","nextB","actionId","label","isOrphan","isConnected","showScrollLockToggle","scrollSyncLocked","style","DEVIATION_BADGE_SEPARATOR","isMissingStr","str","s","toLowerCase","hasMeaningfulRedlineTags","tagPattern","match","exec","stripRedlineTags","getLhsDeviationDisplayIndexes","sections","leftDocId","deviationNumberRegistry","displayIndexes","Map","normalize","raw","forEach","root","registeredEntries","visit","evaluationResults","evaluationResult","registryNodeId","nodeId","Object","entries","deviations","deviationKey","deviationMap","highlight","normalizedHighlight","refId","registryIndex","set","size","firstIndex","min","from","values","extractDeviationScore","fallbackLabel","evaluation_output","output_score","evaluation_outputs","output_value","getBentArrowPath","x1","y1","x2","y2","radius","midX","dy","abs","dir","smoothScrollTo","element","targetPosition","duration","onComplete","onProgress","originalScrollBehavior","scrollBehavior","startPosition","scrollTop","distance","startTime","animation","currentTime","timeElapsed","time","requestAnimationFrame","SEVERITY_ORDER","getColorSeverityRank","color","c","getFirstDeviationColor","allColors","deviationKeys","keys","sort","a","Number","key","metadata","label_color","push","entryKeys","deviation_entries","numericKeys","k","test","DEFAULT_DEVIAION_COLOR","getFirstDeviationOutputValue","mixHexColors","hex1","hex2","cleanHex","substring","toHex","rgb1","rgb2","e","recursivelyFindSubSectionIdxById","path","targetId","next","findKeyPathByNodeId","found","highlightTimeouts","WeakMap","resetClauseHighlight","delete","transition","outline","boxShadow","window","borderRadius","highlightClause","existingTimeout","scrollAndHighlightClause","scrollContainer","containerRect","getBoundingClientRect","elementRect","targetScrollTop","top","height","scrollTo","behavior","doHighlight","addEventListener","once","lastScrollTop","pollScroll","scrollAndWait","container","callback","fallbackTimer","called","fire","removeEventListener","handleScrollEnd","waitForScrollIdle","idleMs","Promise","resolve","timer","onScroll"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as e,Fragment as t,jsx as o}from"react/jsx-runtime";import{useMemo as i,useState as n,useCallback as a,useEffect as r}from"react";import{Box as s,Typography as c,IconButton as d,Tooltip as l}from"@mui/material";import{X as p}from"lucide-react";import g from"react-dom";import x from"../../assests/svg/SparkleIcon.js";import{SHARED_MARKDOWN_STYLES as b,DEFAULT_POPUP_CONFIG as h}from"./CognitiveCompareConfig.js";import m from"./CitationRenderer.js";import{POPUP_WIDTH as f,VIEWPORT_MARGIN as v,ARROW_SIZE as u}from"./CognitiveCompareConstants.js";import{useCompareContext as y}from"./CompareContext.js";import{buildOnDemandCitationContexts as C}from"./onDemandCitations/contextBuilder.js";import{buildOnDemandCitationPayload as w}from"./onDemandCitations/payload.js";const F=e=>Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.trim().length>0):"string"==typeof e&&e.trim().length>0?[e]:[],k=({open:k,onClose:D,sectionTitle:I,referenceSectionTitle:S,cognitiveData:_,relevanceScore:T,anchorEl:$,badgeStyle:E,popupRef:W,position:z,markdownStyles:j,docData:A,popupConfig:R,deviationData:K=null,isLoading:B,sourceNodeId:L,deviationKey:N,baseContentId:O,compareContentIds:H})=>{const{treeData:M,onDemandCitationConfig:P,prefetchOnDemandCitationContexts:q,abortOnDemandCitationContexts:X,getOnDemandCitationCacheEntry:G}=y(),Y={...b,...j},J=i(()=>({...h,...R,tabs:{deviation:{...h.tabs.deviation,...R?.tabs?.deviation},association:{...h.tabs.association,...R?.tabs?.association}},sectionTitles:{...h.sectionTitles,...R?.sectionTitles}}),[R]),Q=_?.isMissingRationale,[U,V]=n(Q?J.tabs.deviation.key:J.tabs.association.key),[Z,ee]=n(!1),te=a(e=>{ee(e)},[]);r(()=>{k?V(Q?J.tabs.deviation.key:J.tabs.association.key):ee(!1)},[k,Q,J.tabs.deviation.key,J.tabs.association.key]),r(()=>{if(!k||!P?.enabled)return;const e=e=>{const t="deviation"===e,o=t?[...F(K?.cognitive_decisioning?.decisioning_factors),...F(K?.cognitive_decisioning?.gaps_in_decision)]:[...F(_?.decisioning),...F(_?.gap)];return C({treeData:M,content:o,requestId:P.requestId,tabKey:e,popupNodeId:L||K?.nodeId||_?.section_id,deviationKey:N,sectionTitle:I,referenceSectionTitle:S,docData:A,staticCitations:t?K?.cognitive_decisioning?.citations:_?.citations,deviationData:K,cognitiveData:_,baseContentId:O,compareContentIds:H})},t=U===J.tabs.deviation.key,o="prefetchAllTabs"===P.strategy?[...e("deviation"),...e("association")]:e(t?"deviation":"association"),i=o.map(e=>w(P,e));return P.onContextsBuilt?.(o),P.onPayloadsBuilt?.(i,o),P.debug&&(console.groupCollapsed("[CognitiveCompare:onDemandCitations]"),console.log("contexts",o),console.log("payloads",i),console.log("cacheEntries",o.map(e=>G(e))),console.groupEnd()),"prefetchActiveTab"!==P.strategy&&"prefetchAllTabs"!==P.strategy||q(o).catch(e=>{P.debug&&console.error("[CognitiveCompare:onDemandCitations] prefetch failed",e)}),()=>{P.abortOnPopupClose&&X(o)}},[X,U,J.tabs.deviation.key,_,K,A,G,P,k,q,S,I,L,N,O,H,M]);const oe=i(()=>{if(!E)return{border:J.accentColor,shadow:`${J.accentColor}2E`};const e=E.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:J.accentColor,shadow:`${J.accentColor}2E`}},[E,J.accentColor]);r(()=>{if(!k||Z)return;const e=e=>{W.current?.contains(e.target)||$?.contains(e.target)||D()};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[k,D,$,W,Z]);const ie=Q?[]:[J.tabs.deviation,J.tabs.association];if(1===ie.length&&ie[0].key===J.tabs.deviation.key)return null;if(!k||!_)return null;const ne=(U===J.tabs.deviation.key?K?.cognitive_decisioning?.decision_strength:_.relevance_score)??T??0,ae=_.decisioning,re=Array.isArray(ae)?ae:"string"==typeof ae&&ae.trim()?[ae]:[],se=_.gap,ce=Array.isArray(se)?se:"string"==typeof se&&se.trim()?[se]:[],de=z?.arrowLeft??60,le=e(s,{ref:W,sx:{position:"fixed",top:z?.top??-9999,left:z?.left??-9999,zIndex:9999,width:`min(${f}px, calc(100vw - ${2*v}px))`,maxWidth:`calc(100vw - ${2*v}px)`,boxSizing:"border-box",bgcolor:"#FFFFFF",borderRadius:"14px",border:`1.5px solid ${oe.border}`,boxShadow:`0px 8px 32px ${oe.shadow}, 0px 0px 0px 3px ${oe.shadow}`,overflow:"visible",display:Z?"none":"flex",flexDirection:"column",maxHeight:z?.maxHeight?`min(60vh, ${z.maxHeight}px)`:"60vh",visibility:z?"visible":"hidden",pointerEvents:Z?"none":"auto"},children:[z&&(z.openAbove?e(t,{children:[o(s,{sx:{position:"absolute",bottom:-(u+1),left:de-u,width:0,height:0,borderLeft:`${u}px solid transparent`,borderRight:`${u}px solid transparent`,borderTop:`${u+1}px solid ${oe.border}`,zIndex:1}}),o(s,{sx:{position:"absolute",bottom:-(u-1),left:de-u+1,width:0,height:0,borderLeft:u-1+"px solid transparent",borderRight:u-1+"px solid transparent",borderTop:`${u}px solid #FFFFFF`,zIndex:2}})]}):e(t,{children:[o(s,{sx:{position:"absolute",top:-(u+1),left:de-u,width:0,height:0,borderLeft:`${u}px solid transparent`,borderRight:`${u}px solid transparent`,borderBottom:`${u+1}px solid ${oe.border}`,zIndex:1}}),o(s,{sx:{position:"absolute",top:-(u-1),left:de-u+1,width:0,height:0,borderLeft:u-1+"px solid transparent",borderRight:u-1+"px solid transparent",borderBottom:`${u}px solid #FFFFFF`,zIndex:2}})]})),e(s,{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(s,{sx:{flex:{xs:"1 1 100%",sm:1},minWidth:0},children:[("no counterpart"!==I||"no counterpart"!==S)&&e(c,{sx:{fontSize:"16px",fontWeight:600,color:"#101828",lineHeight:1.3,display:"flex",alignItems:"center",gap:1,flexWrap:"nowrap",overflow:"hidden",width:"100%"},children:[o(s,{component:"span",title:I,sx:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:"0 1 auto",maxWidth:"calc(50% - 16px)",minWidth:0},children:I}),o(s,{component:"span",sx:{color:"#667085",fontWeight:400,flexShrink:0,mx:.5},children:"↔"}),o(s,{component:"span",title:S||"Reference Section",sx:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1,minWidth:0},children:S||"Reference Section"})]}),o(s,{sx:{mt:.75,display:"inline-flex",alignItems:"center",gap:.75},children:o(c,{sx:{fontSize:"no counterpart"!==I||"no counterpart"!==S?"13px":"16px",fontWeight:400,color:"#5928ED",lineHeight:1},children:Object.values(J.tabs).find(e=>e.key===U)?.subtitle})})]}),e(s,{sx:{display:"flex",alignItems:"center",gap:1.5,flexShrink:0,maxWidth:"100%",ml:{xs:"auto",sm:0}},children:[e(s,{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:[o(x,{}),J.decisionStrengthLabel," ",ne,"%"]}),o(d,{onClick:D,size:"small",sx:{color:"#667085",width:24,height:24,"&:hover":{bgcolor:"transparent",color:"#101828"}},children:o(p,{size:22})})]})]}),o(s,{sx:{display:"flex",borderBottom:"1px solid #E4E7EC",px:2.5,flexShrink:0,maxWidth:"100%",overflowX:"auto"},children:ie.map(e=>{const t=U===e.key,i=e.key===J.tabs.deviation.key,n=ie.length>1&&i&&B,a=o(s,{onClick:()=>{n||V(e.key)},sx:{pb:"10px",pt:"4px",mr:3,px:2,cursor:n?"not-allowed":"pointer",opacity:n?.5:1,fontSize:"14px",fontWeight:t?600:400,color:t?J.accentColor:"#667085",backgroundColor:t?`${J.accentColor}14`:"transparent",borderBottom:t?`2px solid ${J.accentColor}`:"2px solid transparent",transition:"all 0.15s",userSelect:"none",flexShrink:0},children:e.label},e.key);return n?o(l,{title:"Fetching deviation data",arrow:!0,placement:"top",children:o("span",{children:a})},e.key):a})}),o(s,{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:`${oe.border}55`,borderRadius:"10px"},"&::-webkit-scrollbar-thumb:hover":{background:oe.border},scrollbarWidth:"thin",scrollbarColor:`${oe.border}55 transparent`},children:U===J.tabs.deviation.key?K?e(t,{children:[(K?.cognitive_decisioning?.decisioning_factors||[])?.length>0&&o(m,{title:"Decision Making Factors",content:K?.cognitive_decisioning?.decisioning_factors?.join("\n\n"),citations:K?.cognitive_decisioning?.citations,styles:Y,docData:A,deviationData:K,open:k,onCitationFullscreenChange:te,tabKey:"deviation",sectionTitle:I,referenceSectionTitle:S,sourceNodeId:L,deviationKey:N,baseContentId:O,compareContentIds:H}),(K?.cognitive_decisioning?.gaps_in_decision||[])?.length>0&&o(m,{title:"Gaps in Decision",content:K?.cognitive_decisioning?.gaps_in_decision?.join("\n\n"),citations:K?.cognitive_decisioning?.citations,styles:Y,docData:A,deviationData:K,open:k,onCitationFullscreenChange:te,tabKey:"deviation",sectionTitle:I,referenceSectionTitle:S,sourceNodeId:L,deviationKey:N,baseContentId:O,compareContentIds:H}),0===(K?.cognitive_decisioning?.decisioning_factors||[])?.length&&0===(K?.cognitive_decisioning?.gaps_in_decision||[])?.length&&o(s,{sx:{p:2,bgcolor:"#F8FAFC",borderRadius:"8px",border:"1px solid #E2E8F0"},children:o(c,{sx:{fontSize:"13px",color:"#64748B"},children:"No cognitive decisioning data available for this section."})})]}):o(m,{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:Y,docData:A,open:k,onCitationFullscreenChange:te,tabKey:"deviation",sectionTitle:I,referenceSectionTitle:S,sourceNodeId:L,deviationKey:N,baseContentId:O,compareContentIds:H}):e(t,{children:[re.length>0&&o(m,{title:J.sectionTitles.decisioningFactors,content:re.join("\n\n"),citations:_.citations,styles:Y,open:k,docData:A,onCitationFullscreenChange:te,tabKey:"association",sectionTitle:I,referenceSectionTitle:S,sourceNodeId:L,deviationKey:N,baseContentId:O,compareContentIds:H}),ce.length>0&&o(m,{title:J.sectionTitles.gaps,content:ce.join("\n\n"),citations:_.citations,styles:Y,open:k,docData:A,onCitationFullscreenChange:te,tabKey:"association",sectionTitle:I,referenceSectionTitle:S,sourceNodeId:L,deviationKey:N,baseContentId:O,compareContentIds:H}),0===re.length&&0===ce.length&&o(s,{sx:{p:2,bgcolor:"#F8FAFC",borderRadius:"8px",border:"1px solid #E2E8F0"},children:o(c,{sx:{fontSize:"13px",color:"#64748B"},children:J.emptyStateMessage})})]})})]});return g.createPortal(le,document.body)};export{k as default};
|
|
1
|
+
import{jsxs as e,Fragment as t,jsx as i}from"react/jsx-runtime";import{useMemo as o,useState as n,useCallback as r,useEffect as a}from"react";import{Box as s,Typography as l,IconButton as c,Tooltip as d}from"@mui/material";import{X as p}from"lucide-react";import x from"react-dom";import h from"../../assests/svg/SparkleIcon.js";import{SHARED_MARKDOWN_STYLES as g,DEFAULT_POPUP_CONFIG as b}from"./CognitiveCompareConfig.js";import f from"./CitationRenderer.js";const m=10,u=({open:u,onClose:v,sectionTitle:y,referenceSectionTitle:w,cognitiveData:F,relevanceScore:k,anchorEl:C,badgeStyle:S,popupRef:D,position:_,markdownStyles:E,docData:R,popupConfig:z,deviationData:$=null,isLoading:W})=>{const I={...g,...E},T=o(()=>({...b,...z,tabs:{deviation:{...b.tabs.deviation,...z?.tabs?.deviation},association:{...b.tabs.association,...z?.tabs?.association}},sectionTitles:{...b.sectionTitles,...z?.sectionTitles}}),[z]),j=F?.isMissingRationale,[A,B]=n(j?T.tabs.deviation.key:T.tabs.association.key),[L,H]=n(!1),M=r(e=>{H(e)},[]);a(()=>{u?B(j?T.tabs.deviation.key:T.tabs.association.key):H(!1)},[u,j,T.tabs.deviation.key,T.tabs.association.key]);const O=o(()=>{if(!S)return{border:T.accentColor,shadow:`${T.accentColor}2E`};const e=S.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:T.accentColor,shadow:`${T.accentColor}2E`}},[S,T.accentColor]);a(()=>{if(!u||L)return;const e=e=>{D.current?.contains(e.target)||C?.contains(e.target)||v()};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[u,v,C,D,L]);const G=j?[]:[T.tabs.deviation,T.tabs.association];if(1===G.length&&G[0].key===T.tabs.deviation.key)return null;if(!u||!F)return null;const N=(A===T.tabs.deviation.key?$?.cognitive_decisioning?.decision_strength:F.relevance_score)??k??0,P=F.decisioning,Y=Array.isArray(P)?P:"string"==typeof P&&P.trim()?[P]:[],q=F.gap,J=Array.isArray(q)?q:"string"==typeof q&&q.trim()?[q]:[],K=_?_.left-150:-9999,Q=(_?.arrowLeft??60)+150,U=e(s,{ref:D,sx:{position:"fixed",top:_?.top??-9999,left:K,zIndex:9999,width:"1050px",maxWidth:`min(1050px, calc(100vw - ${K>0?K:0}px - 12px))`,bgcolor:"#FFFFFF",borderRadius:"14px",border:`1.5px solid ${O.border}`,boxShadow:`0px 8px 32px ${O.shadow}, 0px 0px 0px 3px ${O.shadow}`,overflow:"visible",display:"flex",flexDirection:"column",maxHeight:_?.maxHeight?`min(60vh, ${_.maxHeight}px)`:"60vh",visibility:!L&&_?"visible":"hidden",pointerEvents:L?"none":"auto"},children:[_&&(_.openAbove?e(t,{children:[i(s,{sx:{position:"absolute",bottom:-11,left:Q-m,width:0,height:0,borderLeft:"10px solid transparent",borderRight:"10px solid transparent",borderTop:`11px solid ${O.border}`,zIndex:1}}),i(s,{sx:{position:"absolute",bottom:-9,left:Q-m+1,width:0,height:0,borderLeft:"9px solid transparent",borderRight:"9px solid transparent",borderTop:"10px solid #FFFFFF",zIndex:2}})]}):e(t,{children:[i(s,{sx:{position:"absolute",top:-11,left:Q-m,width:0,height:0,borderLeft:"10px solid transparent",borderRight:"10px solid transparent",borderBottom:`11px solid ${O.border}`,zIndex:1}}),i(s,{sx:{position:"absolute",top:-9,left:Q-m+1,width:0,height:0,borderLeft:"9px solid transparent",borderRight:"9px solid transparent",borderBottom:"10px solid #FFFFFF",zIndex:2}})]})),e(s,{sx:{px:2.5,pt:2,pb:1.5,display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:2,flexShrink:0},children:[e(s,{sx:{flex:1,minWidth:0},children:[("no counterpart"!==y||"no counterpart"!==w)&&e(l,{sx:{fontSize:"16px",fontWeight:600,color:"#101828",lineHeight:1.3,display:"flex",alignItems:"center",gap:1,flexWrap:"nowrap",overflow:"hidden",width:"100%"},children:[i(s,{component:"span",title:y,sx:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:"0 1 auto",maxWidth:"calc(50% - 16px)",minWidth:0},children:y}),i(s,{component:"span",sx:{color:"#667085",fontWeight:400,flexShrink:0,mx:.5},children:"↔"}),i(s,{component:"span",title:w||"Reference Section",sx:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1,minWidth:0},children:w||"Reference Section"})]}),i(s,{sx:{mt:.75,display:"inline-flex",alignItems:"center",gap:.75},children:i(l,{sx:{fontSize:"no counterpart"!==y||"no counterpart"!==w?"13px":"16px",fontWeight:400,color:"#5928ED",lineHeight:1},children:Object.values(T.tabs).find(e=>e.key===A)?.subtitle})})]}),e(s,{sx:{display:"flex",alignItems:"center",gap:1.5,flexShrink:0},children:[e(s,{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:[i(h,{}),T.decisionStrengthLabel," ",N,"%"]}),i(c,{onClick:v,size:"small",sx:{color:"#667085",width:24,height:24,"&:hover":{bgcolor:"transparent",color:"#101828"}},children:i(p,{size:22})})]})]}),i(s,{sx:{display:"flex",borderBottom:"1px solid #E4E7EC",px:2.5,flexShrink:0},children:G.map(e=>{const t=A===e.key,o=e.key===T.tabs.deviation.key,n=G.length>1&&o&&W,r=i(s,{onClick:()=>{n||B(e.key)},sx:{pb:"10px",pt:"4px",mr:3,px:2,cursor:n?"not-allowed":"pointer",opacity:n?.5:1,fontSize:"14px",fontWeight:t?600:400,color:t?T.accentColor:"#667085",backgroundColor:t?`${T.accentColor}14`:"transparent",borderBottom:t?`2px solid ${T.accentColor}`:"2px solid transparent",transition:"all 0.15s",userSelect:"none"},children:e.label},e.key);return n?i(d,{title:"Fetching deviation data",arrow:!0,placement:"top",children:i("span",{children:r})},e.key):r})}),i(s,{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:`${O.border}55`,borderRadius:"10px"},"&::-webkit-scrollbar-thumb:hover":{background:O.border},scrollbarWidth:"thin",scrollbarColor:`${O.border}55 transparent`},children:A===T.tabs.deviation.key?$?e(t,{children:[($?.cognitive_decisioning?.decisioning_factors||[])?.length>0&&i(f,{title:"Decision Making Factors",content:$?.cognitive_decisioning?.decisioning_factors?.join("\n\n"),citations:$?.cognitive_decisioning?.citations,styles:I,docData:R,deviationData:$,open:u,onCitationFullscreenChange:M}),($?.cognitive_decisioning?.gaps_in_decision||[])?.length>0&&i(f,{title:"Gaps in Decision",content:$?.cognitive_decisioning?.gaps_in_decision?.join("\n\n"),citations:$?.cognitive_decisioning?.citations,styles:I,docData:R,deviationData:$,open:u,onCitationFullscreenChange:M}),0===($?.cognitive_decisioning?.decisioning_factors||[])?.length&&0===($?.cognitive_decisioning?.gaps_in_decision||[])?.length&&i(s,{sx:{p:2,bgcolor:"#F8FAFC",borderRadius:"8px",border:"1px solid #E2E8F0"},children:i(l,{sx:{fontSize:"13px",color:"#64748B"},children:"No cognitive decisioning data available for this section."})})]}):i(f,{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:I,docData:R,open:u,onCitationFullscreenChange:M}):e(t,{children:[Y.length>0&&i(f,{title:T.sectionTitles.decisioningFactors,content:Y.join("\n\n"),citations:F.citations,styles:I,open:u,docData:R,onCitationFullscreenChange:M}),J.length>0&&i(f,{title:T.sectionTitles.gaps,content:J.join("\n\n"),citations:F.citations,styles:I,open:u,docData:R,onCitationFullscreenChange:M}),0===Y.length&&0===J.length&&i(s,{sx:{p:2,bgcolor:"#F8FAFC",borderRadius:"8px",border:"1px solid #E2E8F0"},children:i(l,{sx:{fontSize:"13px",color:"#64748B"},children:T.emptyStateMessage})})]})})]});return x.createPortal(U,document.body)};export{u as default};
|
|
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","CognitivePopup","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","CognitivePopup","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
|
-
import{createContext as r,useContext as e}from"react";const o=r(null),t=o.Provider,n=()=>
|
|
1
|
+
import{createContext as r,useContext as e}from"react";const o=r(null),t=o.Provider,n=()=>{const r=e(o);if(!r)throw new Error("useCompareContext must be used within CompareContextProvider");return r};export{t as CompareContextProvider,n as useCompareContext};
|
|
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 {
|
|
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","useCompareContext","context","useContext","Error"],"mappings":"sDA2FA,MAAMA,EAAiBC,EAA0C,MAEpDC,EAAyBF,EAAeG,SAExCC,EAAoB,KACzB,MAAAC,EAAUC,EAAWN,GAC3B,IAAKK,EACG,MAAA,IAAIE,MAAM,gEAEX,OAAAF"}
|