@e-llm-studio/citation 0.0.251 → 0.0.252

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/dist/cjs/features/CognitiveCompare/CitationAnchor.js +1 -1
  2. package/dist/cjs/features/CognitiveCompare/CitationAnchor.js.map +1 -1
  3. package/dist/cjs/features/CognitiveCompare/CitationRenderer.js +1 -1
  4. package/dist/cjs/features/CognitiveCompare/CitationRenderer.js.map +1 -1
  5. package/dist/cjs/features/CognitiveCompare/CitationRendererInner.js +2 -0
  6. package/dist/cjs/features/CognitiveCompare/CitationRendererInner.js.map +1 -0
  7. package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js +1 -1
  8. package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
  9. package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
  10. package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
  11. package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
  12. package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
  13. package/dist/cjs/features/CognitiveCompare/CognitivePopup.js +1 -1
  14. package/dist/cjs/features/CognitiveCompare/CognitivePopup.js.map +1 -1
  15. package/dist/cjs/features/CognitiveCompare/CompareContext.js +1 -1
  16. package/dist/cjs/features/CognitiveCompare/CompareContext.js.map +1 -1
  17. package/dist/cjs/features/CognitiveCompare/GptWebCitationPanel.js +2 -0
  18. package/dist/cjs/features/CognitiveCompare/GptWebCitationPanel.js.map +1 -0
  19. package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
  20. package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
  21. package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
  22. package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
  23. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js +2 -0
  24. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js.map +1 -0
  25. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js +2 -0
  26. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js.map +1 -0
  27. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
  28. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
  29. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js +2 -0
  30. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js.map +1 -0
  31. package/dist/cjs/features/CognitiveCompare/components/GuidelineSkeletonLoader.js +2 -0
  32. package/dist/cjs/features/CognitiveCompare/components/GuidelineSkeletonLoader.js.map +1 -0
  33. package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
  34. package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
  35. package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
  36. package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
  37. package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js +1 -1
  38. package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
  39. package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
  40. package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
  41. package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js +1 -1
  42. package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
  43. package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
  44. package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
  45. package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js +1 -1
  46. package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
  47. package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
  48. package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
  49. package/dist/cjs/features/CognitiveCompare/hooks/useOnDemandCitationCache.js +2 -0
  50. package/dist/cjs/features/CognitiveCompare/hooks/useOnDemandCitationCache.js.map +1 -0
  51. package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
  52. package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
  53. package/dist/cjs/features/CognitiveCompare/onDemandCitations/cacheKey.js +2 -0
  54. package/dist/cjs/features/CognitiveCompare/onDemandCitations/cacheKey.js.map +1 -0
  55. package/dist/cjs/features/CognitiveCompare/onDemandCitations/contextBuilder.js +2 -0
  56. package/dist/cjs/features/CognitiveCompare/onDemandCitations/contextBuilder.js.map +1 -0
  57. package/dist/cjs/features/CognitiveCompare/onDemandCitations/href.js +2 -0
  58. package/dist/cjs/features/CognitiveCompare/onDemandCitations/href.js.map +1 -0
  59. package/dist/cjs/features/CognitiveCompare/onDemandCitations/payload.js +2 -0
  60. package/dist/cjs/features/CognitiveCompare/onDemandCitations/payload.js.map +1 -0
  61. package/dist/cjs/features/CognitiveCompare/onDemandCitations/response.js +2 -0
  62. package/dist/cjs/features/CognitiveCompare/onDemandCitations/response.js.map +1 -0
  63. package/dist/cjs/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js +2 -0
  64. package/dist/cjs/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js.map +1 -0
  65. package/dist/cjs/features/CognitiveCompare/utils/normalizeInlineMarkdown.js +2 -0
  66. package/dist/cjs/features/CognitiveCompare/utils/normalizeInlineMarkdown.js.map +1 -0
  67. package/dist/cjs/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js +2 -0
  68. package/dist/cjs/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js.map +1 -0
  69. package/dist/cjs/features/SegmentReviewComponents/BoundaryCard.js +1 -1
  70. package/dist/cjs/features/SegmentReviewComponents/BoundaryCard.js.map +1 -1
  71. package/dist/cjs/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js +1 -1
  72. package/dist/cjs/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js.map +1 -1
  73. package/dist/features/CognitiveCompare/CitationAnchor.js +1 -1
  74. package/dist/features/CognitiveCompare/CitationAnchor.js.map +1 -1
  75. package/dist/features/CognitiveCompare/CitationRenderer.js +1 -1
  76. package/dist/features/CognitiveCompare/CitationRenderer.js.map +1 -1
  77. package/dist/features/CognitiveCompare/CitationRendererInner.js +2 -0
  78. package/dist/features/CognitiveCompare/CitationRendererInner.js.map +1 -0
  79. package/dist/features/CognitiveCompare/CognitiveCompare.js +1 -1
  80. package/dist/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
  81. package/dist/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
  82. package/dist/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
  83. package/dist/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
  84. package/dist/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
  85. package/dist/features/CognitiveCompare/CognitivePopup.js +1 -1
  86. package/dist/features/CognitiveCompare/CognitivePopup.js.map +1 -1
  87. package/dist/features/CognitiveCompare/CompareContext.js +1 -1
  88. package/dist/features/CognitiveCompare/CompareContext.js.map +1 -1
  89. package/dist/features/CognitiveCompare/GptWebCitationPanel.js +2 -0
  90. package/dist/features/CognitiveCompare/GptWebCitationPanel.js.map +1 -0
  91. package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
  92. package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
  93. package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
  94. package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
  95. package/dist/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js +2 -0
  96. package/dist/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js.map +1 -0
  97. package/dist/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js +2 -0
  98. package/dist/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js.map +1 -0
  99. package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
  100. package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
  101. package/dist/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js +2 -0
  102. package/dist/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js.map +1 -0
  103. package/dist/features/CognitiveCompare/components/GuidelineSkeletonLoader.js +2 -0
  104. package/dist/features/CognitiveCompare/components/GuidelineSkeletonLoader.js.map +1 -0
  105. package/dist/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
  106. package/dist/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
  107. package/dist/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
  108. package/dist/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
  109. package/dist/features/CognitiveCompare/components/SectionAccordion.js +1 -1
  110. package/dist/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
  111. package/dist/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
  112. package/dist/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
  113. package/dist/features/CognitiveCompare/components/SvgConnectors.js +1 -1
  114. package/dist/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
  115. package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
  116. package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
  117. package/dist/features/CognitiveCompare/hooks/useCompareData.js +1 -1
  118. package/dist/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
  119. package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
  120. package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
  121. package/dist/features/CognitiveCompare/hooks/useOnDemandCitationCache.js +2 -0
  122. package/dist/features/CognitiveCompare/hooks/useOnDemandCitationCache.js.map +1 -0
  123. package/dist/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
  124. package/dist/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
  125. package/dist/features/CognitiveCompare/onDemandCitations/cacheKey.js +2 -0
  126. package/dist/features/CognitiveCompare/onDemandCitations/cacheKey.js.map +1 -0
  127. package/dist/features/CognitiveCompare/onDemandCitations/contextBuilder.js +2 -0
  128. package/dist/features/CognitiveCompare/onDemandCitations/contextBuilder.js.map +1 -0
  129. package/dist/features/CognitiveCompare/onDemandCitations/href.js +2 -0
  130. package/dist/features/CognitiveCompare/onDemandCitations/href.js.map +1 -0
  131. package/dist/features/CognitiveCompare/onDemandCitations/payload.js +2 -0
  132. package/dist/features/CognitiveCompare/onDemandCitations/payload.js.map +1 -0
  133. package/dist/features/CognitiveCompare/onDemandCitations/response.js +2 -0
  134. package/dist/features/CognitiveCompare/onDemandCitations/response.js.map +1 -0
  135. package/dist/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js +2 -0
  136. package/dist/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js.map +1 -0
  137. package/dist/features/CognitiveCompare/utils/normalizeInlineMarkdown.js +2 -0
  138. package/dist/features/CognitiveCompare/utils/normalizeInlineMarkdown.js.map +1 -0
  139. package/dist/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js +2 -0
  140. package/dist/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js.map +1 -0
  141. package/dist/features/SegmentReviewComponents/BoundaryCard.js +1 -1
  142. package/dist/features/SegmentReviewComponents/BoundaryCard.js.map +1 -1
  143. package/dist/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js +1 -1
  144. package/dist/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js.map +1 -1
  145. package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts +2 -0
  146. package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts.map +1 -1
  147. package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts +8 -1
  148. package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts.map +1 -1
  149. package/dist/types/features/CognitiveCompare/CitationRendererInner.d.ts +13 -0
  150. package/dist/types/features/CognitiveCompare/CitationRendererInner.d.ts.map +1 -0
  151. package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts +1 -1
  152. package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts.map +1 -1
  153. package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts +1 -1
  154. package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts.map +1 -1
  155. package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts +14 -1
  156. package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts.map +1 -1
  157. package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts +12 -0
  158. package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts.map +1 -1
  159. package/dist/types/features/CognitiveCompare/CognitivePopup.d.ts.map +1 -1
  160. package/dist/types/features/CognitiveCompare/CompareContext.d.ts +10 -1
  161. package/dist/types/features/CognitiveCompare/CompareContext.d.ts.map +1 -1
  162. package/dist/types/features/CognitiveCompare/GptWebCitationPanel.d.ts +7 -0
  163. package/dist/types/features/CognitiveCompare/GptWebCitationPanel.d.ts.map +1 -0
  164. package/dist/types/features/CognitiveCompare/Guidelines/components/GuidelinePanel.d.ts.map +1 -1
  165. package/dist/types/features/CognitiveCompare/Guidelines/components/WebGptPanel.d.ts.map +1 -1
  166. package/dist/types/features/CognitiveCompare/Guidelines/utils/guidelineTargets.d.ts +3 -0
  167. package/dist/types/features/CognitiveCompare/Guidelines/utils/guidelineTargets.d.ts.map +1 -0
  168. package/dist/types/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.d.ts +3 -0
  169. package/dist/types/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.d.ts.map +1 -0
  170. package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts +14 -1
  171. package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts.map +1 -1
  172. package/dist/types/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.d.ts +19 -0
  173. package/dist/types/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.d.ts.map +1 -0
  174. package/dist/types/features/CognitiveCompare/components/GuidelineSkeletonLoader.d.ts +8 -0
  175. package/dist/types/features/CognitiveCompare/components/GuidelineSkeletonLoader.d.ts.map +1 -0
  176. package/dist/types/features/CognitiveCompare/components/LHSSectionRow.d.ts.map +1 -1
  177. package/dist/types/features/CognitiveCompare/components/RHSSectionRow.d.ts.map +1 -1
  178. package/dist/types/features/CognitiveCompare/components/SectionAccordion.d.ts.map +1 -1
  179. package/dist/types/features/CognitiveCompare/components/SubSectionAccordion.d.ts.map +1 -1
  180. package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts +3 -2
  181. package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts.map +1 -1
  182. package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts +2 -1
  183. package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts.map +1 -1
  184. package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts +1 -1
  185. package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts.map +1 -1
  186. package/dist/types/features/CognitiveCompare/hooks/useLinesCalculator.d.ts.map +1 -1
  187. package/dist/types/features/CognitiveCompare/hooks/useOnDemandCitationCache.d.ts +10 -0
  188. package/dist/types/features/CognitiveCompare/hooks/useOnDemandCitationCache.d.ts.map +1 -0
  189. package/dist/types/features/CognitiveCompare/hooks/useSideBySide.d.ts.map +1 -1
  190. package/dist/types/features/CognitiveCompare/onDemandCitations/cacheKey.d.ts +3 -0
  191. package/dist/types/features/CognitiveCompare/onDemandCitations/cacheKey.d.ts.map +1 -0
  192. package/dist/types/features/CognitiveCompare/onDemandCitations/contextBuilder.d.ts +16 -0
  193. package/dist/types/features/CognitiveCompare/onDemandCitations/contextBuilder.d.ts.map +1 -0
  194. package/dist/types/features/CognitiveCompare/onDemandCitations/href.d.ts +6 -0
  195. package/dist/types/features/CognitiveCompare/onDemandCitations/href.d.ts.map +1 -0
  196. package/dist/types/features/CognitiveCompare/onDemandCitations/index.d.ts +7 -0
  197. package/dist/types/features/CognitiveCompare/onDemandCitations/index.d.ts.map +1 -0
  198. package/dist/types/features/CognitiveCompare/onDemandCitations/payload.d.ts +4 -0
  199. package/dist/types/features/CognitiveCompare/onDemandCitations/payload.d.ts.map +1 -0
  200. package/dist/types/features/CognitiveCompare/onDemandCitations/response.d.ts +3 -0
  201. package/dist/types/features/CognitiveCompare/onDemandCitations/response.d.ts.map +1 -0
  202. package/dist/types/features/CognitiveCompare/onDemandCitations/types.d.ts +134 -0
  203. package/dist/types/features/CognitiveCompare/onDemandCitations/types.d.ts.map +1 -0
  204. package/dist/types/features/CognitiveCompare/utils/normalizeCompactedGfmTables.d.ts +7 -0
  205. package/dist/types/features/CognitiveCompare/utils/normalizeCompactedGfmTables.d.ts.map +1 -0
  206. package/dist/types/features/CognitiveCompare/utils/normalizeInlineMarkdown.d.ts +6 -0
  207. package/dist/types/features/CognitiveCompare/utils/normalizeInlineMarkdown.d.ts.map +1 -0
  208. package/dist/types/features/CognitiveCompare/utils/normalizeRedlineMarkdown.d.ts +6 -0
  209. package/dist/types/features/CognitiveCompare/utils/normalizeRedlineMarkdown.d.ts.map +1 -0
  210. package/dist/types/features/SegmentReviewComponents/BoundaryCard.d.ts.map +1 -1
  211. package/dist/types/features/SegmentReviewComponents/SegmentReviewPdfWrapper.d.ts +3 -1
  212. package/dist/types/features/SegmentReviewComponents/SegmentReviewPdfWrapper.d.ts.map +1 -1
  213. package/package.json +1 -1
  214. package/dist/cjs/features/Bookemon/BookemonStyles.js +0 -2
  215. package/dist/cjs/features/Bookemon/BookemonStyles.js.map +0 -1
  216. package/dist/cjs/lib/ui/icons.js +0 -2
  217. package/dist/cjs/lib/ui/icons.js.map +0 -1
  218. package/dist/cjs/lib/ui/materialCompat.js +0 -2
  219. package/dist/cjs/lib/ui/materialCompat.js.map +0 -1
  220. package/dist/features/Bookemon/BookemonStyles.js +0 -2
  221. package/dist/features/Bookemon/BookemonStyles.js.map +0 -1
  222. package/dist/lib/ui/icons.js +0 -2
  223. package/dist/lib/ui/icons.js.map +0 -1
  224. package/dist/lib/ui/materialCompat.js +0 -2
  225. package/dist/lib/ui/materialCompat.js.map +0 -1
  226. package/dist/types/features/Bookemon/BookemonStyles.d.ts +0 -6
  227. package/dist/types/features/Bookemon/BookemonStyles.d.ts.map +0 -1
  228. package/dist/types/lib/ui/icons.d.ts +0 -46
  229. package/dist/types/lib/ui/icons.d.ts.map +0 -1
  230. package/dist/types/lib/ui/materialCompat.d.ts +0 -117
  231. package/dist/types/lib/ui/materialCompat.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentReviewPdfWrapper.js","sources":["../../../src/features/SegmentReviewComponents/SegmentReviewPdfWrapper.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from 'react';\nimport { SpecialZoomLevel, type SetRenderRange } from '@react-pdf-viewer/core';\nimport PdfViewer, {\n type PdfNavigationRequest,\n type PdfNavigationSettledEvent,\n type PdfViewerProps,\n} from '../PdfViewer/PdfViewer';\nimport BoundaryCard, {\n BoundaryReviewActionEnum,\n isBoundaryReviewAction,\n type BoundaryReviewAction,\n type BoundaryReviewConfirmDetails,\n} from './BoundaryCard';\nimport CardWrapper from './CardWrapper';\nimport CognitiveIntegrity from './CognitiveIntegrity';\nimport LabelCheck, {\n type LabelReviewAction,\n type LabelReviewConfirmDetails,\n} from './LabelCheck';\nimport PageCheck, {\n PageCheckActionEnum,\n type PageCheckAction,\n type PageCheckConfirmDetails,\n type PageCheckPageType,\n} from './PageCheck';\nimport PageTypeChoiceCheck from './PageTypeChoiceCheck';\nimport {\n extractSegmentReviewData,\n getSegmentReviewKey,\n type ExtractedBoundaryReview,\n type ExtractedLabelReview,\n type ExtractedPageReview,\n type SegmentRevertInfo,\n type SegmentReviewSource,\n} from './reviewStepAdapters';\nimport { Check, CircleCheck, GitMerge } from 'lucide-react';\nimport { Box, Portal, Tooltip, Typography } from '@mui/material';\nimport ReviewedCard from './ReviewedCard';\nimport ReviewedBoundaryActions from './ReviewedBoundaryActions';\nimport RevertCard, {\n type RevertActionResult,\n type RevertData,\n type SegmentData,\n} from './RevertCard';\nimport RevertSuccessCard from './RevertSuccessCard';\nimport {\n formatScore,\n getBoundaryReviewActionBadgeLabel,\n getConfidenceColors,\n getOptimisticMergeImpactedSegmentKeys,\n getPendingMergeImpactedSegmentKeys,\n getReviewScoreBand,\n getResolvedScore,\n getTitleReviewActionBadgeLabel,\n hasPolledStructuralAction,\n isReviewStepResolved,\n isReviewStepResolutionCurrent,\n shouldHideStructuralBoundaryReview,\n} from './helper';\nimport ChartBreakoutCircle from './ChartBreakoutCircle';\n\ntype ForwardedPdfViewerProps = Partial<Omit<\n PdfViewerProps,\n | 'pdfUrl'\n | 'pdfName'\n | 'segments'\n | 'onCurrentPageChange'\n | 'navigationRequest'\n | 'onNavigationSettled'\n | 'renderPage'\n | 'setRenderRange'\n>>;\n\ntype ReviewItem =\n | (ExtractedBoundaryReview<SegmentReviewSource> & {\n kind: 'boundary';\n pageNumber: number;\n })\n | (ExtractedLabelReview<SegmentReviewSource> & {\n kind: 'label';\n pageNumber: number;\n })\n | (ExtractedPageReview<SegmentReviewSource> & {\n kind: 'page';\n pageNumber: number;\n });\n\ntype RevertSuccessState = {\n title: string;\n description: string | null;\n segment: SegmentData;\n position: {\n top: number;\n left: number;\n width: number;\n };\n};\n\nconst REVIEW_CARD_MAX_WIDTH = 260;\nconst REVIEW_LAYOUT_MIN_WIDTH = 700;\nconst BOUNDARY_TITLE_CHECK_BYPASS_SCORE = 85;\n\nexport type ReviewConfidence = 'low' | 'medium' | 'high';\nexport type ReviewConfidenceFilter = 'low' | 'high' | 'all';\nexport type ReviewRedirectionType = 'boundary' | 'label' | 'page' | 'pageGroup';\n\nexport enum SegmentPdfSpecialZoomLevel {\n ActualSize = 'ActualSize',\n PageFit = 'PageFit',\n PageWidth = 'PageWidth',\n}\n\nexport interface SelectedBadgeData {\n reviewId: string;\n segment_id: string | null;\n reviewStepIndex: number;\n kind: 'boundary' | 'label' | 'page';\n pageNumber: number;\n metadata: Record<string, any>;\n}\n\nconst SEGMENT_PDF_SPECIAL_ZOOM_LEVEL: Record<\n SegmentPdfSpecialZoomLevel,\n SpecialZoomLevel\n> = {\n [SegmentPdfSpecialZoomLevel.ActualSize]: SpecialZoomLevel.ActualSize,\n [SegmentPdfSpecialZoomLevel.PageFit]: SpecialZoomLevel.PageFit,\n [SegmentPdfSpecialZoomLevel.PageWidth]: SpecialZoomLevel.PageWidth,\n};\n\nexport interface SegmentReviewActionContext {\n reviewId: string;\n segment: SegmentReviewSource;\n pageNumber: number;\n}\n\nexport interface PageTypeRevertDetails {\n classification_id: string;\n human_verdict: 'No';\n}\n\nexport interface RedirectionData {\n /** Change for every redirect request, including repeated redirects to the same badge. */\n requestKey?: string | number;\n pageNumber?: string;\n type?: ReviewRedirectionType;\n /** Stable backend segment id used to disambiguate reviews on the same page. */\n segmentId?: string;\n /** Exact review id returned by the wrapper, if the parent has it. */\n reviewId?: string;\n /** Stable backend page_classifications[].questions[].id for page-type redirects. */\n classificationId?: string;\n /** Optional page-type disambiguation when table/drawing checks share a page. */\n pageType?: string;\n\n /** type: 'pageGroup' only — ordered pages to step through, e.g. a segment's tabular pages. */\n pages?: number[];\n /** type: 'pageGroup' only — which page in `pages` to land on first. Defaults to 0. */\n pageIndex?: number;\n /** type: 'pageGroup' only — short label for the floating pill, e.g. \"Tabular\". */\n groupLabel?: string;\n}\n\nexport interface SegmentReviewPdfWrapperProps {\n pdfUrl: string;\n pdfName?: string;\n /** Live backend segments. Changes are re-extracted automatically. */\n segments: readonly SegmentReviewSource[];\n pdfViewerProps?: ForwardedPdfViewerProps;\n totalPages?: number;\n /** Special PDF zoom mode. Defaults to PageFit. */\n specialZoomLevel?: SegmentPdfSpecialZoomLevel;\n heightBuffer?: number;\n showBadges?: boolean;\n /** @deprecated Reviewed steps are always hidden from badges and navigation. */\n showResolvedBadges?: boolean;\n /** Confidence group placed first in the badge navigator. */\n sortByConfidence?: ReviewConfidence;\n /** Only render and navigate badges matching this confidence. */\n filterByConfidence?: ReviewConfidenceFilter;\n showBadgeNavigation?: boolean;\n autoSelectReviewOnPageChange?: boolean;\n autoAdvanceAfterConfirm?: boolean;\n /** Restrict post-confirm auto-advance to pending reviews in this score band. */\n autoAdvanceScoreBand?: ReviewConfidence;\n /** Number of PDF page layers mounted before and after the visible range. */\n badgePreloadPages?: number;\n /** Vertical badge offset from the page's top-right edge. */\n badgeOffsetTop?: number;\n /** Horizontal inset from the external badge rail's right edge. */\n badgeOffsetRight?: number;\n badgeOffsetLeft?: number;\n initialReviewId?: string;\n\n onBoundaryAction?: (\n action: BoundaryReviewAction,\n details: BoundaryReviewConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n onLabelAction?: (\n action: LabelReviewAction,\n details: LabelReviewConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n onPageAction?: (\n action: PageCheckAction,\n details: PageCheckConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n /**\n * Revert a confirmed page-type decision by submitting `human_verdict: \"No\"`.\n * Refresh the latest classifications before resolving this callback.\n */\n onPageTypeRevert?: (\n details: PageTypeRevertDetails,\n context: SegmentReviewActionContext\n ) => void | RevertActionResult | Promise<void | RevertActionResult>;\n /**\n * Submit the operation-level revert, poll it to completion, and refresh the\n * latest segments before resolving this callback. `revert` is null when the\n * current segment does not include revert metadata.\n */\n onRevert?: (\n revert: SegmentRevertInfo | null,\n context: SegmentReviewActionContext\n ) => void | RevertActionResult | Promise<void | RevertActionResult>;\n /** Called when a badge is selected, with its complete source segment. */\n onActiveReviewChange?: (\n reviewId: string | null,\n segment: SegmentReviewSource | null\n ) => void;\n onBadgeSelected?: (data: SelectedBadgeData) => void;\n onCurrentPageChange?: (pageNumber: number) => void;\n onActionError?: (error: unknown, context: SegmentReviewActionContext) => void;\n onAdjustManually?: (context: SegmentReviewActionContext) => void;\n onCognitiveClick?: (context: SegmentReviewActionContext) => void;\n\n className?: string;\n style?: CSSProperties;\n viewerStyle?: CSSProperties;\n railStyle?: CSSProperties;\n redirectionData?: RedirectionData;\n styles?: Record<string, React.CSSProperties>;\n disableAllActions?: boolean;\n disablePdfAnnotations?: boolean;\n /** Disable the transparent PDF text layer that can overflow rotated pages. */\n disablePdfTextLayer?: boolean;\n disableTitleCheckUntilBoundaryCheckCompleted?: boolean;\n manualPrompt?: string;\n}\n\nconst getReviewContext = (item: ReviewItem): SegmentReviewActionContext => ({\n reviewId: item.id,\n segment: item.segment,\n pageNumber: item.pageNumber,\n});\n\n/** Converts a zero-based index to A, B, ... Z, AA, AB, and so on. */\nconst getBadgeSuffix = (index: number): string => {\n let value = index + 1;\n let suffix = '';\n\n while (value > 0) {\n value -= 1;\n suffix = String.fromCharCode(65 + (value % 26)) + suffix;\n value = Math.floor(value / 26);\n }\n\n return suffix;\n};\n\n/**\n * Orchestrates the PDF, review badges, page navigation, active card and actions.\n * It consumes backend-shaped segments directly; cards never parse the raw payload.\n */\nexport default function SegmentReviewPdfWrapper({\n pdfUrl,\n pdfName,\n segments,\n totalPages,\n styles,\n pdfViewerProps,\n specialZoomLevel,\n showBadges = true,\n sortByConfidence = 'low',\n filterByConfidence = 'all',\n showBadgeNavigation = true,\n autoSelectReviewOnPageChange = false,\n autoAdvanceAfterConfirm = true,\n autoAdvanceScoreBand,\n badgePreloadPages = 8,\n badgeOffsetTop = 20,\n badgeOffsetRight = 68,\n badgeOffsetLeft = 0,\n initialReviewId,\n manualPrompt,\n heightBuffer,\n onBoundaryAction,\n onLabelAction,\n onPageAction,\n onPageTypeRevert,\n onRevert,\n onActiveReviewChange,\n onCurrentPageChange,\n onActionError,\n disableAllActions = false,\n disablePdfAnnotations = false,\n disablePdfTextLayer = true,\n disableTitleCheckUntilBoundaryCheckCompleted = false,\n onAdjustManually,\n onCognitiveClick,\n className,\n style,\n viewerStyle,\n railStyle,\n redirectionData,\n onBadgeSelected,\n}: SegmentReviewPdfWrapperProps) {\n console.log(\"LOG: TOTAL PAGE IN PARENT\", totalPages);\n const { boundaryReviews, labelReviews, pageReviews } = useMemo(\n () => extractSegmentReviewData(segments),\n [segments]\n );\n const [optimisticStructuralActions, setOptimisticStructuralActions] = useState<\n Map<string, BoundaryReviewAction>\n >(() => new Map());\n const [optimisticRangeAdjustedSegmentKeys, setOptimisticRangeAdjustedSegmentKeys] =\n useState<Set<string>>(() => new Set());\n\n const segmentNumberByKey = useMemo(\n () => {\n const numberByKey = new Map<string, number>();\n let nextSegmentNumber = 1;\n\n segments.forEach((segment, index) => {\n const segmentKey = getSegmentReviewKey(segment, index);\n if (!numberByKey.has(segmentKey)) {\n numberByKey.set(segmentKey, nextSegmentNumber);\n nextSegmentNumber += 1;\n }\n });\n\n return numberByKey;\n },\n [segments]\n );\n const segmentsWithTitleReviews = useMemo(\n () => new Set(labelReviews.map((review) => getSegmentReviewKey(review.segment))),\n [labelReviews]\n );\n const pendingMergeImpactedSegmentKeys = useMemo(\n () => getPendingMergeImpactedSegmentKeys(segments),\n [segments]\n );\n useEffect(() => {\n setOptimisticStructuralActions((current) => {\n let changed = false;\n const next = new Map(current);\n\n current.forEach((action, segmentKey) => {\n const segment = segments.find((item) =>\n getSegmentReviewKey(item) === segmentKey\n );\n if (!segment || hasPolledStructuralAction(segment, action)) {\n next.delete(segmentKey);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n }, [segments]);\n useEffect(() => {\n setOptimisticRangeAdjustedSegmentKeys((current) => {\n let changed = false;\n const next = new Set(current);\n\n current.forEach((segmentKey) => {\n if (!optimisticStructuralActions.has(segmentKey)) {\n next.delete(segmentKey);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n }, [optimisticStructuralActions]);\n const optimisticMergeImpactedSegmentKeys = useMemo(() => {\n return getOptimisticMergeImpactedSegmentKeys(\n segments,\n optimisticStructuralActions,\n optimisticRangeAdjustedSegmentKeys\n );\n }, [optimisticRangeAdjustedSegmentKeys, optimisticStructuralActions, segments]);\n const asideRef = useRef(null as HTMLDivElement | null);\n const reviews = useMemo<ReviewItem[]>(() => [\n ...boundaryReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !shouldHideStructuralBoundaryReview(\n review.review_step,\n review.segment,\n segmentsWithTitleReviews.has(getSegmentReviewKey(review.segment)),\n optimisticStructuralActions.get(getSegmentReviewKey(review.segment))\n )\n )\n .map((review) => ({\n ...review,\n kind: 'boundary' as const,\n pageNumber: review.metadata.focus_page ?? review.segment.start_page,\n })),\n ...labelReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment))\n )\n .map((review) => ({\n ...review,\n kind: 'label' as const,\n pageNumber: review.segment.start_page,\n })),\n ...pageReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment))\n )\n .map((review) => ({\n ...review,\n kind: 'page' as const,\n pageNumber: review.metadata.page_num ?? review.segment.start_page,\n })),\n ].sort((left, right) => {\n const leftSegmentNumber =\n segmentNumberByKey.get(getSegmentReviewKey(left.segment)) ?? Number.MAX_SAFE_INTEGER;\n const rightSegmentNumber =\n segmentNumberByKey.get(getSegmentReviewKey(right.segment)) ?? Number.MAX_SAFE_INTEGER;\n\n return left.pageNumber - right.pageNumber ||\n leftSegmentNumber - rightSegmentNumber ||\n left.reviewStepIndex - right.reviewStepIndex ||\n left.id.localeCompare(right.id);\n }), [\n boundaryReviews,\n labelReviews,\n pageReviews,\n optimisticMergeImpactedSegmentKeys,\n optimisticStructuralActions,\n pendingMergeImpactedSegmentKeys,\n segmentNumberByKey,\n segmentsWithTitleReviews,\n ]);\n\n // PdfToolbar displays `segment.title`, while backend segment titles can be\n // generic values such as \"Document 1\". Preserve the complete segment object\n // and expose its human-readable label as the viewer-facing title.\n const pdfSegments = useMemo(() => segments.map((segment) => ({\n ...segment,\n title: segment.label?.trim() || segment.title,\n page_count: segment.page_count ?? segment.end_page - segment.start_page + 1,\n })), [segments]);\n\n const [currentPage, setCurrentPage] = useState(1);\n const [activeReviewId, setActiveReviewId] = useState<string | null>(\n initialReviewId ?? null\n );\n const [selectedNavigationReviewId, setSelectedNavigationReviewId] = useState<\n string | null\n >(initialReviewId ?? null);\n const [isCognitiveIntegrityOpen, setIsCognitiveIntegrityOpen] = useState(false);\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const [navigationRequest, setNavigationRequest] = useState<PdfNavigationRequest | null>(null);\n const [locallyResolvedReviewIds, setLocallyResolvedReviewIds] = useState<Set<string>>(\n () => new Set()\n );\n const [pendingReviewId, setPendingReviewId] = useState<string | null>(null);\n const [activePageGroup, setActivePageGroup] = useState<{\n pages: number[];\n index: number;\n label: string;\n } | null>(null);\n \n\n const [revertSuccess, setRevertSuccess] = useState<RevertSuccessState | null>(null);\n const [isRevertToastVisible, setIsRevertToastVisible] = useState(false);\n const navigationSequenceRef = useRef(0);\n const pendingNavigationRef = useRef<{\n requestId: number;\n pageNumber: number;\n reviewId: string;\n } | null>(null);\n const pendingStructuralAdvanceRef = useRef<{\n action: BoundaryReviewAction;\n originalSegmentIndex: number;\n segmentSignature: string;\n ready: boolean;\n } | null>(null);\n const badgeElementsRef = useRef(new Map<string, HTMLSpanElement>());\n const pageGroupElementRef = useRef<HTMLSpanElement | null>(null);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const viewerHostRef = useRef<HTMLDivElement | null>(null);\n const [asideWidth, setAsideWidth] = useState(REVIEW_CARD_MAX_WIDTH);\n const requestedRailWidth = styles?.aside?.width ?? '40%';\n const responsiveRailWidth = `min(${\n typeof requestedRailWidth === 'number' ? `${requestedRailWidth}px` : requestedRailWidth\n }, ${REVIEW_CARD_MAX_WIDTH}px, 100%)`;\n\n useEffect(() => {\n setLocallyResolvedReviewIds((current) => {\n if (current.size === 0) {\n return current;\n }\n\n const next = new Set(current);\n let changed = false;\n\n reviews.forEach((item) => {\n /**\n * Backend has now returned a definitive review object,\n * so optimistic state is no longer necessary.\n */\n if (\n item.review_step.review?.action != null &&\n next.has(item.id)\n ) {\n next.delete(item.id);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n}, [reviews]);\n\n useEffect(() => {\n const aside = asideRef.current;\n if (!aside || !showBadges) return;\n\n const updateAsideWidth = () => {\n const nextWidth = aside.getBoundingClientRect().width;\n if (nextWidth > 0) setAsideWidth(nextWidth);\n };\n\n updateAsideWidth();\n const resizeObserver = typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(updateAsideWidth);\n resizeObserver?.observe(aside);\n\n return () => resizeObserver?.disconnect();\n }, [showBadges]);\n\n const resolvedReviewIds = useMemo(() => {\n const resolvedIds = new Set<string>();\n\n reviews.forEach((item) => {\n const isResolved = item.review_step.review?.action != null;\n\n if (isResolved) {\n resolvedIds.add(item.id);\n }\n });\n\n return resolvedIds;\n}, [reviews]);\n\n const activeReview = useMemo(\n () => reviews.find((item) => item.id === activeReviewId) ?? null,\n [activeReviewId, reviews]\n );\n const isTitleConfirmationBlocked = useMemo(() => {\n if (\n !disableTitleCheckUntilBoundaryCheckCompleted ||\n activeReview?.kind !== 'label'\n ) {\n return false;\n }\n\n return boundaryReviews.some((review) => {\n if (\n getSegmentReviewKey(review.segment) !== getSegmentReviewKey(activeReview.segment) ||\n resolvedReviewIds.has(review.id)\n ) {\n return false;\n }\n\n const boundaryScore = getResolvedScore(\n review.review_step.score,\n review.review_step.confidence\n );\n\n // A high-confidence boundary can skip manual confirmation. Missing or\n // lower scores keep the existing boundary-first confirmation requirement.\n return boundaryScore == null ||\n boundaryScore < BOUNDARY_TITLE_CHECK_BYPASS_SCORE;\n });\n }, [\n activeReview,\n boundaryReviews,\n disableTitleCheckUntilBoundaryCheckCompleted,\n resolvedReviewIds,\n ]);\n const activeSegmentIndex = activeReview == null\n ? -1\n : segments.findIndex(\n (segment) => getSegmentReviewKey(segment) === getSegmentReviewKey(activeReview.segment)\n );\n const previousSegment = activeSegmentIndex > 0\n ? segments[activeSegmentIndex - 1]\n : undefined;\n const nextSegment = activeSegmentIndex >= 0\n ? segments[activeSegmentIndex + 1]\n : undefined;\n const previousSegmentTitle = previousSegment?.label?.trim() || previousSegment?.title;\n const nextSegmentTitle = nextSegment?.label?.trim() || nextSegment?.title;\n const activeReviewColors = getConfidenceColors(\n activeReview?.review_step.score,\n activeReview?.review_step.confidence,\n activeReview?.segment.confidence?.awaiting_llm\n );\n const activeCognitiveReasons = activeReview?.review_step.reasons?.length\n ? activeReview.review_step.reasons\n : activeReview?.segment.confidence?.reasons ?? [];\n const hasCognitiveIntegrityContent = Boolean(\n activeCognitiveReasons.some((item) =>\n item.text.trim() && ['evidence', 'gap'].includes(item.type.trim().toLowerCase())\n ) ||\n activeReview?.review_step.reason?.trim() || activeReview?.review_step.gap?.trim()\n );\n const activeReviewActionLabel = activeReview == null\n ? null\n : activeReview.kind === 'boundary'\n ? getBoundaryReviewActionBadgeLabel(\n activeReview.review_step,\n activeReview.segment,\n optimisticStructuralActions.get(activeReview.segment.stable_key ?? \"\")\n )\n : getTitleReviewActionBadgeLabel(\n activeReview.review_step,\n activeReview.segment,\n optimisticStructuralActions.get(activeReview.segment.stable_key ?? \"\")\n );\n const activeTitleDecisionValues = activeReview?.kind === 'label'\n ? [\n activeReviewActionLabel,\n activeReview.review_step.human_action_enum,\n activeReview.review_step.review?.action,\n activeReview.review_step.human_resolution?.action,\n ]\n : [];\n const isMergeOrSplitTitleReview = activeReview?.kind === 'label' &&\n activeTitleDecisionValues.some((value) => {\n const normalizedValue = value?.trim().toUpperCase() ?? '';\n return normalizedValue.includes('MERGE') || normalizedValue.includes('SPLIT');\n });\n const hasVisibleBoundaryReviewForActiveSegment = activeReview != null &&\n reviews.some(\n (review) =>\n review.kind === 'boundary' &&\n getSegmentReviewKey(review.segment) ===\n getSegmentReviewKey(activeReview.segment)\n );\n const isHiddenBoundaryStructuralTitleReview =\n isMergeOrSplitTitleReview && !hasVisibleBoundaryReviewForActiveSegment;\n const shouldShowReviewedBoundaryActions =\n activeReview?.kind === 'boundary' || isHiddenBoundaryStructuralTitleReview;\n const activeBoundaryReview = !shouldShowReviewedBoundaryActions || activeReview == null\n ? undefined\n : (() => {\n if (activeReview.kind === 'boundary') return activeReview;\n\n const boundaryReview = boundaryReviews.find(\n (review) =>\n getSegmentReviewKey(review.segment) ===\n getSegmentReviewKey(activeReview.segment)\n );\n\n if (boundaryReview) {\n return {\n ...boundaryReview,\n kind: 'boundary' as const,\n pageNumber:\n boundaryReview.metadata.focus_page ??\n boundaryReview.segment.start_page,\n };\n }\n\n return {\n ...activeReview,\n kind: 'boundary' as const,\n pageNumber:\n activeReview.segment.review_action?.focus_page ??\n activeReview.segment.start_page,\n metadata: {\n focus_page: activeReview.segment.review_action?.focus_page ?? null,\n boundary_margin: activeReview.segment.boundary_margin ?? null,\n user_actions: [],\n },\n };\n })();\n const activeReviewTitle = activeReview == null\n ? ''\n : activeReview.segment.label?.trim() || activeReview.segment.title;\n const activeStepRevertInfo =\n activeReview?.review_step.revert;\n\nconst segmentRevertInfo =\n activeReview?.segment.revert;\n\nconst normalizeRevertType = (\n type?: string | null\n) => type?.trim().toLowerCase();\n\nconst structuralStepRevertInfo =\n activeReview == null\n ? undefined\n : [...(activeReview.segment.review_steps ?? [])]\n .reverse()\n .find((step) => {\n const stepType = step.type\n ?.trim()\n .toLowerCase();\n\n if (\n stepType !== 'page_boundary' &&\n stepType !== 'page boundary review'\n ) {\n return false;\n }\n\n return (\n normalizeRevertType(step.revert?.type) ===\n 'boundary'\n );\n })\n ?.revert;\n const fallbackRevertInfo = activeStepRevertInfo ??\n activeReview?.segment.revert ??\n structuralStepRevertInfo;\n const fallbackRevertDecision = fallbackRevertInfo?.decision.trim().toUpperCase();\n const activeRevertActionLabel =\n activeReviewActionLabel ?? (\n fallbackRevertDecision\n ?.includes('SPLIT')\n ? 'Split'\n : fallbackRevertDecision\n ?.includes('MERGE')\n ? 'Merged'\n : null\n );\n const isSetRangeStructuralResult = activeReview?.kind === 'label' && structuralStepRevertInfo?.decision?.trim().toUpperCase() === 'SET_RANGE' && structuralStepRevertInfo.current_segment_ids.length !== structuralStepRevertInfo.previous_state.length;\n const isStructuralReviewResult = activeReviewActionLabel === 'Merged' || activeReviewActionLabel === 'Split' || isSetRangeStructuralResult;\n const activeRevertInfo =\n activeReview == null ? undefined : isStructuralReviewResult ? (\n normalizeRevertType(structuralStepRevertInfo?.type) === 'boundary' ? structuralStepRevertInfo :\n normalizeRevertType(segmentRevertInfo?.type) === 'boundary' ? segmentRevertInfo :\n normalizeRevertType(activeStepRevertInfo?.type) === 'boundary' ? activeStepRevertInfo : undefined\n )\n : activeReview.kind === 'label'\n ? (normalizeRevertType(activeStepRevertInfo?.type) === 'label' ? activeStepRevertInfo : undefined)\n : activeReview.kind === 'boundary'\n ? (\n normalizeRevertType(\n activeStepRevertInfo?.type\n ) === 'boundary'\n ? activeStepRevertInfo\n : normalizeRevertType(\n structuralStepRevertInfo?.type\n ) === 'boundary'\n ? structuralStepRevertInfo\n : normalizeRevertType(\n segmentRevertInfo?.type\n ) === 'boundary'\n ? segmentRevertInfo\n : undefined\n )\n : undefined;\n\n\n const structuralSummaryStep = isStructuralReviewResult && activeRevertInfo?.operation_id ? segments.flatMap((segment)=> segment.review_steps ?? []).find((step) => {\n const stepType = step.type?.trim().toLowerCase();\n\n const isBoundaryStep = stepType === 'page_boundary' || stepType === 'page boundary review';\n if(!isBoundaryStep) return false;\n\n const operationId = step.human_resolution?.operation_id ?? step.revert?.operation_id ?? step.operation_id;\n\n return (\n operationId === activeRevertInfo.operation_id && Boolean(step.human_resolution?.change_summary?.trim())\n );\n }) : undefined;\n const activeRevertSummary = activeRevertInfo?.summary?.trim() || null;\n const activeRevertDescription = isStructuralReviewResult ? (structuralSummaryStep?.human_resolution?.change_summary?.trim() || activeRevertInfo?.summary?.trim() || '') : (activeReview?.review_step?.human_resolution?.change_summary?.trim() || activeReview?.review_step?.summary?.trim() || '');\n const activeRevertData: RevertData | null = activeReview?.kind === 'page'\n ? {\n currentSegment: {\n title: activeReviewTitle,\n startPage: activeReview.segment.start_page,\n endPage: activeReview.segment.end_page,\n },\n previousSegments: [],\n }\n : activeReview && activeRevertInfo\n ? {\n currentSegment: {\n title: activeReviewTitle,\n startPage: activeReview.segment.start_page,\n endPage: activeReview.segment.end_page,\n },\n previousSegments: (activeRevertInfo.previous_state ?? []).flatMap<SegmentData>(\n (segment) => {\n const title = segment.label === null\n ? 'Untitled document'\n : segment.label?.trim();\n return title\n ? [{\n title,\n startPage: segment.start_page,\n endPage: segment.end_page,\n }]\n : [];\n }\n ),\n }\n : null;\n const activePageClassificationIds = activeReview?.kind === 'page'\n ? activeReview.metadata.type_choices?.map(\n (choice) => choice.classification_id\n ) ?? (\n activeReview.metadata.classification_id\n ? [activeReview.metadata.classification_id]\n : []\n )\n : [];\n const canRevertActiveReview = activeReview?.kind === 'page'\n ? Boolean(onPageTypeRevert && activePageClassificationIds.length > 0)\n : Boolean(\n activeRevertInfo?.operation_id &&\n activeRevertInfo?.type &&\n activeRevertInfo?.revertable !== false\n );\n const shouldShowRevert = Boolean(\n activeRevertData && canRevertActiveReview\n );\n\n const requestPageNavigation = useCallback((pageNumber: number, reviewId: string) => {\n navigationSequenceRef.current += 1;\n pendingNavigationRef.current = {\n requestId: navigationSequenceRef.current,\n pageNumber,\n reviewId,\n };\n setNavigationRequest({\n pageNumber,\n requestId: navigationSequenceRef.current,\n });\n }, []);\n\n // const closeActiveReview = useCallback(() => {\n // pendingNavigationRef.current = null;\n // setIsCognitiveIntegrityOpen(false);\n // setActiveReviewId(null);\n // setAnchorElement(null);\n // onActiveReviewChange?.(null, null);\n // }, [onActiveReviewChange]);\n\n const selectReview = useCallback((item: ReviewItem) => {\n if (item.segment.confidence?.awaiting_llm === true) return;\n \n onBadgeSelected?.({\n reviewId: item.id,\n segment_id: item.segment.segment_id ?? null,\n reviewStepIndex: item.reviewStepIndex,\n kind: item.kind,\n pageNumber: item.pageNumber,\n metadata: item.metadata,\n });\n \n setActivePageGroup(null);\n setRevertSuccess(null);\n setActiveReviewId(item.id);\n setSelectedNavigationReviewId(item.id);\n setIsCognitiveIntegrityOpen(false);\n // The badge moves when page navigation scrolls the viewer. Keep the popup\n // closed until the badge reaches its final position.\n setAnchorElement(null);\n requestPageNavigation(item.pageNumber, item.id);\n onActiveReviewChange?.(item.id, item.segment);\n }, [onActiveReviewChange, onBadgeSelected, requestPageNavigation]);\n\n useEffect(() => {\n if (!revertSuccess) return;\n\n const frameId = requestAnimationFrame(() => setIsRevertToastVisible(true));\n const fadeTimeoutId = window.setTimeout(() => {\n setIsRevertToastVisible(false);\n }, 3500);\n const removeTimeoutId = window.setTimeout(() => {\n setRevertSuccess(null);\n }, 4000);\n\n return () => {\n cancelAnimationFrame(frameId);\n window.clearTimeout(fadeTimeoutId);\n window.clearTimeout(removeTimeoutId);\n };\n }, [revertSuccess]);\n\n useEffect(() => {\n if (!redirectionData) return;\n\n\n if (redirectionData.type === 'pageGroup') {\n const pages = redirectionData.pages ?? [];\n const index = redirectionData.pageIndex ?? 0;\n const targetPage = pages[index];\n if (targetPage == null) return;\n\n closeActiveReview();\n setActivePageGroup({ pages, index, label: redirectionData.groupLabel ?? '' });\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: targetPage,\n requestId: navigationSequenceRef.current,\n });\n return;\n }\n setActivePageGroup(null);\n\n\n if (redirectionData.reviewId) {\n const matchingReview = reviews.find((item) =>\n item.id === redirectionData.reviewId &&\n (!redirectionData.type || item.kind === redirectionData.type)\n );\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n }\n\n if (redirectionData.classificationId) {\n const matchingReview = reviews.find((item) =>\n item.kind === 'page' &&\n (\n item.metadata.classification_id === redirectionData.classificationId ||\n item.metadata.type_choices?.some(\n (choice) => choice.classification_id === redirectionData.classificationId\n )\n ) &&\n (!redirectionData.segmentId ||\n item.segment.segment_id === redirectionData.segmentId) &&\n (!redirectionData.type || item.kind === redirectionData.type)\n );\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n }\n\n if (!redirectionData.pageNumber || !redirectionData.type) return;\n\n const segmentStartPage = Number(redirectionData.pageNumber);\n if (!Number.isInteger(segmentStartPage) || segmentStartPage < 1) return;\n const redirectionPageType = redirectionData.pageType?.trim().toLowerCase();\n\n const matchingReview = reviews.find((item) => {\n const matchingPage = item.kind === 'page'\n ? item.pageNumber\n : item.segment.start_page;\n const matchesPageType = item.kind !== 'page' ||\n !redirectionPageType ||\n item.metadata.page_type === redirectionPageType ||\n item.metadata.type_choices?.some(\n (choice) => choice.page_type === redirectionPageType\n );\n const matchesSegment = !redirectionData.segmentId ||\n item.segment.segment_id === redirectionData.segmentId;\n\n return matchesSegment &&\n matchingPage === segmentStartPage &&\n item.kind === redirectionData.type &&\n matchesPageType;\n });\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n\n // No review exists for this page (e.g. disableAllActions steps with no\n // page_classifications) — still jump the viewer directly.\n if (redirectionData.type === 'page') {\n closeActiveReview();\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: segmentStartPage,\n requestId: navigationSequenceRef.current,\n });\n }\n \n }, [redirectionData, selectReview, reviews]);\n\n const closeActiveReview = useCallback(() => {\n pendingNavigationRef.current = null;\n setIsCognitiveIntegrityOpen(false);\n setActiveReviewId(null);\n setAnchorElement(null);\n onActiveReviewChange?.(null, null);\n }, [onActiveReviewChange]);\n\n const reviewRevertedSegment = useCallback((segment: RevertData['currentSegment']) => {\n setIsRevertToastVisible(false);\n setRevertSuccess(null);\n\n const targetReview = reviews.find((item) =>\n !resolvedReviewIds.has(item.id) &&\n item.kind === 'boundary' &&\n item.segment.start_page === segment.startPage &&\n item.segment.end_page === segment.endPage\n ) ?? reviews.find((item) =>\n !resolvedReviewIds.has(item.id) &&\n item.segment.start_page <= segment.startPage &&\n item.segment.end_page >= segment.startPage\n );\n\n if (targetReview) {\n selectReview(targetReview);\n return;\n }\n\n closeActiveReview();\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: segment.startPage,\n requestId: navigationSequenceRef.current,\n });\n }, [closeActiveReview, resolvedReviewIds, reviews, selectReview]);\n\n const isEligibleAutoAdvanceReview = useCallback((\n item: ReviewItem,\n excludedReviewId?: string\n ) => {\n const scoreBand = getReviewScoreBand(\n item.review_step.score\n );\n const matchesScoreBand = autoAdvanceScoreBand == null ||\n scoreBand === autoAdvanceScoreBand;\n const hasCurrentLocalResolution =\n locallyResolvedReviewIds.has(item.id) &&\n isReviewStepResolutionCurrent(item.review_step, item.segment);\n\n return item.id !== excludedReviewId &&\n matchesScoreBand &&\n item.segment.confidence?.awaiting_llm !== true &&\n !isReviewStepResolved(item.review_step, item.segment) &&\n !hasCurrentLocalResolution;\n }, [autoAdvanceScoreBand, locallyResolvedReviewIds]);\n\n const selectNextReview = useCallback((completedReviewId: string) => {\n if (!autoAdvanceAfterConfirm) {\n closeActiveReview();\n return;\n }\n\n const completedIndex = reviews.findIndex(\n (item) => item.id === completedReviewId\n );\n const nextReview = reviews.find((item, index) =>\n index > completedIndex &&\n isEligibleAutoAdvanceReview(item, completedReviewId)\n ) ?? reviews.find((item) =>\n isEligibleAutoAdvanceReview(item, completedReviewId)\n );\n\n if (!nextReview) {\n closeActiveReview();\n return;\n }\n\n requestAnimationFrame(() => selectReview(nextReview));\n }, [\n autoAdvanceAfterConfirm,\n closeActiveReview,\n isEligibleAutoAdvanceReview,\n reviews,\n selectReview,\n ]);\n\n const completePageTypeChoices = useCallback(async (\n item: Extract<ReviewItem, { kind: 'page' }>,\n selectedPageTypes: readonly PageCheckPageType[]\n ) => {\n if (disableAllActions || !onPageAction || selectedPageTypes.length === 0) return;\n\n const choices = item.metadata.type_choices ?? [];\n if (choices.length !== 2) return;\n\n const selectedTypes = new Set(selectedPageTypes);\n const context = getReviewContext(item);\n const orderedChoices = [...choices].sort((left, right) => {\n const isLeftSelected = selectedTypes.has(left.page_type);\n const isRightSelected = selectedTypes.has(right.page_type);\n return isLeftSelected === isRightSelected ? 0 : isLeftSelected ? -1 : 1;\n });\n\n setPendingReviewId(item.id);\n\n try {\n for (const choice of orderedChoices) {\n const action = selectedTypes.has(choice.page_type)\n ? PageCheckActionEnum.YES\n : PageCheckActionEnum.NO;\n\n await onPageAction(\n action,\n {\n action,\n pageType: choice.page_type,\n metadata: {\n user_actions: [PageCheckActionEnum.YES, PageCheckActionEnum.NO],\n page_num: item.metadata.page_num,\n page_type: choice.page_type,\n classification_id: choice.classification_id,\n },\n },\n context\n );\n }\n\n setLocallyResolvedReviewIds((current) => {\n const next = new Set(current);\n next.add(item.id);\n return next;\n });\n selectNextReview(item.id);\n } catch (error) {\n onActionError?.(error, context);\n } finally {\n setPendingReviewId(null);\n }\n }, [\n disableAllActions,\n onActionError,\n onPageAction,\n selectNextReview,\n ]);\n\n const completeAction = useCallback(async (\n item: ReviewItem,\n action: BoundaryReviewAction | LabelReviewAction | PageCheckAction,\n details: BoundaryReviewConfirmDetails | LabelReviewConfirmDetails | PageCheckConfirmDetails\n ) => {\n if (disableAllActions) return;\n if (item.kind === 'boundary' && !onBoundaryAction) return;\n if (item.kind === 'label' && !onLabelAction) return;\n if (item.kind === 'page' && !onPageAction) return;\n\n const context = getReviewContext(item);\n const boundaryAction = action as BoundaryReviewAction;\n const boundaryDetails =\n details as BoundaryReviewConfirmDetails;\n\nconst effectiveBoundaryAction =\n boundaryAction ===\n BoundaryReviewActionEnum.SET_RANGE\n ? (() => {\n const newStart =\n boundaryDetails.startPage;\n\n const newEnd =\n boundaryDetails.endPage;\n\n if (\n newStart == null ||\n newEnd == null\n ) {\n return null;\n }\n\n const expanded =\n newStart <\n item.segment.start_page ||\n newEnd >\n item.segment.end_page;\n\n const shrunk =\n newStart >\n item.segment.start_page ||\n newEnd <\n item.segment.end_page;\n\n if (expanded && !shrunk) {\n return newStart <\n item.segment.start_page\n ? BoundaryReviewActionEnum.MERGE_PREV\n : BoundaryReviewActionEnum.MERGE_NEXT;\n }\n\n if (shrunk) {\n return BoundaryReviewActionEnum.SPLIT_HERE;\n }\n\n return null;\n })()\n : boundaryAction;\n const isStructuralBoundaryAction =\n item.kind === 'boundary' &&\n onBoundaryAction != null &&\n autoAdvanceAfterConfirm &&\n (\n effectiveBoundaryAction === BoundaryReviewActionEnum.SPLIT_HERE ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_NEXT ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREV ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREVIOUS\n );\n const originalSegmentIndex = isStructuralBoundaryAction\n ? segments.findIndex(\n (segment) => getSegmentReviewKey(segment) === getSegmentReviewKey(item.segment)\n )\n : -1;\n\n if (isStructuralBoundaryAction && originalSegmentIndex >= 0 && effectiveBoundaryAction) {\n pendingStructuralAdvanceRef.current = {\n action: effectiveBoundaryAction as BoundaryReviewAction,\n originalSegmentIndex,\n\n segmentSignature: JSON.stringify(\n segments.map((segment, index) => ({\n key: getSegmentReviewKey(\n segment,\n index\n ),\n startPage: segment.start_page,\n endPage: segment.end_page,\n version: segment.version ?? null,\n }))\n ),\n\n ready: false,\n };\n }\n\n setPendingReviewId(item.id);\n\n try {\n if (item.kind === 'boundary') {\n await onBoundaryAction?.(\n action as BoundaryReviewAction,\n details as BoundaryReviewConfirmDetails,\n context\n );\n } else if (item.kind === 'label') {\n await onLabelAction?.(\n action as LabelReviewAction,\n details as LabelReviewConfirmDetails,\n context\n );\n } else if (item.kind === 'page') {\n await onPageAction?.(\n action as PageCheckAction,\n details as PageCheckConfirmDetails,\n context\n );\n }\n\n setLocallyResolvedReviewIds((current) => {\n const next = new Set(current);\n next.add(item.id);\n return next;\n });\n\n const isMergeAction = item.kind === 'boundary' && (effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_NEXT || effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREV || effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREVIOUS);\n\n const isSplitAction = item.kind === 'boundary' && effectiveBoundaryAction === BoundaryReviewActionEnum.SPLIT_HERE;\n if ((isSplitAction || isMergeAction) && effectiveBoundaryAction) {\n const segmentKey = getSegmentReviewKey(item.segment);\n\n setOptimisticRangeAdjustedSegmentKeys((current) => {\n const next = new Set(current);\n\n if (boundaryAction === BoundaryReviewActionEnum.SET_RANGE) {\n next.add(segmentKey);\n } else {\n next.delete(segmentKey);\n }\n\n return next;\n });\n setOptimisticStructuralActions((current) => {\n const next = new Map(current);\n\n next.set(\n segmentKey,\n effectiveBoundaryAction as BoundaryReviewAction\n );\n\n return next;\n });\n }\n\n if (pendingStructuralAdvanceRef.current) {\n pendingStructuralAdvanceRef.current.ready = true;\n\n if (isMergeAction) {\n const titleReview = reviews.find(\n (review) =>\n review.kind === 'label' &&\n getSegmentReviewKey(review.segment) === getSegmentReviewKey(item.segment)\n );\n if (titleReview) requestAnimationFrame(() => selectReview(titleReview));\n }\n } else {\n selectNextReview(item.id);\n }\n } catch (error) {\n if (isStructuralBoundaryAction) {\n pendingStructuralAdvanceRef.current = null;\n }\n onActionError?.(error, context);\n } finally {\n setPendingReviewId(null);\n }\n }, [\n autoAdvanceAfterConfirm,\n disableAllActions,\n onActionError,\n onBoundaryAction,\n onLabelAction,\n onPageAction,\n onPageTypeRevert,\n reviews,\n segments,\n selectReview,\n selectNextReview,\n ]);\n\n useEffect(() => {\n const pendingAdvance = pendingStructuralAdvanceRef.current;\n if (!pendingAdvance?.ready) return;\n\n const currentSegmentSignature =\n JSON.stringify(\n segments.map((segment, index) => ({\n key: getSegmentReviewKey(\n segment,\n index\n ),\n startPage: segment.start_page,\n endPage: segment.end_page,\n version: segment.version ?? null,\n }))\n );\n if (currentSegmentSignature === pendingAdvance.segmentSignature) return;\n\n const targetSegmentIndex = pendingAdvance.action === BoundaryReviewActionEnum.SPLIT_HERE\n ? pendingAdvance.originalSegmentIndex + 1\n : pendingAdvance.action === BoundaryReviewActionEnum.MERGE_PREV ||\n pendingAdvance.action === BoundaryReviewActionEnum.MERGE_PREVIOUS\n ? Math.max(0, pendingAdvance.originalSegmentIndex - 1)\n : pendingAdvance.originalSegmentIndex;\n const segmentIndexByKey = new Map(\n segments.map((segment, index) => [getSegmentReviewKey(segment, index), index])\n );\n const nextReview = reviews.find((item) => {\n const segmentIndex = segmentIndexByKey.get(getSegmentReviewKey(item.segment));\n\n return segmentIndex != null &&\n segmentIndex >= targetSegmentIndex &&\n isEligibleAutoAdvanceReview(item);\n });\n\n if (!nextReview) {\n pendingStructuralAdvanceRef.current = null;\n closeActiveReview();\n return;\n }\n\n requestAnimationFrame(() => {\n pendingStructuralAdvanceRef.current = null;\n selectReview(nextReview);\n });\n }, [\n closeActiveReview,\n isEligibleAutoAdvanceReview,\n reviews,\n segments,\n selectReview,\n ]);\n\n useEffect(() => {\n if (pendingStructuralAdvanceRef.current) return;\n if (activeReviewId && !reviews.some((item) => item.id === activeReviewId)) {\n closeActiveReview();\n }\n }, [activeReviewId, closeActiveReview, reviews]);\n\n useEffect(() => {\n if (!autoSelectReviewOnPageChange) return;\n if (pendingStructuralAdvanceRef.current) return;\n const pageReview = reviews.find((item) => item.pageNumber === currentPage);\n if (pageReview && pageReview.id !== activeReviewId) selectReview(pageReview);\n }, [\n activeReviewId,\n autoSelectReviewOnPageChange,\n currentPage,\n selectReview,\n reviews,\n ]);\n\n useEffect(() => {\n if (pendingStructuralAdvanceRef.current) return;\n if (\n activeReviewId &&\n !reviews.some(\n (item) =>\n item.id === activeReviewId &&\n item.segment.confidence?.awaiting_llm !== true\n )\n ) {\n closeActiveReview();\n }\n }, [activeReviewId, closeActiveReview, reviews]);\n\n const navigationReviews = useMemo(() => {\n const availableReviews = reviews.filter(\n (item) => item.segment.confidence?.awaiting_llm !== true\n );\n\n // When all confidences are visible, navigation follows the badge/document\n // order so input positions and chevrons never jump over another confidence.\n if (filterByConfidence === 'all') return availableReviews;\n\n const remainingConfidenceOrder: ReviewConfidence[] = ['low', 'medium', 'high']\n .filter((confidence): confidence is ReviewConfidence =>\n confidence !== sortByConfidence\n );\n const confidenceOrder = [sortByConfidence, ...remainingConfidenceOrder];\n const confidenceRank = new Map(\n confidenceOrder.map((confidence, index) => [confidence, index])\n );\n\n return availableReviews\n .map((item, index) => ({ item, index }))\n .sort((left, right) => {\n const leftConfidence = left.item.review_step.confidence\n ?.trim()\n .toLowerCase() as ReviewConfidence | undefined;\n const rightConfidence = right.item.review_step.confidence\n ?.trim()\n .toLowerCase() as ReviewConfidence | undefined;\n const leftRank = leftConfidence == null\n ? confidenceOrder.length\n : confidenceRank.get(leftConfidence) ?? confidenceOrder.length;\n const rightRank = rightConfidence == null\n ? confidenceOrder.length\n : confidenceRank.get(rightConfidence) ?? confidenceOrder.length;\n\n return leftRank - rightRank || left.index - right.index;\n })\n .map(({ item }) => item);\n }, [filterByConfidence, sortByConfidence, reviews]);\n\n const selectedNavigationIndex = navigationReviews.findIndex(\n (item) => item.id === selectedNavigationReviewId\n );\n const displayedNavigationIndex = selectedNavigationIndex;\n const [navigationInputValue, setNavigationInputValue] = useState<string | null>(null);\n const [navigationInputError, setNavigationInputError] = useState<\n 'invalid-number' | 'out-of-range' | null\n >(null);\n const navigationInputChangedRef = useRef(false);\n\n const navigateToReviewIndex = useCallback((index: number) => {\n const review = navigationReviews[index];\n if (review) selectReview(review);\n }, [navigationReviews, selectReview]);\n\n const navigateToPageGroupIndex = useCallback((index: number) => {\n if (!activePageGroup || index < 0 || index >= activePageGroup.pages.length) {\n return;\n }\n\n const pageNumber = activePageGroup.pages[index];\n if (pageNumber == null) return;\n\n closeActiveReview();\n setActivePageGroup((current) => current == null ? current : {\n ...current,\n index,\n });\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber,\n requestId: navigationSequenceRef.current,\n });\n }, [activePageGroup, closeActiveReview]);\n\n useEffect(() => {\n if (\n selectedNavigationReviewId &&\n !navigationReviews.some(\n (item) => item.id === selectedNavigationReviewId\n )\n ) {\n setSelectedNavigationReviewId(null);\n }\n }, [navigationReviews, selectedNavigationReviewId]);\n\n useEffect(() => {\n navigationInputChangedRef.current = false;\n setNavigationInputError(null);\n setNavigationInputValue(\n displayedNavigationIndex >= 0\n ? String(displayedNavigationIndex + 1)\n : null\n );\n }, [displayedNavigationIndex, navigationReviews.length]);\n\n useEffect(() => {\n if (!navigationInputChangedRef.current || navigationInputValue == null) return;\n\n const timerId = window.setTimeout(() => {\n const requestedPosition = Number(navigationInputValue.trim());\n const requestedIndex = requestedPosition - 1;\n\n if (\n Number.isInteger(requestedPosition) &&\n requestedIndex >= 0 &&\n requestedIndex < navigationReviews.length\n ) {\n navigationInputChangedRef.current = false;\n navigateToReviewIndex(requestedIndex);\n }\n }, 300);\n\n return () => window.clearTimeout(timerId);\n }, [navigateToReviewIndex, navigationInputValue, navigationReviews.length]);\n\n const badgeLabelById = useMemo(() => {\n const reviewsBySegment = new Map<string, ReviewItem[]>();\n\n reviews.forEach((item) => {\n const segmentReviews = reviewsBySegment.get(getSegmentReviewKey(item.segment)) ?? [];\n segmentReviews.push(item);\n reviewsBySegment.set(getSegmentReviewKey(item.segment), segmentReviews);\n });\n\n const labels = new Map<string, string>();\n reviewsBySegment.forEach((segmentReviews, segmentKey) => {\n const segmentNumber = segmentNumberByKey.get(segmentKey) ?? 1;\n\n segmentReviews\n .sort((left, right) => left.reviewStepIndex - right.reviewStepIndex)\n .forEach((item, index) => {\n labels.set(item.id, `${segmentNumber}${getBadgeSuffix(index)}`);\n });\n });\n\n return labels;\n }, [reviews, segmentNumberByKey]);\n\n const badgeSlotById = useMemo(() => {\n const byPage = new Map<number, ReviewItem[]>();\n reviews.forEach((item) => {\n const pageReviews = byPage.get(item.pageNumber) ?? [];\n pageReviews.push(item);\n byPage.set(item.pageNumber, pageReviews);\n });\n const slots = new Map<string, number>();\n byPage.forEach((pageReviews) => {\n pageReviews.forEach((item, index) => slots.set(item.id, index));\n });\n return slots;\n }, [reviews]);\n\n const setPreloadedRenderRange = useCallback<SetRenderRange>((visibleRange) => ({\n startPage: Math.max(0, visibleRange.startPage - badgePreloadPages),\n endPage: Math.min(\n visibleRange.numPages - 1,\n visibleRange.endPage + badgePreloadPages\n ),\n }), [badgePreloadPages]);\n\n const updateBadgePositions = useCallback(() => {\n const wrapper = wrapperRef.current;\n const viewerHost = viewerHostRef.current;\n if (!wrapper || !viewerHost) return;\n\n const wrapperRect = wrapper.getBoundingClientRect();\n const scrollContainer = viewerHost.querySelector(\n '.rpv-core__inner-pages'\n ) as HTMLElement | null;\n const visibleRect = scrollContainer?.getBoundingClientRect() ??\n viewerHost.getBoundingClientRect();\n\n reviews.forEach((item) => {\n const badge = badgeElementsRef.current.get(item.id);\n if (!badge) return;\n\n const page = viewerHost.querySelector(\n `[data-testid=\"core__page-layer-${item.pageNumber - 1}\"]`\n ) as HTMLElement | null;\n\n if (!page) {\n badge.style.visibility = 'hidden';\n return;\n }\n\n const pageRect = page.getBoundingClientRect();\n const slot = badgeSlotById.get(item.id) ?? 0;\n const badgeTop = pageRect.top + badgeOffsetTop + slot * 40;\n const badgeBottom = badgeTop + (badge.offsetHeight || 32);\n const isBadgePositionVisible =\n badgeTop >= visibleRect.top && badgeBottom <= visibleRect.bottom;\n\n badge.style.top = `${badgeTop - wrapperRect.top}px`;\n badge.style.visibility = isBadgePositionVisible ? 'visible' : 'hidden';\n });\n\n // Page-group redirects do not have review badges. Keep their pill aligned\n // with the redirected PDF page the same way individual badges are.\n const pill = pageGroupElementRef.current;\n if (pill) {\n const pageNumber = activePageGroup?.pages[activePageGroup.index];\n const page = pageNumber == null ? null : viewerHost.querySelector(\n `[data-testid=\"core__page-layer-${pageNumber - 1}\"]`\n ) as HTMLElement | null;\n\n if (!activePageGroup || !page) {\n pill.style.visibility = 'hidden';\n } else {\n const pageRect = page.getBoundingClientRect();\n const pillTop = pageRect.top + badgeOffsetTop;\n const pillBottom = pillTop + (pill.offsetHeight || 25);\n const isPillPositionVisible =\n pillTop >= visibleRect.top && pillBottom <= visibleRect.bottom;\n\n pill.style.top = `${pillTop - wrapperRect.top}px`;\n pill.style.visibility = isPillPositionVisible ? 'visible' : 'hidden';\n }\n }\n\n // A page layer or badge can mount one frame after navigation settles.\n // Position updates therefore also recover the popup anchor instead of\n // relying exclusively on the one-time navigation-settled callback.\n if (activeReviewId && pendingNavigationRef.current == null) {\n const activeBadge = badgeElementsRef.current.get(activeReviewId);\n if (activeBadge && activeBadge.style.visibility !== 'hidden') {\n setAnchorElement((current) => current === activeBadge ? current : activeBadge);\n }\n }\n }, [activePageGroup, activeReviewId, badgeOffsetTop, badgeSlotById, reviews]);\n\n const handleNavigationSettled = useCallback((\n event: PdfNavigationSettledEvent\n ) => {\n const pendingNavigation = pendingNavigationRef.current;\n if (\n !pendingNavigation ||\n pendingNavigation.requestId !== event.requestId ||\n pendingNavigation.pageNumber !== event.pageNumber\n ) {\n return;\n }\n\n pendingNavigationRef.current = null;\n updateBadgePositions();\n\n requestAnimationFrame(() => {\n if (pendingNavigationRef.current != null) return;\n const badge = badgeElementsRef.current.get(pendingNavigation.reviewId);\n if (badge && badge.style.visibility !== 'hidden') setAnchorElement(badge);\n });\n }, [updateBadgePositions]);\n\n useEffect(() => {\n const viewerHost = viewerHostRef.current;\n if (!viewerHost || !showBadges) return;\n\n let frameId: number | null = null;\n const schedulePositionUpdate = () => {\n if (frameId != null) return;\n frameId = requestAnimationFrame(() => {\n frameId = null;\n updateBadgePositions();\n });\n };\n\n viewerHost.addEventListener('scroll', schedulePositionUpdate, true);\n window.addEventListener('resize', schedulePositionUpdate);\n\n const mutationObserver = new MutationObserver(schedulePositionUpdate);\n mutationObserver.observe(viewerHost, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style'],\n });\n\n const resizeObserver = typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(schedulePositionUpdate);\n resizeObserver?.observe(viewerHost);\n\n schedulePositionUpdate();\n\n return () => {\n if (frameId != null) cancelAnimationFrame(frameId);\n viewerHost.removeEventListener('scroll', schedulePositionUpdate, true);\n window.removeEventListener('resize', schedulePositionUpdate);\n mutationObserver.disconnect();\n resizeObserver?.disconnect();\n };\n }, [showBadges, updateBadgePositions]);\n\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{\n ...style,\n display: 'block',\n position: 'relative',\n width: '100%',\n height: '100%',\n minWidth: 0,\n overflowX: 'auto',\n overflowY: 'hidden',\n }}\n >\n <div\n className=\"segment-review-wrapper__container\"\n style={{\n display: 'flex',\n alignItems: 'stretch',\n gap: 0,\n width: '100%',\n minWidth: REVIEW_LAYOUT_MIN_WIDTH,\n height: '100%',\n }}\n >\n <div\n ref={viewerHostRef}\n style={{\n ...viewerStyle,\n flex: '1 1 auto',\n width: showBadges ? 'auto' : '100%',\n minWidth: 0,\n height: '100%',\n boxSizing: 'border-box',\n }}\n >\n <PdfViewer\n highlightText={[]}\n highlightPages={{}}\n highlightCordinatePages={[]}\n useCoordinates={false}\n showRotateButton={true}\n {...pdfViewerProps}\n defaultScale={\n specialZoomLevel === undefined\n ? pdfViewerProps?.defaultScale ?? SpecialZoomLevel.PageFit\n : SEGMENT_PDF_SPECIAL_ZOOM_LEVEL[specialZoomLevel]\n }\n disablePdfAnnotations={disablePdfAnnotations}\n disablePdfTextLayer={disablePdfTextLayer}\n pdfUrl={pdfUrl}\n pdfName={pdfName}\n segments={pdfSegments}\n navigationRequest={navigationRequest}\n onNavigationSettled={handleNavigationSettled}\n setRenderRange={setPreloadedRenderRange}\n onCurrentPageChange={(pageNumber) => {\n setCurrentPage(pageNumber);\n if (\n pendingNavigationRef.current == null &&\n activeReview &&\n activeReview.pageNumber !== pageNumber\n ) {\n closeActiveReview();\n }\n onCurrentPageChange?.(pageNumber);\n }}\n />\n </div>\n\n {showBadges && (\n <aside\n aria-label=\"Page review badges\"\n ref={asideRef}\n style={{\n ...railStyle,\n position: 'relative',\n width: responsiveRailWidth,\n maxWidth: REVIEW_CARD_MAX_WIDTH,\n flex: `0 1 ${responsiveRailWidth}`,\n minHeight: 0,\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n\n {activePageGroup && (\n <span\n ref={pageGroupElementRef}\n style={{\n position: 'absolute',\n top: 0,\n left: 10,\n visibility: 'hidden',\n zIndex: 2,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n minHeight: 25,\n padding: '2px 8px',\n border: '1px solid #E2E8F0',\n borderRadius: 16,\n backgroundColor: '#F8FAFC',\n boxSizing: 'border-box',\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.08)',\n font: 'inherit',\n }}\n >\n <Typography\n fontFamily={'Inter'}\n sx={{ fontSize: 11, fontWeight: 500, color: '#475569', whiteSpace: 'nowrap' }}\n >\n {activePageGroup.label || 'Pages'} Pg: {activePageGroup.index + 1}\n </Typography>\n </span>\n )}\n\n\n {showBadgeNavigation && navigationReviews.length > 0 && !activePageGroup && (\n <nav\n aria-label=\"Review badge navigation\"\n style={{\n position: 'absolute',\n top: 8,\n right: badgeOffsetRight ? badgeOffsetRight : 'auto',\n left: badgeOffsetLeft ? badgeOffsetLeft : 'auto',\n zIndex: 2,\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n width: 128,\n minHeight: 40,\n padding: '4px 6px',\n border: '1px solid #CBD5E1',\n borderRadius: 6,\n backgroundColor: '#FFFFFF',\n boxSizing: 'border-box',\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.06)',\n font: 'inherit',\n }}\n >\n <Tooltip\n title={navigationInputError === 'out-of-range'\n ? 'Please enter valid number present in the range'\n : 'Please enter valid numbers'}\n open={navigationInputError != null}\n placement=\"top\"\n arrow\n >\n <input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n value={navigationInputValue ?? '-'}\n min={0}\n max={navigationReviews.length}\n aria-label=\"Review badge number\"\n aria-invalid={navigationInputError != null}\n onFocus={() => {\n if (navigationInputValue == null) setNavigationInputValue('');\n }}\n onBlur={() => {\n setNavigationInputError(null);\n const numericValue = Number(navigationInputValue);\n if (\n navigationInputValue == null ||\n navigationInputValue === '' ||\n !Number.isInteger(numericValue) ||\n numericValue < 1 ||\n numericValue > navigationReviews.length\n ) {\n navigationInputChangedRef.current = false;\n setNavigationInputValue(\n displayedNavigationIndex >= 0\n ? String(displayedNavigationIndex + 1)\n : null\n );\n }\n }}\n onChange={(event) => {\n const inputValue = event.target.value;\n if (!/^\\d*$/.test(inputValue)) {\n setNavigationInputError('invalid-number');\n return;\n }\n\n const numericValue = Number(inputValue);\n const isOutOfRange = inputValue !== '' && (\n numericValue < 1 || numericValue > navigationReviews.length\n );\n setNavigationInputError(isOutOfRange ? 'out-of-range' : null);\n navigationInputChangedRef.current = true;\n setNavigationInputValue(inputValue);\n }}\n style={{\n width: 30,\n height: 28,\n padding: 0,\n border: `1px solid ${navigationInputError ? '#DC2626' : '#A5B4FC'}`,\n borderRadius: 3,\n color: '#4F46E5',\n backgroundColor: '#FFFFFF',\n textAlign: 'center',\n font: 'inherit',\n fontSize: 15,\n outline: 'none',\n }}\n />\n </Tooltip>\n <span\n aria-label={`${navigationReviews.length} reviews`}\n style={{\n flex: 1,\n color: '#4F46E5',\n fontSize: 14,\n whiteSpace: 'nowrap',\n textAlign: 'center',\n }}\n >\n of {navigationReviews.length}\n </span>\n {(['previous', 'next'] as const).map((direction) => {\n const isPrevious = direction === 'previous';\n const targetIndex = displayedNavigationIndex + (isPrevious ? -1 : 1);\n const isDisabled = targetIndex < 0 || targetIndex >= navigationReviews.length;\n\n return (\n <button\n key={direction}\n type=\"button\"\n aria-label={`${isPrevious ? 'Previous' : 'Next'} review badge`}\n disabled={isDisabled}\n onClick={() => navigateToReviewIndex(targetIndex)}\n style={{\n display: 'grid',\n placeItems: 'center',\n width: 17,\n height: 28,\n padding: 0,\n border: 0,\n background: 'transparent',\n color: isDisabled ? '#C7D2FE' : '#4F46E5',\n cursor: isDisabled ? 'default' : 'pointer',\n }}\n >\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path\n d={isPrevious ? 'M1 7L6 2L11 7' : 'M1 1L6 6L11 1'}\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n );\n })}\n </nav>\n )}\n\n {!activePageGroup && reviews.map((item) => {\n const isActive = activeReviewId === item.id;\n const label = badgeLabelById.get(item.id) ?? '1A';\n const score = item.review_step.score;\n const confidence = item.review_step.confidence;\n const displayScore = formatScore(score, confidence);\n const humanActionBadgeLabel = item.kind === 'boundary'\n ? getBoundaryReviewActionBadgeLabel(\n item.review_step,\n item.segment,\n optimisticStructuralActions.get(getSegmentReviewKey(item.segment))\n )\n : item.kind === 'label'\n ? getTitleReviewActionBadgeLabel(\n item.review_step,\n item.segment,\n optimisticStructuralActions.get(getSegmentReviewKey(item.segment))\n )\n : null;\n const badgeValue = humanActionBadgeLabel ?? (\n displayScore === 'N/A' ? displayScore : `${displayScore}%`\n );\n const isAwaitingLlm = item.segment.confidence?.awaiting_llm === true;\n const confidenceColors = getConfidenceColors(\n score,\n confidence,\n isAwaitingLlm\n );\n const isReviewed = resolvedReviewIds.has(item.id);\n const isDisabled = isAwaitingLlm;\n return (\n <Tooltip\n key={item.id}\n title={isAwaitingLlm ? 'data is being processed' : ''}\n arrow\n >\n <span\n ref={(element) => {\n if (element) badgeElementsRef.current.set(item.id, element);\n else badgeElementsRef.current.delete(item.id);\n }}\n style={{\n position: 'absolute',\n top: 0,\n left: 10,\n visibility: 'hidden',\n display: 'inline-flex',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n }}\n >\n <button\n disabled={isDisabled}\n type=\"button\"\n aria-pressed={isActive}\n aria-label={isAwaitingLlm\n ? `${item.review_step.type} · Page ${item.pageNumber} · Data is being processed`\n : `${item.review_step.type} · Page ${item.pageNumber}`}\n onClick={() => selectReview(item)}\n style={{\n cursor: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-around',\n gap: 4,\n width: humanActionBadgeLabel\n ? (isReviewed && !isAwaitingLlm ? 115 : 90)\n : (isReviewed && !isAwaitingLlm ? 105 : 80),\n minHeight: 25,\n padding: '2px 5px',\n border: `1px solid ${isReviewed && !isAwaitingLlm ? \"#E2E8F0\" : confidenceColors.border}`,\n borderRadius: 16,\n backgroundColor: isReviewed && !isAwaitingLlm ? \"#F8FAFC\" : confidenceColors.background,\n color: isReviewed && !isAwaitingLlm ? \"#475569\" : confidenceColors.text,\n font: 'inherit',\n alignContent: \"center\",\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.08)',\n }}\n >\n {isReviewed && !isAwaitingLlm ? (\n <Typography fontFamily={'Inter'} sx={{ display: 'flex',gap:1, alignItems: 'center', flexDirection: 'row' }}>\n <span style={{ fontSize: 11, fontWeight: 500 }}>{label}</span>\n <span style={{ display: 'flex', alignItems: \"center\" }}><svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={\"#CBD5E1\"} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ fontSize: 11, fontWeight: 500, marginLeft: \"7px\", display: 'flex', alignItems: 'center' }}>{badgeValue}</span>\n\n </span>\n <span style={{ fontSize: 11, fontWeight: 500, display: 'flex', alignItems: 'center' }}>\n <svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={\"#CBD5E1\"} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ display: 'flex', marginLeft: '7px', alignItems: 'center' }}><CircleCheck height={14} width={14} strokeWidth={2} color='#16A34A' /></span>\n </span>\n </Typography>\n ) : (\n <Typography fontFamily={'Inter'} sx={{ display: 'flex', gap: 1, alignItems: 'center', flexDirection: 'row' }}>\n <span style={{ fontSize: 11, fontWeight: 500 }}>{label}</span>\n <span style={{ display: 'flex', alignItems: \"center\" }}><svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={confidenceColors.divider} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ fontSize: 11, fontWeight: 500, marginLeft: \"7px\", display: 'flex', alignItems: 'center' }}>{badgeValue}</span>\n </span>\n </Typography>\n )}\n </button>\n </span>\n </Tooltip>\n );\n })}\n </aside>\n )}\n </div>\n\n {activeReview && anchorElement && (\n <CardWrapper\n anchorElement={anchorElement}\n placement=\"bottom-start\"\n offset={{ top: 8 }}\n width={Math.min(asideWidth, REVIEW_CARD_MAX_WIDTH)}\n maxWidth={REVIEW_CARD_MAX_WIDTH}\n heightBuffer={heightBuffer ?? 25}\n >\n {isCognitiveIntegrityOpen && (\n <CognitiveIntegrity\n width=\"100%\"\n maxWidth=\"100%\"\n score={activeReview.review_step.score}\n reasons={activeCognitiveReasons}\n reason={activeReview.review_step.reason}\n gap={activeReview.review_step.gap}\n onBack={() => setIsCognitiveIntegrityOpen(false)}\n onClose={closeActiveReview}\n />\n )}\n <div style={{ display: isCognitiveIntegrityOpen ? 'none' : 'block' }}>\n {resolvedReviewIds.has(activeReview.id) ?\n <ReviewedCard\n width=\"100%\"\n maxWidth=\"100%\"\n headerName={activeReview.kind === 'page'\n ? 'Page format approved'\n : activeReviewActionLabel === 'Split'\n ? 'Split approved'\n : activeReviewActionLabel === 'Merged'\n ? 'Merge approved'\n : 'User approved'}\n headerIcon={activeReview.kind === 'page'\n ? <Check size={18} strokeWidth={2} />\n : activeReviewActionLabel === 'Merged'\n ? <GitMerge size={18} strokeWidth={2} />\n : activeReviewActionLabel === 'Split'\n ? <ChartBreakoutCircle width={18} height={18} />\n : <CircleCheck size={18} strokeWidth={2} />}\n title={activeReviewTitle}\n pageNo={`Page ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n summary={shouldShowRevert && activeRevertData ? (\n <RevertCard\n key={activeReview.id}\n icon={<CircleCheck size={14} strokeWidth={2} />}\n title={activeReviewTitle}\n pageRange={`Page ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n description={activeRevertDescription ?? null}\n revertData={activeRevertData}\n confirmDisabled={activeReview.kind === 'page' ? !canRevertActiveReview : onRevert == null || !canRevertActiveReview}\n showDocumentHeader={false}\n onRevert={async () => {\n if (activeReview.kind === 'page') {\n if (!onPageTypeRevert || activePageClassificationIds.length === 0) {\n const error = new Error(\n 'SegmentReviewPdfWrapper requires onPageTypeRevert and at least one classification id to revert a page-type decision.'\n );\n onActionError?.(error, getReviewContext(activeReview));\n throw error;\n }\n\n let result: void | RevertActionResult = undefined;\n for (const classificationId of activePageClassificationIds) {\n result = await onPageTypeRevert(\n {\n classification_id: classificationId,\n human_verdict: 'No',\n },\n getReviewContext(activeReview)\n );\n }\n return result;\n }\n\n if (!onRevert) {\n throw new Error(\n 'SegmentReviewPdfWrapper requires onRevert to handle a revert confirmation.'\n );\n }\n\n if (!activeRevertInfo) {\n throw new Error(\n 'There is no valid revert operation for this review.'\n );\n }\n\n const expectedRevertType =\n isStructuralReviewResult\n ? 'boundary'\n : activeReview.kind === 'label'\n ? 'label'\n : activeReview.kind === 'boundary'\n ? 'boundary'\n : null;\n\n const actualRevertType =\n normalizeRevertType(activeRevertInfo.type);\n\n if (\n expectedRevertType &&\n actualRevertType !== expectedRevertType\n ) {\n throw new Error(\n `Cannot use ${actualRevertType ?? 'unknown'} revert metadata for this review. Expected ${expectedRevertType}.`\n );\n }\n\n return onRevert(\n activeRevertInfo,\n getReviewContext(activeReview)\n );\n }}\n onRevertError={(error) => {\n onActionError?.(error, getReviewContext(activeReview));\n }}\n onRevertComplete={(result) => {\n setLocallyResolvedReviewIds(\n () => new Set<string>()\n );\n\n if (activeReview.kind !== 'page') {\n setOptimisticRangeAdjustedSegmentKeys(\n () => new Set<string>()\n );\n setOptimisticStructuralActions(\n () => new Map<string, BoundaryReviewAction>()\n );\n }\n const revertedReviewId = activeReview.id;\n\n const revertedSegment = activeRevertData.previousSegments[0] ??\n activeRevertData.currentSegment;\n const anchorRect = anchorElement?.getBoundingClientRect();\n const viewerRect = viewerHostRef.current?.getBoundingClientRect();\n const toastWidth = Math.min(\n REVIEW_CARD_MAX_WIDTH,\n Math.max(220, asideWidth)\n );\n const preferredLeft = anchorRect?.left ??\n ((viewerRect?.right ?? window.innerWidth - toastWidth - 8) + 8);\n const toastLeft = Math.max(\n 8,\n Math.min(preferredLeft, window.innerWidth - toastWidth - 8)\n );\n const toastTop = anchorRect?.bottom == null\n ? Math.max(8, viewerRect?.top ?? 8)\n : anchorRect.bottom + 8;\n setLocallyResolvedReviewIds(() => new Set<string>());\n if (activeReview.kind !== 'page') {\n pendingStructuralAdvanceRef.current = null;\n }\n setIsRevertToastVisible(false);\n setRevertSuccess({\n title: activeReviewActionLabel === 'Split'\n ? 'Split reverted'\n : activeReviewActionLabel === 'Merged'\n ? 'Merge reverted'\n : 'Approval reverted',\n description: result?.message?.trim() || null,\n segment: revertedSegment,\n position: {\n top: toastTop,\n left: toastLeft,\n width: toastWidth,\n },\n });\n closeActiveReview();\n }}\n />\n ) : undefined}\n additionalActions={activeBoundaryReview ? (\n <ReviewedBoundaryActions\n metadata={activeBoundaryReview.metadata}\n reviewAction={activeReview.segment.review_action ?? undefined}\n startPage={activeReview.segment.start_page}\n endPage={activeReview.segment.end_page}\n title={activeReviewTitle}\n previousSegmentTitle={previousSegmentTitle}\n nextSegmentTitle={nextSegmentTitle}\n disabled={\n disableAllActions ||\n !onBoundaryAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(action, details) => {\n void completeAction(activeBoundaryReview, action, details);\n }}\n />\n ) : undefined}\n cognitiveScore={activeReview.review_step.score}\n styles={{\n root: { borderColor: '#16A34A' },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: '#16A34A',\n },\n },\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n : activeReview.kind === 'boundary' ? (\n <BoundaryCard\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n totalPages={totalPages}\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.question ?? null}\n revertSummary={activeRevertSummary}\n cognitiveScore={activeReview.review_step.score}\n metadata={activeReview.metadata}\n reviewAction={activeReview.segment.review_action ?? undefined}\n previousSegmentTitle={previousSegmentTitle}\n nextSegmentTitle={nextSegmentTitle}\n manualPrompt={manualPrompt ?? \"Set a custom boundary\"}\n defaultStartPage={activeReview.segment.start_page}\n defaultEndPage={activeReview.segment.end_page}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onBoundaryAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(_selectedIndex, option, details) => {\n if (details && isBoundaryReviewAction(option.id)) {\n void completeAction(activeReview, option.id, details);\n }\n }}\n onAdjustManually={() => onAdjustManually?.(getReviewContext(activeReview))}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : activeReview.kind === 'label' ? (\n <LabelCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={\n activeReview.metadata.current_label ||\n activeReview.segment.label ||\n activeReview.segment.title\n }\n pageNo={`Pages ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n content={activeReview.review_step.question ?? null}\n revertSummary={activeRevertSummary}\n cognitiveScore={activeReview.review_step.score}\n metadata={activeReview.metadata}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onLabelAction ||\n pendingReviewId === activeReview.id\n }\n confirmationBlocked={isTitleConfirmationBlocked}\n confirmationWarning={isTitleConfirmationBlocked\n ? 'Please confirm the boundary before confirming the title.'\n : undefined}\n onActionConfirm={(action, details) => {\n void completeAction(activeReview, action, details);\n }}\n onAdjustManually={() => onAdjustManually?.(getReviewContext(activeReview))}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : activeReview.metadata.type_choices?.length === 2 ? (\n <PageTypeChoiceCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.reason}\n choices={activeReview.metadata.type_choices}\n cognitiveScore={activeReview.review_step.score}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onPageAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(selectedPageTypes) => {\n void completePageTypeChoices(activeReview, selectedPageTypes);\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : (\n <PageCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.reason}\n cognitiveScore={activeReview.review_step.score}\n pageType={activeReview.metadata.page_type}\n metadata={activeReview.metadata}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onPageAction ||\n pendingReviewId === activeReview.id\n }\n onActionConfirm={(action, details) => {\n void completeAction(activeReview, action, details);\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n )}\n </div>\n </CardWrapper>\n )}\n {revertSuccess && (\n <Portal>\n <Box\n aria-live=\"polite\"\n sx={{\n position: 'fixed',\n top: revertSuccess.position.top,\n left: revertSuccess.position.left,\n zIndex: 1600,\n width: revertSuccess.position.width,\n maxWidth: 'calc(100vw - 16px)',\n opacity: isRevertToastVisible ? 1 : 0,\n transform: isRevertToastVisible\n ? 'translateY(0)'\n : 'translateY(-6px)',\n transition: 'opacity 500ms ease, transform 500ms ease',\n filter: 'drop-shadow(0 12px 24px rgba(15, 23, 42, 0.18))',\n pointerEvents: isRevertToastVisible ? 'auto' : 'none',\n }}\n >\n <RevertSuccessCard\n title={revertSuccess.title}\n description={revertSuccess.description}\n onReview={() => reviewRevertedSegment(revertSuccess.segment)}\n />\n </Box>\n </Portal>\n )}\n </div>\n );\n}\n"],"names":["REVIEW_CARD_MAX_WIDTH","SegmentPdfSpecialZoomLevel","SEGMENT_PDF_SPECIAL_ZOOM_LEVEL","ActualSize","SpecialZoomLevel","PageFit","PageWidth","getReviewContext","item","reviewId","id","segment","pageNumber","SegmentReviewPdfWrapper","pdfUrl","pdfName","segments","totalPages","styles","pdfViewerProps","specialZoomLevel","showBadges","sortByConfidence","filterByConfidence","showBadgeNavigation","autoSelectReviewOnPageChange","autoAdvanceAfterConfirm","autoAdvanceScoreBand","badgePreloadPages","badgeOffsetTop","badgeOffsetRight","badgeOffsetLeft","initialReviewId","manualPrompt","heightBuffer","onBoundaryAction","onLabelAction","onPageAction","onPageTypeRevert","onRevert","onActiveReviewChange","onCurrentPageChange","onActionError","disableAllActions","disablePdfAnnotations","disablePdfTextLayer","disableTitleCheckUntilBoundaryCheckCompleted","onAdjustManually","onCognitiveClick","className","style","viewerStyle","railStyle","redirectionData","onBadgeSelected","console","log","boundaryReviews","labelReviews","pageReviews","useMemo","extractSegmentReviewData","optimisticStructuralActions","setOptimisticStructuralActions","useState","Map","optimisticRangeAdjustedSegmentKeys","setOptimisticRangeAdjustedSegmentKeys","Set","segmentNumberByKey","numberByKey","nextSegmentNumber","forEach","index","segmentKey","getSegmentReviewKey","has","set","segmentsWithTitleReviews","map","review","pendingMergeImpactedSegmentKeys","getPendingMergeImpactedSegmentKeys","useEffect","current","changed","next","action","find","hasPolledStructuralAction","delete","optimisticMergeImpactedSegmentKeys","getOptimisticMergeImpactedSegmentKeys","asideRef","useRef","reviews","filter","shouldHideStructuralBoundaryReview","review_step","get","kind","metadata","focus_page","start_page","page_num","sort","left","right","leftSegmentNumber","Number","MAX_SAFE_INTEGER","rightSegmentNumber","reviewStepIndex","localeCompare","pdfSegments","title","label","trim","page_count","end_page","currentPage","setCurrentPage","activeReviewId","setActiveReviewId","selectedNavigationReviewId","setSelectedNavigationReviewId","isCognitiveIntegrityOpen","setIsCognitiveIntegrityOpen","anchorElement","setAnchorElement","navigationRequest","setNavigationRequest","locallyResolvedReviewIds","setLocallyResolvedReviewIds","pendingReviewId","setPendingReviewId","activePageGroup","setActivePageGroup","revertSuccess","setRevertSuccess","isRevertToastVisible","setIsRevertToastVisible","navigationSequenceRef","pendingNavigationRef","pendingStructuralAdvanceRef","badgeElementsRef","pageGroupElementRef","wrapperRef","viewerHostRef","asideWidth","setAsideWidth","requestedRailWidth","aside","width","responsiveRailWidth","size","updateAsideWidth","nextWidth","getBoundingClientRect","resizeObserver","ResizeObserver","observe","disconnect","resolvedReviewIds","resolvedIds","add","activeReview","isTitleConfirmationBlocked","some","boundaryScore","getResolvedScore","score","confidence","activeSegmentIndex","findIndex","previousSegment","nextSegment","previousSegmentTitle","nextSegmentTitle","activeReviewColors","getConfidenceColors","awaiting_llm","activeCognitiveReasons","reasons","length","hasCognitiveIntegrityContent","Boolean","text","includes","type","toLowerCase","reason","gap","activeReviewActionLabel","getBoundaryReviewActionBadgeLabel","stable_key","getTitleReviewActionBadgeLabel","activeTitleDecisionValues","human_action_enum","human_resolution","isMergeOrSplitTitleReview","value","normalizedValue","toUpperCase","hasVisibleBoundaryReviewForActiveSegment","isHiddenBoundaryStructuralTitleReview","activeBoundaryReview","boundaryReview","review_action","boundary_margin","user_actions","activeReviewTitle","activeStepRevertInfo","revert","segmentRevertInfo","normalizeRevertType","structuralStepRevertInfo","review_steps","reverse","step","stepType","fallbackRevertInfo","fallbackRevertDecision","decision","isSetRangeStructuralResult","current_segment_ids","previous_state","isStructuralReviewResult","activeRevertInfo","structuralSummaryStep","operation_id","flatMap","change_summary","activeRevertSummary","summary","activeRevertDescription","activeRevertData","currentSegment","startPage","endPage","previousSegments","activePageClassificationIds","type_choices","choice","classification_id","canRevertActiveReview","revertable","shouldShowRevert","requestPageNavigation","useCallback","requestId","selectReview","segment_id","frameId","requestAnimationFrame","fadeTimeoutId","window","setTimeout","removeTimeoutId","cancelAnimationFrame","clearTimeout","pages","pageIndex","targetPage","closeActiveReview","groupLabel","matchingReview","classificationId","segmentId","segmentStartPage","isInteger","redirectionPageType","pageType","matchingPage","matchesPageType","page_type","reviewRevertedSegment","targetReview","isEligibleAutoAdvanceReview","excludedReviewId","scoreBand","getReviewScoreBand","matchesScoreBand","hasCurrentLocalResolution","isReviewStepResolutionCurrent","isReviewStepResolved","selectNextReview","completedReviewId","completedIndex","nextReview","completePageTypeChoices","async","selectedPageTypes","choices","selectedTypes","context","orderedChoices","isLeftSelected","PageCheckActionEnum","YES","NO","error","completeAction","details","boundaryAction","boundaryDetails","effectiveBoundaryAction","BoundaryReviewActionEnum","SET_RANGE","newStart","newEnd","expanded","shrunk","MERGE_PREV","MERGE_NEXT","SPLIT_HERE","isStructuralBoundaryAction","MERGE_PREVIOUS","originalSegmentIndex","segmentSignature","JSON","stringify","key","version","ready","isMergeAction","titleReview","pendingAdvance","targetSegmentIndex","Math","max","segmentIndexByKey","segmentIndex","pageReview","navigationReviews","availableReviews","remainingConfidenceOrder","confidenceOrder","confidenceRank","leftConfidence","rightConfidence","displayedNavigationIndex","navigationInputValue","setNavigationInputValue","navigationInputError","setNavigationInputError","navigationInputChangedRef","navigateToReviewIndex","String","timerId","requestedPosition","requestedIndex","badgeLabelById","reviewsBySegment","segmentReviews","push","labels","segmentNumber","suffix","fromCharCode","floor","getBadgeSuffix","badgeSlotById","byPage","slots","setPreloadedRenderRange","visibleRange","min","numPages","updateBadgePositions","wrapper","viewerHost","wrapperRect","scrollContainer","querySelector","visibleRect","badge","page","visibility","pageRect","slot","badgeTop","top","badgeBottom","offsetHeight","isBadgePositionVisible","bottom","pill","pillTop","pillBottom","isPillPositionVisible","activeBadge","handleNavigationSettled","event","pendingNavigation","schedulePositionUpdate","addEventListener","mutationObserver","MutationObserver","childList","subtree","attributes","attributeFilter","removeEventListener","jsxs","ref","display","position","height","minWidth","overflowX","overflowY","children","alignItems","jsx","flex","boxSizing","PdfViewer","highlightText","highlightPages","highlightCordinatePages","useCoordinates","showRotateButton","defaultScale","onNavigationSettled","setRenderRange","maxWidth","minHeight","overflow","zIndex","justifyContent","padding","border","borderRadius","backgroundColor","boxShadow","font","Typography","fontFamily","sx","fontSize","fontWeight","color","whiteSpace","Tooltip","open","placement","arrow","inputMode","pattern","onFocus","onBlur","numericValue","onChange","inputValue","target","test","isOutOfRange","textAlign","outline","direction","isPrevious","targetIndex","isDisabled","disabled","onClick","placeItems","background","cursor","viewBox","fill","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","isActive","displayScore","formatScore","humanActionBadgeLabel","badgeValue","isAwaitingLlm","confidenceColors","isReviewed","element","alignContent","flexDirection","xmlns","marginLeft","CircleCheck","divider","CardWrapper","offset","CognitiveIntegrity","onBack","onClose","ReviewedCard","headerName","headerIcon","Check","GitMerge","ChartBreakoutCircle","pageNo","RevertCard","icon","pageRange","description","revertData","confirmDisabled","showDocumentHeader","Error","result","human_verdict","expectedRevertType","actualRevertType","onRevertError","onRevertComplete","revertedSegment","anchorRect","viewerRect","toastWidth","preferredLeft","innerWidth","toastLeft","toastTop","message","additionalActions","ReviewedBoundaryActions","reviewAction","onConfirm","cognitiveScore","root","borderColor","header","BoundaryCard","content","question","revertSummary","defaultStartPage","defaultEndPage","cardBorder","_selectedIndex","option","isBoundaryReviewAction","LabelCheck","current_label","confirmationBlocked","confirmationWarning","onActionConfirm","PageTypeChoiceCheck","PageCheck","Portal","Box","opacity","transform","transition","pointerEvents","RevertSuccessCard","onReview"],"mappings":"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"}
1
+ {"version":3,"file":"SegmentReviewPdfWrapper.js","sources":["../../../src/features/SegmentReviewComponents/SegmentReviewPdfWrapper.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from 'react';\nimport { SpecialZoomLevel, type SetRenderRange } from '@react-pdf-viewer/core';\nimport PdfViewer, {\n type PdfNavigationRequest,\n type PdfNavigationSettledEvent,\n type PdfViewerProps,\n} from '../PdfViewer/PdfViewer';\nimport BoundaryCard, {\n BoundaryReviewActionEnum,\n isBoundaryReviewAction,\n type BoundaryReviewAction,\n type BoundaryReviewConfirmDetails,\n} from './BoundaryCard';\nimport CardWrapper from './CardWrapper';\nimport CognitiveIntegrity from './CognitiveIntegrity';\nimport LabelCheck, {\n type LabelReviewAction,\n type LabelReviewConfirmDetails,\n} from './LabelCheck';\nimport PageCheck, {\n PageCheckActionEnum,\n type PageCheckAction,\n type PageCheckConfirmDetails,\n type PageCheckPageType,\n} from './PageCheck';\nimport PageTypeChoiceCheck from './PageTypeChoiceCheck';\nimport {\n extractSegmentReviewData,\n getSegmentReviewKey,\n type ExtractedBoundaryReview,\n type ExtractedLabelReview,\n type ExtractedPageReview,\n type SegmentRevertInfo,\n type SegmentReviewSource,\n} from './reviewStepAdapters';\nimport { Check, CircleCheck, GitMerge } from 'lucide-react';\nimport { Box, Portal, Tooltip, Typography } from '@mui/material';\nimport ReviewedCard from './ReviewedCard';\nimport ReviewedBoundaryActions from './ReviewedBoundaryActions';\nimport RevertCard, {\n type RevertActionResult,\n type RevertData,\n type SegmentData,\n} from './RevertCard';\nimport RevertSuccessCard from './RevertSuccessCard';\nimport {\n formatScore,\n getBoundaryReviewActionBadgeLabel,\n getConfidenceColors,\n getOptimisticMergeImpactedSegmentKeys,\n getPendingMergeImpactedSegmentKeys,\n getReviewScoreBand,\n getResolvedScore,\n getTitleReviewActionBadgeLabel,\n hasPolledStructuralAction,\n isReviewStepResolved,\n isReviewStepResolutionCurrent,\n shouldHideStructuralBoundaryReview,\n} from './helper';\nimport ChartBreakoutCircle from './ChartBreakoutCircle';\n\ntype ForwardedPdfViewerProps = Partial<Omit<\n PdfViewerProps,\n | 'pdfUrl'\n | 'pdfName'\n | 'segments'\n | 'onCurrentPageChange'\n | 'navigationRequest'\n | 'onNavigationSettled'\n | 'renderPage'\n | 'setRenderRange'\n>>;\n\ntype ReviewItem =\n | (ExtractedBoundaryReview<SegmentReviewSource> & {\n kind: 'boundary';\n pageNumber: number;\n })\n | (ExtractedLabelReview<SegmentReviewSource> & {\n kind: 'label';\n pageNumber: number;\n })\n | (ExtractedPageReview<SegmentReviewSource> & {\n kind: 'page';\n pageNumber: number;\n });\n\ntype RevertSuccessState = {\n title: string;\n description: string | null;\n segment: SegmentData;\n position: {\n top: number;\n left: number;\n width: number;\n };\n};\n\nconst REVIEW_CARD_MAX_WIDTH = 260;\nconst REVIEW_LAYOUT_MIN_WIDTH = 700;\nconst BOUNDARY_TITLE_CHECK_BYPASS_SCORE = 85;\n\nexport type ReviewConfidence = 'low' | 'medium' | 'high';\nexport type ReviewConfidenceFilter = 'low' | 'high' | 'all';\nexport type ReviewRedirectionType = 'boundary' | 'label' | 'page' | 'pageGroup';\n\nexport enum SegmentPdfSpecialZoomLevel {\n ActualSize = 'ActualSize',\n PageFit = 'PageFit',\n PageWidth = 'PageWidth',\n}\n\nexport interface SelectedBadgeData {\n reviewId: string;\n segment_id: string | null;\n reviewStepIndex: number;\n kind: 'boundary' | 'label' | 'page';\n pageNumber: number;\n metadata: Record<string, any>;\n}\n\nconst SEGMENT_PDF_SPECIAL_ZOOM_LEVEL: Record<\n SegmentPdfSpecialZoomLevel,\n SpecialZoomLevel\n> = {\n [SegmentPdfSpecialZoomLevel.ActualSize]: SpecialZoomLevel.ActualSize,\n [SegmentPdfSpecialZoomLevel.PageFit]: SpecialZoomLevel.PageFit,\n [SegmentPdfSpecialZoomLevel.PageWidth]: SpecialZoomLevel.PageWidth,\n};\n\nexport interface SegmentReviewActionContext {\n reviewId: string;\n segment: SegmentReviewSource;\n pageNumber: number;\n}\n\nexport interface PageTypeRevertDetails {\n classification_id: string;\n human_verdict: 'No';\n}\n\nexport interface RedirectionData {\n /** Change for every redirect request, including repeated redirects to the same badge. */\n requestKey?: string | number;\n pageNumber?: string;\n type?: ReviewRedirectionType;\n /** Stable backend segment id used to disambiguate reviews on the same page. */\n segmentId?: string;\n /** Exact review id returned by the wrapper, if the parent has it. */\n reviewId?: string;\n /** Stable backend page_classifications[].questions[].id for page-type redirects. */\n classificationId?: string;\n /** Optional page-type disambiguation when table/drawing checks share a page. */\n pageType?: string;\n\n /** type: 'pageGroup' only — ordered pages to step through, e.g. a segment's tabular pages. */\n pages?: number[];\n /** type: 'pageGroup' only — which page in `pages` to land on first. Defaults to 0. */\n pageIndex?: number;\n /** type: 'pageGroup' only — short label for the floating pill, e.g. \"Tabular\". */\n groupLabel?: string;\n}\n\nexport interface SegmentReviewPdfWrapperProps {\n pdfUrl: string;\n pdfName?: string;\n /** Live backend segments. Changes are re-extracted automatically. */\n segments: readonly SegmentReviewSource[];\n pdfViewerProps?: ForwardedPdfViewerProps;\n totalPages?: number;\n /** Special PDF zoom mode. Defaults to PageFit. */\n specialZoomLevel?: SegmentPdfSpecialZoomLevel;\n heightBuffer?: number;\n showBadges?: boolean;\n /** @deprecated Reviewed steps are always hidden from badges and navigation. */\n showResolvedBadges?: boolean;\n /** Confidence group placed first in the badge navigator. */\n sortByConfidence?: ReviewConfidence;\n /** Only render and navigate badges matching this confidence. */\n filterByConfidence?: ReviewConfidenceFilter;\n showBadgeNavigation?: boolean;\n autoSelectReviewOnPageChange?: boolean;\n autoAdvanceAfterConfirm?: boolean;\n /** Restrict post-confirm auto-advance to pending reviews in this score band. */\n autoAdvanceScoreBand?: ReviewConfidence;\n /** Number of PDF page layers mounted before and after the visible range. */\n badgePreloadPages?: number;\n /** Vertical badge offset from the page's top-right edge. */\n badgeOffsetTop?: number;\n /** Horizontal inset from the external badge rail's right edge. */\n badgeOffsetRight?: number;\n badgeOffsetLeft?: number;\n initialReviewId?: string;\n\n onBoundaryAction?: (\n action: BoundaryReviewAction,\n details: BoundaryReviewConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n onLabelAction?: (\n action: LabelReviewAction,\n details: LabelReviewConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n onPageAction?: (\n action: PageCheckAction,\n details: PageCheckConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n /**\n * Revert a confirmed page-type decision by submitting `human_verdict: \"No\"`.\n * Refresh the latest classifications before resolving this callback.\n */\n onPageTypeRevert?: (\n details: PageTypeRevertDetails,\n context: SegmentReviewActionContext\n ) => void | RevertActionResult | Promise<void | RevertActionResult>;\n /**\n * Submit the operation-level revert, poll it to completion, and refresh the\n * latest segments before resolving this callback. `revert` is null when the\n * current segment does not include revert metadata.\n */\n onRevert?: (\n revert: SegmentRevertInfo | null,\n context: SegmentReviewActionContext\n ) => void | RevertActionResult | Promise<void | RevertActionResult>;\n /** Called when a badge is selected, with its complete source segment. */\n onActiveReviewChange?: (\n reviewId: string | null,\n segment: SegmentReviewSource | null\n ) => void;\n onBadgeSelected?: (data: SelectedBadgeData) => void;\n onCurrentPageChange?: (pageNumber: number) => void;\n onActionError?: (error: unknown, context: SegmentReviewActionContext) => void;\n onAdjustManually?: (context: SegmentReviewActionContext) => void;\n onCognitiveClick?: (context: SegmentReviewActionContext) => void;\n\n className?: string;\n style?: CSSProperties;\n viewerStyle?: CSSProperties;\n railStyle?: CSSProperties;\n redirectionData?: RedirectionData;\n styles?: Record<string, React.CSSProperties>;\n disableAllActions?: boolean;\n disablePdfAnnotations?: boolean;\n /** Disable the transparent PDF text layer that can overflow rotated pages. */\n disablePdfTextLayer?: boolean;\n disableTitleCheckUntilBoundaryCheckCompleted?: boolean;\n manualPrompt?: string;\n /** Closes any review card, Cognitive Integrity panel, or review popup. */\n closePopups?: boolean;\n}\n\nconst getReviewContext = (item: ReviewItem): SegmentReviewActionContext => ({\n reviewId: item.id,\n segment: item.segment,\n pageNumber: item.pageNumber,\n});\n\n/** Converts a zero-based index to A, B, ... Z, AA, AB, and so on. */\nconst getBadgeSuffix = (index: number): string => {\n let value = index + 1;\n let suffix = '';\n\n while (value > 0) {\n value -= 1;\n suffix = String.fromCharCode(65 + (value % 26)) + suffix;\n value = Math.floor(value / 26);\n }\n\n return suffix;\n};\n\n/**\n * Orchestrates the PDF, review badges, page navigation, active card and actions.\n * It consumes backend-shaped segments directly; cards never parse the raw payload.\n */\nexport default function SegmentReviewPdfWrapper({\n pdfUrl,\n pdfName,\n segments,\n totalPages,\n styles,\n pdfViewerProps,\n specialZoomLevel,\n showBadges = true,\n sortByConfidence = 'low',\n filterByConfidence = 'all',\n showBadgeNavigation = true,\n autoSelectReviewOnPageChange = false,\n autoAdvanceAfterConfirm = true,\n autoAdvanceScoreBand,\n badgePreloadPages = 8,\n badgeOffsetTop = 20,\n badgeOffsetRight = 68,\n badgeOffsetLeft = 0,\n initialReviewId,\n manualPrompt,\n heightBuffer,\n onBoundaryAction,\n onLabelAction,\n onPageAction,\n onPageTypeRevert,\n onRevert,\n onActiveReviewChange,\n onCurrentPageChange,\n onActionError,\n disableAllActions = false,\n disablePdfAnnotations = false,\n disablePdfTextLayer = true,\n disableTitleCheckUntilBoundaryCheckCompleted = false,\n onAdjustManually,\n onCognitiveClick,\n className,\n style,\n viewerStyle,\n railStyle,\n redirectionData,\n onBadgeSelected,\n closePopups = false,\n}: SegmentReviewPdfWrapperProps) {\n console.log(\"LOG: TOTAL PAGE IN PARENT\", totalPages);\n const { boundaryReviews, labelReviews, pageReviews } = useMemo(\n () => extractSegmentReviewData(segments),\n [segments]\n );\n const [optimisticStructuralActions, setOptimisticStructuralActions] = useState<\n Map<string, BoundaryReviewAction>\n >(() => new Map());\n const [optimisticRangeAdjustedSegmentKeys, setOptimisticRangeAdjustedSegmentKeys] =\n useState<Set<string>>(() => new Set());\n\n const segmentNumberByKey = useMemo(\n () => {\n const numberByKey = new Map<string, number>();\n let nextSegmentNumber = 1;\n\n segments.forEach((segment, index) => {\n const segmentKey = getSegmentReviewKey(segment, index);\n if (!numberByKey.has(segmentKey)) {\n numberByKey.set(segmentKey, nextSegmentNumber);\n nextSegmentNumber += 1;\n }\n });\n\n return numberByKey;\n },\n [segments]\n );\n const segmentsWithTitleReviews = useMemo(\n () => new Set(labelReviews.map((review) => getSegmentReviewKey(review.segment))),\n [labelReviews]\n );\n const pendingMergeImpactedSegmentKeys = useMemo(\n () => getPendingMergeImpactedSegmentKeys(segments),\n [segments]\n );\n useEffect(() => {\n setOptimisticStructuralActions((current) => {\n let changed = false;\n const next = new Map(current);\n\n current.forEach((action, segmentKey) => {\n const segment = segments.find((item) =>\n getSegmentReviewKey(item) === segmentKey\n );\n if (!segment || hasPolledStructuralAction(segment, action)) {\n next.delete(segmentKey);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n }, [segments]);\n useEffect(() => {\n setOptimisticRangeAdjustedSegmentKeys((current) => {\n let changed = false;\n const next = new Set(current);\n\n current.forEach((segmentKey) => {\n if (!optimisticStructuralActions.has(segmentKey)) {\n next.delete(segmentKey);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n }, [optimisticStructuralActions]);\n const optimisticMergeImpactedSegmentKeys = useMemo(() => {\n return getOptimisticMergeImpactedSegmentKeys(\n segments,\n optimisticStructuralActions,\n optimisticRangeAdjustedSegmentKeys\n );\n }, [optimisticRangeAdjustedSegmentKeys, optimisticStructuralActions, segments]);\n const asideRef = useRef(null as HTMLDivElement | null);\n const reviews = useMemo<ReviewItem[]>(() => [\n ...boundaryReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !shouldHideStructuralBoundaryReview(\n review.review_step,\n review.segment,\n segmentsWithTitleReviews.has(getSegmentReviewKey(review.segment)),\n optimisticStructuralActions.get(getSegmentReviewKey(review.segment))\n )\n )\n .map((review) => ({\n ...review,\n kind: 'boundary' as const,\n pageNumber: review.metadata.focus_page ?? review.segment.start_page,\n })),\n ...labelReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment))\n )\n .map((review) => ({\n ...review,\n kind: 'label' as const,\n pageNumber: review.segment.start_page,\n })),\n ...pageReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment))\n )\n .map((review) => ({\n ...review,\n kind: 'page' as const,\n pageNumber: review.metadata.page_num ?? review.segment.start_page,\n })),\n ].sort((left, right) => {\n const leftSegmentNumber =\n segmentNumberByKey.get(getSegmentReviewKey(left.segment)) ?? Number.MAX_SAFE_INTEGER;\n const rightSegmentNumber =\n segmentNumberByKey.get(getSegmentReviewKey(right.segment)) ?? Number.MAX_SAFE_INTEGER;\n\n return left.pageNumber - right.pageNumber ||\n leftSegmentNumber - rightSegmentNumber ||\n left.reviewStepIndex - right.reviewStepIndex ||\n left.id.localeCompare(right.id);\n }), [\n boundaryReviews,\n labelReviews,\n pageReviews,\n optimisticMergeImpactedSegmentKeys,\n optimisticStructuralActions,\n pendingMergeImpactedSegmentKeys,\n segmentNumberByKey,\n segmentsWithTitleReviews,\n ]);\n\n // PdfToolbar displays `segment.title`, while backend segment titles can be\n // generic values such as \"Document 1\". Preserve the complete segment object\n // and expose its human-readable label as the viewer-facing title.\n const pdfSegments = useMemo(() => segments.map((segment) => ({\n ...segment,\n title: segment.label?.trim() || segment.title,\n page_count: segment.page_count ?? segment.end_page - segment.start_page + 1,\n })), [segments]);\n\n const [currentPage, setCurrentPage] = useState(1);\n const [activeReviewId, setActiveReviewId] = useState<string | null>(\n initialReviewId ?? null\n );\n const [selectedNavigationReviewId, setSelectedNavigationReviewId] = useState<\n string | null\n >(initialReviewId ?? null);\n const [isCognitiveIntegrityOpen, setIsCognitiveIntegrityOpen] = useState(false);\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const [navigationRequest, setNavigationRequest] = useState<PdfNavigationRequest | null>(null);\n const [locallyResolvedReviewIds, setLocallyResolvedReviewIds] = useState<Set<string>>(\n () => new Set()\n );\n const [pendingReviewId, setPendingReviewId] = useState<string | null>(null);\n const [activePageGroup, setActivePageGroup] = useState<{\n pages: number[];\n index: number;\n label: string;\n } | null>(null);\n \n\n const [revertSuccess, setRevertSuccess] = useState<RevertSuccessState | null>(null);\n const [isRevertToastVisible, setIsRevertToastVisible] = useState(false);\n const navigationSequenceRef = useRef(0);\n const pendingNavigationRef = useRef<{\n requestId: number;\n pageNumber: number;\n reviewId: string;\n } | null>(null);\n const pendingStructuralAdvanceRef = useRef<{\n action: BoundaryReviewAction;\n originalSegmentIndex: number;\n segmentSignature: string;\n ready: boolean;\n } | null>(null);\n const badgeElementsRef = useRef(new Map<string, HTMLSpanElement>());\n const pageGroupElementRef = useRef<HTMLSpanElement | null>(null);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const viewerHostRef = useRef<HTMLDivElement | null>(null);\n const [asideWidth, setAsideWidth] = useState(REVIEW_CARD_MAX_WIDTH);\n const requestedRailWidth = styles?.aside?.width ?? '40%';\n const responsiveRailWidth = `min(${\n typeof requestedRailWidth === 'number' ? `${requestedRailWidth}px` : requestedRailWidth\n }, ${REVIEW_CARD_MAX_WIDTH}px, 100%)`;\n\n const closeAllPopups = useCallback(() => {\n pendingNavigationRef.current = null;\n setIsCognitiveIntegrityOpen(false);\n setActiveReviewId(null);\n setAnchorElement(null);\n setActivePageGroup(null);\n setRevertSuccess(null);\n setIsRevertToastVisible(false);\n onActiveReviewChange?.(null, null);\n }, [onActiveReviewChange]);\n\n useEffect(() => {\n if (closePopups) closeAllPopups();\n }, [closeAllPopups, closePopups]);\n\n useEffect(() => {\n setLocallyResolvedReviewIds((current) => {\n if (current.size === 0) {\n return current;\n }\n\n const next = new Set(current);\n let changed = false;\n\n reviews.forEach((item) => {\n /**\n * Backend has now returned a definitive review object,\n * so optimistic state is no longer necessary.\n */\n if (\n item.review_step.review?.action != null &&\n next.has(item.id)\n ) {\n next.delete(item.id);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n}, [reviews]);\n\n useEffect(() => {\n const aside = asideRef.current;\n if (!aside || !showBadges) return;\n\n const updateAsideWidth = () => {\n const nextWidth = aside.getBoundingClientRect().width;\n if (nextWidth > 0) setAsideWidth(nextWidth);\n };\n\n updateAsideWidth();\n const resizeObserver = typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(updateAsideWidth);\n resizeObserver?.observe(aside);\n\n return () => resizeObserver?.disconnect();\n }, [showBadges]);\n\n const resolvedReviewIds = useMemo(() => {\n const resolvedIds = new Set<string>();\n\n reviews.forEach((item) => {\n const isResolved = item.review_step.review?.action != null;\n\n if (isResolved) {\n resolvedIds.add(item.id);\n }\n });\n\n return resolvedIds;\n}, [reviews]);\n\n const activeReview = useMemo(\n () => reviews.find((item) => item.id === activeReviewId) ?? null,\n [activeReviewId, reviews]\n );\n const isTitleConfirmationBlocked = useMemo(() => {\n if (\n !disableTitleCheckUntilBoundaryCheckCompleted ||\n activeReview?.kind !== 'label'\n ) {\n return false;\n }\n\n return boundaryReviews.some((review) => {\n if (\n getSegmentReviewKey(review.segment) !== getSegmentReviewKey(activeReview.segment) ||\n resolvedReviewIds.has(review.id)\n ) {\n return false;\n }\n\n const boundaryScore = getResolvedScore(\n review.review_step.score,\n review.review_step.confidence\n );\n\n // A high-confidence boundary can skip manual confirmation. Missing or\n // lower scores keep the existing boundary-first confirmation requirement.\n return boundaryScore == null ||\n boundaryScore < BOUNDARY_TITLE_CHECK_BYPASS_SCORE;\n });\n }, [\n activeReview,\n boundaryReviews,\n disableTitleCheckUntilBoundaryCheckCompleted,\n resolvedReviewIds,\n ]);\n const activeSegmentIndex = activeReview == null\n ? -1\n : segments.findIndex(\n (segment) => getSegmentReviewKey(segment) === getSegmentReviewKey(activeReview.segment)\n );\n const previousSegment = activeSegmentIndex > 0\n ? segments[activeSegmentIndex - 1]\n : undefined;\n const nextSegment = activeSegmentIndex >= 0\n ? segments[activeSegmentIndex + 1]\n : undefined;\n const previousSegmentTitle = previousSegment?.label?.trim() || previousSegment?.title;\n const nextSegmentTitle = nextSegment?.label?.trim() || nextSegment?.title;\n const activeReviewColors = getConfidenceColors(\n activeReview?.review_step.score,\n activeReview?.review_step.confidence,\n activeReview?.segment.confidence?.awaiting_llm\n );\n const activeCognitiveReasons = activeReview?.review_step.reasons?.length\n ? activeReview.review_step.reasons\n : activeReview?.segment.confidence?.reasons ?? [];\n const hasCognitiveIntegrityContent = Boolean(\n activeCognitiveReasons.some((item) =>\n item.text.trim() && ['evidence', 'gap'].includes(item.type.trim().toLowerCase())\n ) ||\n activeReview?.review_step.reason?.trim() || activeReview?.review_step.gap?.trim()\n );\n const activeReviewActionLabel = activeReview == null\n ? null\n : activeReview.kind === 'boundary'\n ? getBoundaryReviewActionBadgeLabel(\n activeReview.review_step,\n activeReview.segment,\n optimisticStructuralActions.get(activeReview.segment.stable_key ?? \"\")\n )\n : getTitleReviewActionBadgeLabel(\n activeReview.review_step,\n activeReview.segment,\n optimisticStructuralActions.get(activeReview.segment.stable_key ?? \"\")\n );\n const activeTitleDecisionValues = activeReview?.kind === 'label'\n ? [\n activeReviewActionLabel,\n activeReview.review_step.human_action_enum,\n activeReview.review_step.review?.action,\n activeReview.review_step.human_resolution?.action,\n ]\n : [];\n const isMergeOrSplitTitleReview = activeReview?.kind === 'label' &&\n activeTitleDecisionValues.some((value) => {\n const normalizedValue = value?.trim().toUpperCase() ?? '';\n return normalizedValue.includes('MERGE') || normalizedValue.includes('SPLIT');\n });\n const hasVisibleBoundaryReviewForActiveSegment = activeReview != null &&\n reviews.some(\n (review) =>\n review.kind === 'boundary' &&\n getSegmentReviewKey(review.segment) ===\n getSegmentReviewKey(activeReview.segment)\n );\n const isHiddenBoundaryStructuralTitleReview =\n isMergeOrSplitTitleReview && !hasVisibleBoundaryReviewForActiveSegment;\n const shouldShowReviewedBoundaryActions =\n activeReview?.kind === 'boundary' || isHiddenBoundaryStructuralTitleReview;\n const activeBoundaryReview = !shouldShowReviewedBoundaryActions || activeReview == null\n ? undefined\n : (() => {\n if (activeReview.kind === 'boundary') return activeReview;\n\n const boundaryReview = boundaryReviews.find(\n (review) =>\n getSegmentReviewKey(review.segment) ===\n getSegmentReviewKey(activeReview.segment)\n );\n\n if (boundaryReview) {\n return {\n ...boundaryReview,\n kind: 'boundary' as const,\n pageNumber:\n boundaryReview.metadata.focus_page ??\n boundaryReview.segment.start_page,\n };\n }\n\n return {\n ...activeReview,\n kind: 'boundary' as const,\n pageNumber:\n activeReview.segment.review_action?.focus_page ??\n activeReview.segment.start_page,\n metadata: {\n focus_page: activeReview.segment.review_action?.focus_page ?? null,\n boundary_margin: activeReview.segment.boundary_margin ?? null,\n user_actions: [],\n },\n };\n })();\n const activeReviewTitle = activeReview == null\n ? ''\n : activeReview.segment.label?.trim() || activeReview.segment.title;\n const activeStepRevertInfo =\n activeReview?.review_step.revert;\n\nconst segmentRevertInfo =\n activeReview?.segment.revert;\n\nconst normalizeRevertType = (\n type?: string | null\n) => type?.trim().toLowerCase();\n\nconst structuralStepRevertInfo =\n activeReview == null\n ? undefined\n : [...(activeReview.segment.review_steps ?? [])]\n .reverse()\n .find((step) => {\n const stepType = step.type\n ?.trim()\n .toLowerCase();\n\n if (\n stepType !== 'page_boundary' &&\n stepType !== 'page boundary review'\n ) {\n return false;\n }\n\n return (\n normalizeRevertType(step.revert?.type) ===\n 'boundary'\n );\n })\n ?.revert;\n const fallbackRevertInfo = activeStepRevertInfo ??\n activeReview?.segment.revert ??\n structuralStepRevertInfo;\n const fallbackRevertDecision = fallbackRevertInfo?.decision.trim().toUpperCase();\n const activeRevertActionLabel =\n activeReviewActionLabel ?? (\n fallbackRevertDecision\n ?.includes('SPLIT')\n ? 'Split'\n : fallbackRevertDecision\n ?.includes('MERGE')\n ? 'Merged'\n : null\n );\n const isSetRangeStructuralResult = activeReview?.kind === 'label' && structuralStepRevertInfo?.decision?.trim().toUpperCase() === 'SET_RANGE' && structuralStepRevertInfo.current_segment_ids.length !== structuralStepRevertInfo.previous_state.length;\n const isStructuralReviewResult = activeReviewActionLabel === 'Merged' || activeReviewActionLabel === 'Split' || isSetRangeStructuralResult;\n const activeRevertInfo =\n activeReview == null ? undefined : isStructuralReviewResult ? (\n normalizeRevertType(structuralStepRevertInfo?.type) === 'boundary' ? structuralStepRevertInfo :\n normalizeRevertType(segmentRevertInfo?.type) === 'boundary' ? segmentRevertInfo :\n normalizeRevertType(activeStepRevertInfo?.type) === 'boundary' ? activeStepRevertInfo : undefined\n )\n : activeReview.kind === 'label'\n ? (normalizeRevertType(activeStepRevertInfo?.type) === 'label' ? activeStepRevertInfo : undefined)\n : activeReview.kind === 'boundary'\n ? (\n normalizeRevertType(\n activeStepRevertInfo?.type\n ) === 'boundary'\n ? activeStepRevertInfo\n : normalizeRevertType(\n structuralStepRevertInfo?.type\n ) === 'boundary'\n ? structuralStepRevertInfo\n : normalizeRevertType(\n segmentRevertInfo?.type\n ) === 'boundary'\n ? segmentRevertInfo\n : undefined\n )\n : undefined;\n\n\n const structuralSummaryStep = isStructuralReviewResult && activeRevertInfo?.operation_id ? segments.flatMap((segment)=> segment.review_steps ?? []).find((step) => {\n const stepType = step.type?.trim().toLowerCase();\n\n const isBoundaryStep = stepType === 'page_boundary' || stepType === 'page boundary review';\n if(!isBoundaryStep) return false;\n\n const operationId = step.human_resolution?.operation_id ?? step.revert?.operation_id ?? step.operation_id;\n\n return (\n operationId === activeRevertInfo.operation_id && Boolean(step.human_resolution?.change_summary?.trim())\n );\n }) : undefined;\n const activeRevertSummary = activeRevertInfo?.summary?.trim() || null;\n const activeRevertDescription = isStructuralReviewResult ? (structuralSummaryStep?.human_resolution?.change_summary?.trim() || activeRevertInfo?.summary?.trim() || '') : (activeReview?.review_step?.human_resolution?.change_summary?.trim() || activeReview?.review_step?.summary?.trim() || '');\n const activeRevertData: RevertData | null = activeReview?.kind === 'page'\n ? {\n currentSegment: {\n title: activeReviewTitle,\n startPage: activeReview.segment.start_page,\n endPage: activeReview.segment.end_page,\n },\n previousSegments: [],\n }\n : activeReview && activeRevertInfo\n ? {\n currentSegment: {\n title: activeReviewTitle,\n startPage: activeReview.segment.start_page,\n endPage: activeReview.segment.end_page,\n },\n previousSegments: (activeRevertInfo.previous_state ?? []).flatMap<SegmentData>(\n (segment) => {\n const title = segment.label === null\n ? 'Untitled document'\n : segment.label?.trim();\n return title\n ? [{\n title,\n startPage: segment.start_page,\n endPage: segment.end_page,\n }]\n : [];\n }\n ),\n }\n : null;\n const activePageClassificationIds = activeReview?.kind === 'page'\n ? activeReview.metadata.type_choices?.map(\n (choice) => choice.classification_id\n ) ?? (\n activeReview.metadata.classification_id\n ? [activeReview.metadata.classification_id]\n : []\n )\n : [];\n const canRevertActiveReview = activeReview?.kind === 'page'\n ? Boolean(onPageTypeRevert && activePageClassificationIds.length > 0)\n : Boolean(\n activeRevertInfo?.operation_id &&\n activeRevertInfo?.type &&\n activeRevertInfo?.revertable !== false\n );\n const shouldShowRevert = Boolean(\n activeRevertData && canRevertActiveReview\n );\n\n const requestPageNavigation = useCallback((pageNumber: number, reviewId: string) => {\n navigationSequenceRef.current += 1;\n pendingNavigationRef.current = {\n requestId: navigationSequenceRef.current,\n pageNumber,\n reviewId,\n };\n setNavigationRequest({\n pageNumber,\n requestId: navigationSequenceRef.current,\n });\n }, []);\n\n // const closeActiveReview = useCallback(() => {\n // pendingNavigationRef.current = null;\n // setIsCognitiveIntegrityOpen(false);\n // setActiveReviewId(null);\n // setAnchorElement(null);\n // onActiveReviewChange?.(null, null);\n // }, [onActiveReviewChange]);\n\n const selectReview = useCallback((item: ReviewItem) => {\n if (item.segment.confidence?.awaiting_llm === true) return;\n \n onBadgeSelected?.({\n reviewId: item.id,\n segment_id: item.segment.segment_id ?? null,\n reviewStepIndex: item.reviewStepIndex,\n kind: item.kind,\n pageNumber: item.pageNumber,\n metadata: item.metadata,\n });\n \n setActivePageGroup(null);\n setRevertSuccess(null);\n setActiveReviewId(item.id);\n setSelectedNavigationReviewId(item.id);\n setIsCognitiveIntegrityOpen(false);\n // The badge moves when page navigation scrolls the viewer. Keep the popup\n // closed until the badge reaches its final position.\n setAnchorElement(null);\n requestPageNavigation(item.pageNumber, item.id);\n onActiveReviewChange?.(item.id, item.segment);\n }, [onActiveReviewChange, onBadgeSelected, requestPageNavigation]);\n\n useEffect(() => {\n if (!revertSuccess) return;\n\n const frameId = requestAnimationFrame(() => setIsRevertToastVisible(true));\n const fadeTimeoutId = window.setTimeout(() => {\n setIsRevertToastVisible(false);\n }, 3500);\n const removeTimeoutId = window.setTimeout(() => {\n setRevertSuccess(null);\n }, 4000);\n\n return () => {\n cancelAnimationFrame(frameId);\n window.clearTimeout(fadeTimeoutId);\n window.clearTimeout(removeTimeoutId);\n };\n }, [revertSuccess]);\n\n useEffect(() => {\n if (!redirectionData) return;\n\n\n if (redirectionData.type === 'pageGroup') {\n const pages = redirectionData.pages ?? [];\n const index = redirectionData.pageIndex ?? 0;\n const targetPage = pages[index];\n if (targetPage == null) return;\n\n closeActiveReview();\n setActivePageGroup({ pages, index, label: redirectionData.groupLabel ?? '' });\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: targetPage,\n requestId: navigationSequenceRef.current,\n });\n return;\n }\n setActivePageGroup(null);\n\n\n if (redirectionData.reviewId) {\n const matchingReview = reviews.find((item) =>\n item.id === redirectionData.reviewId &&\n (!redirectionData.type || item.kind === redirectionData.type)\n );\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n }\n\n if (redirectionData.classificationId) {\n const matchingReview = reviews.find((item) =>\n item.kind === 'page' &&\n (\n item.metadata.classification_id === redirectionData.classificationId ||\n item.metadata.type_choices?.some(\n (choice) => choice.classification_id === redirectionData.classificationId\n )\n ) &&\n (!redirectionData.segmentId ||\n item.segment.segment_id === redirectionData.segmentId) &&\n (!redirectionData.type || item.kind === redirectionData.type)\n );\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n }\n\n if (!redirectionData.pageNumber || !redirectionData.type) return;\n\n const segmentStartPage = Number(redirectionData.pageNumber);\n if (!Number.isInteger(segmentStartPage) || segmentStartPage < 1) return;\n const redirectionPageType = redirectionData.pageType?.trim().toLowerCase();\n\n const matchingReview = reviews.find((item) => {\n const matchingPage = item.kind === 'page'\n ? item.pageNumber\n : item.segment.start_page;\n const matchesPageType = item.kind !== 'page' ||\n !redirectionPageType ||\n item.metadata.page_type === redirectionPageType ||\n item.metadata.type_choices?.some(\n (choice) => choice.page_type === redirectionPageType\n );\n const matchesSegment = !redirectionData.segmentId ||\n item.segment.segment_id === redirectionData.segmentId;\n\n return matchesSegment &&\n matchingPage === segmentStartPage &&\n item.kind === redirectionData.type &&\n matchesPageType;\n });\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n\n // No review exists for this page (e.g. disableAllActions steps with no\n // page_classifications) — still jump the viewer directly.\n if (redirectionData.type === 'page') {\n closeActiveReview();\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: segmentStartPage,\n requestId: navigationSequenceRef.current,\n });\n }\n \n }, [redirectionData, selectReview, reviews]);\n\n const closeActiveReview = useCallback(() => {\n pendingNavigationRef.current = null;\n setIsCognitiveIntegrityOpen(false);\n setActiveReviewId(null);\n setAnchorElement(null);\n onActiveReviewChange?.(null, null);\n }, [onActiveReviewChange]);\n\n const reviewRevertedSegment = useCallback((segment: RevertData['currentSegment']) => {\n setIsRevertToastVisible(false);\n setRevertSuccess(null);\n\n const targetReview = reviews.find((item) =>\n !resolvedReviewIds.has(item.id) &&\n item.kind === 'boundary' &&\n item.segment.start_page === segment.startPage &&\n item.segment.end_page === segment.endPage\n ) ?? reviews.find((item) =>\n !resolvedReviewIds.has(item.id) &&\n item.segment.start_page <= segment.startPage &&\n item.segment.end_page >= segment.startPage\n );\n\n if (targetReview) {\n selectReview(targetReview);\n return;\n }\n\n closeActiveReview();\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: segment.startPage,\n requestId: navigationSequenceRef.current,\n });\n }, [closeActiveReview, resolvedReviewIds, reviews, selectReview]);\n\n const isEligibleAutoAdvanceReview = useCallback((\n item: ReviewItem,\n excludedReviewId?: string\n ) => {\n const scoreBand = getReviewScoreBand(\n item.review_step.score\n );\n const matchesScoreBand = autoAdvanceScoreBand == null ||\n scoreBand === autoAdvanceScoreBand;\n const hasCurrentLocalResolution =\n locallyResolvedReviewIds.has(item.id) &&\n isReviewStepResolutionCurrent(item.review_step, item.segment);\n\n return item.id !== excludedReviewId &&\n matchesScoreBand &&\n item.segment.confidence?.awaiting_llm !== true &&\n !isReviewStepResolved(item.review_step, item.segment) &&\n !hasCurrentLocalResolution;\n }, [autoAdvanceScoreBand, locallyResolvedReviewIds]);\n\n const selectNextReview = useCallback((completedReviewId: string) => {\n if (!autoAdvanceAfterConfirm) {\n closeActiveReview();\n return;\n }\n\n const completedIndex = reviews.findIndex(\n (item) => item.id === completedReviewId\n );\n const nextReview = reviews.find((item, index) =>\n index > completedIndex &&\n isEligibleAutoAdvanceReview(item, completedReviewId)\n ) ?? reviews.find((item) =>\n isEligibleAutoAdvanceReview(item, completedReviewId)\n );\n\n if (!nextReview) {\n closeActiveReview();\n return;\n }\n\n requestAnimationFrame(() => selectReview(nextReview));\n }, [\n autoAdvanceAfterConfirm,\n closeActiveReview,\n isEligibleAutoAdvanceReview,\n reviews,\n selectReview,\n ]);\n\n const completePageTypeChoices = useCallback(async (\n item: Extract<ReviewItem, { kind: 'page' }>,\n selectedPageTypes: readonly PageCheckPageType[]\n ) => {\n if (disableAllActions || !onPageAction || selectedPageTypes.length === 0) return;\n\n const choices = item.metadata.type_choices ?? [];\n if (choices.length !== 2) return;\n\n const selectedTypes = new Set(selectedPageTypes);\n const context = getReviewContext(item);\n const orderedChoices = [...choices].sort((left, right) => {\n const isLeftSelected = selectedTypes.has(left.page_type);\n const isRightSelected = selectedTypes.has(right.page_type);\n return isLeftSelected === isRightSelected ? 0 : isLeftSelected ? -1 : 1;\n });\n\n setPendingReviewId(item.id);\n\n try {\n for (const choice of orderedChoices) {\n const action = selectedTypes.has(choice.page_type)\n ? PageCheckActionEnum.YES\n : PageCheckActionEnum.NO;\n\n await onPageAction(\n action,\n {\n action,\n pageType: choice.page_type,\n metadata: {\n user_actions: [PageCheckActionEnum.YES, PageCheckActionEnum.NO],\n page_num: item.metadata.page_num,\n page_type: choice.page_type,\n classification_id: choice.classification_id,\n },\n },\n context\n );\n }\n\n setLocallyResolvedReviewIds((current) => {\n const next = new Set(current);\n next.add(item.id);\n return next;\n });\n selectNextReview(item.id);\n } catch (error) {\n onActionError?.(error, context);\n } finally {\n setPendingReviewId(null);\n }\n }, [\n disableAllActions,\n onActionError,\n onPageAction,\n selectNextReview,\n ]);\n\n const completeAction = useCallback(async (\n item: ReviewItem,\n action: BoundaryReviewAction | LabelReviewAction | PageCheckAction,\n details: BoundaryReviewConfirmDetails | LabelReviewConfirmDetails | PageCheckConfirmDetails\n ) => {\n if (disableAllActions) return;\n if (item.kind === 'boundary' && !onBoundaryAction) return;\n if (item.kind === 'label' && !onLabelAction) return;\n if (item.kind === 'page' && !onPageAction) return;\n\n const context = getReviewContext(item);\n const boundaryAction = action as BoundaryReviewAction;\n const boundaryDetails =\n details as BoundaryReviewConfirmDetails;\n\nconst effectiveBoundaryAction =\n boundaryAction ===\n BoundaryReviewActionEnum.SET_RANGE\n ? (() => {\n const newStart =\n boundaryDetails.startPage;\n\n const newEnd =\n boundaryDetails.endPage;\n\n if (\n newStart == null ||\n newEnd == null\n ) {\n return null;\n }\n\n const expanded =\n newStart <\n item.segment.start_page ||\n newEnd >\n item.segment.end_page;\n\n const shrunk =\n newStart >\n item.segment.start_page ||\n newEnd <\n item.segment.end_page;\n\n if (expanded && !shrunk) {\n return newStart <\n item.segment.start_page\n ? BoundaryReviewActionEnum.MERGE_PREV\n : BoundaryReviewActionEnum.MERGE_NEXT;\n }\n\n if (shrunk) {\n return BoundaryReviewActionEnum.SPLIT_HERE;\n }\n\n return null;\n })()\n : boundaryAction;\n const isStructuralBoundaryAction =\n item.kind === 'boundary' &&\n onBoundaryAction != null &&\n autoAdvanceAfterConfirm &&\n (\n effectiveBoundaryAction === BoundaryReviewActionEnum.SPLIT_HERE ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_NEXT ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREV ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREVIOUS\n );\n const originalSegmentIndex = isStructuralBoundaryAction\n ? segments.findIndex(\n (segment) => getSegmentReviewKey(segment) === getSegmentReviewKey(item.segment)\n )\n : -1;\n\n if (isStructuralBoundaryAction && originalSegmentIndex >= 0 && effectiveBoundaryAction) {\n pendingStructuralAdvanceRef.current = {\n action: effectiveBoundaryAction as BoundaryReviewAction,\n originalSegmentIndex,\n\n segmentSignature: JSON.stringify(\n segments.map((segment, index) => ({\n key: getSegmentReviewKey(\n segment,\n index\n ),\n startPage: segment.start_page,\n endPage: segment.end_page,\n version: segment.version ?? null,\n }))\n ),\n\n ready: false,\n };\n }\n\n setPendingReviewId(item.id);\n\n try {\n if (item.kind === 'boundary') {\n await onBoundaryAction?.(\n action as BoundaryReviewAction,\n details as BoundaryReviewConfirmDetails,\n context\n );\n } else if (item.kind === 'label') {\n await onLabelAction?.(\n action as LabelReviewAction,\n details as LabelReviewConfirmDetails,\n context\n );\n } else if (item.kind === 'page') {\n await onPageAction?.(\n action as PageCheckAction,\n details as PageCheckConfirmDetails,\n context\n );\n }\n\n setLocallyResolvedReviewIds((current) => {\n const next = new Set(current);\n next.add(item.id);\n return next;\n });\n\n const isMergeAction = item.kind === 'boundary' && (effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_NEXT || effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREV || effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREVIOUS);\n\n const isSplitAction = item.kind === 'boundary' && effectiveBoundaryAction === BoundaryReviewActionEnum.SPLIT_HERE;\n if ((isSplitAction || isMergeAction) && effectiveBoundaryAction) {\n const segmentKey = getSegmentReviewKey(item.segment);\n\n setOptimisticRangeAdjustedSegmentKeys((current) => {\n const next = new Set(current);\n\n if (boundaryAction === BoundaryReviewActionEnum.SET_RANGE) {\n next.add(segmentKey);\n } else {\n next.delete(segmentKey);\n }\n\n return next;\n });\n setOptimisticStructuralActions((current) => {\n const next = new Map(current);\n\n next.set(\n segmentKey,\n effectiveBoundaryAction as BoundaryReviewAction\n );\n\n return next;\n });\n }\n\n if (pendingStructuralAdvanceRef.current) {\n pendingStructuralAdvanceRef.current.ready = true;\n\n if (isMergeAction) {\n const titleReview = reviews.find(\n (review) =>\n review.kind === 'label' &&\n getSegmentReviewKey(review.segment) === getSegmentReviewKey(item.segment)\n );\n if (titleReview) requestAnimationFrame(() => selectReview(titleReview));\n }\n } else {\n selectNextReview(item.id);\n }\n } catch (error) {\n if (isStructuralBoundaryAction) {\n pendingStructuralAdvanceRef.current = null;\n }\n onActionError?.(error, context);\n } finally {\n setPendingReviewId(null);\n }\n }, [\n autoAdvanceAfterConfirm,\n disableAllActions,\n onActionError,\n onBoundaryAction,\n onLabelAction,\n onPageAction,\n onPageTypeRevert,\n reviews,\n segments,\n selectReview,\n selectNextReview,\n ]);\n\n useEffect(() => {\n const pendingAdvance = pendingStructuralAdvanceRef.current;\n if (!pendingAdvance?.ready) return;\n\n const currentSegmentSignature =\n JSON.stringify(\n segments.map((segment, index) => ({\n key: getSegmentReviewKey(\n segment,\n index\n ),\n startPage: segment.start_page,\n endPage: segment.end_page,\n version: segment.version ?? null,\n }))\n );\n if (currentSegmentSignature === pendingAdvance.segmentSignature) return;\n\n const targetSegmentIndex = pendingAdvance.action === BoundaryReviewActionEnum.SPLIT_HERE\n ? pendingAdvance.originalSegmentIndex + 1\n : pendingAdvance.action === BoundaryReviewActionEnum.MERGE_PREV ||\n pendingAdvance.action === BoundaryReviewActionEnum.MERGE_PREVIOUS\n ? Math.max(0, pendingAdvance.originalSegmentIndex - 1)\n : pendingAdvance.originalSegmentIndex;\n const segmentIndexByKey = new Map(\n segments.map((segment, index) => [getSegmentReviewKey(segment, index), index])\n );\n const nextReview = reviews.find((item) => {\n const segmentIndex = segmentIndexByKey.get(getSegmentReviewKey(item.segment));\n\n return segmentIndex != null &&\n segmentIndex >= targetSegmentIndex &&\n isEligibleAutoAdvanceReview(item);\n });\n\n if (!nextReview) {\n pendingStructuralAdvanceRef.current = null;\n closeActiveReview();\n return;\n }\n\n requestAnimationFrame(() => {\n pendingStructuralAdvanceRef.current = null;\n selectReview(nextReview);\n });\n }, [\n closeActiveReview,\n isEligibleAutoAdvanceReview,\n reviews,\n segments,\n selectReview,\n ]);\n\n useEffect(() => {\n if (pendingStructuralAdvanceRef.current) return;\n if (activeReviewId && !reviews.some((item) => item.id === activeReviewId)) {\n closeActiveReview();\n }\n }, [activeReviewId, closeActiveReview, reviews]);\n\n useEffect(() => {\n if (!autoSelectReviewOnPageChange) return;\n if (pendingStructuralAdvanceRef.current) return;\n const pageReview = reviews.find((item) => item.pageNumber === currentPage);\n if (pageReview && pageReview.id !== activeReviewId) selectReview(pageReview);\n }, [\n activeReviewId,\n autoSelectReviewOnPageChange,\n currentPage,\n selectReview,\n reviews,\n ]);\n\n useEffect(() => {\n if (pendingStructuralAdvanceRef.current) return;\n if (\n activeReviewId &&\n !reviews.some(\n (item) =>\n item.id === activeReviewId &&\n item.segment.confidence?.awaiting_llm !== true\n )\n ) {\n closeActiveReview();\n }\n }, [activeReviewId, closeActiveReview, reviews]);\n\n const navigationReviews = useMemo(() => {\n const availableReviews = reviews.filter(\n (item) => item.segment.confidence?.awaiting_llm !== true\n );\n\n // When all confidences are visible, navigation follows the badge/document\n // order so input positions and chevrons never jump over another confidence.\n if (filterByConfidence === 'all') return availableReviews;\n\n const remainingConfidenceOrder: ReviewConfidence[] = ['low', 'medium', 'high']\n .filter((confidence): confidence is ReviewConfidence =>\n confidence !== sortByConfidence\n );\n const confidenceOrder = [sortByConfidence, ...remainingConfidenceOrder];\n const confidenceRank = new Map(\n confidenceOrder.map((confidence, index) => [confidence, index])\n );\n\n return availableReviews\n .map((item, index) => ({ item, index }))\n .sort((left, right) => {\n const leftConfidence = left.item.review_step.confidence\n ?.trim()\n .toLowerCase() as ReviewConfidence | undefined;\n const rightConfidence = right.item.review_step.confidence\n ?.trim()\n .toLowerCase() as ReviewConfidence | undefined;\n const leftRank = leftConfidence == null\n ? confidenceOrder.length\n : confidenceRank.get(leftConfidence) ?? confidenceOrder.length;\n const rightRank = rightConfidence == null\n ? confidenceOrder.length\n : confidenceRank.get(rightConfidence) ?? confidenceOrder.length;\n\n return leftRank - rightRank || left.index - right.index;\n })\n .map(({ item }) => item);\n }, [filterByConfidence, sortByConfidence, reviews]);\n\n const selectedNavigationIndex = navigationReviews.findIndex(\n (item) => item.id === selectedNavigationReviewId\n );\n const displayedNavigationIndex = selectedNavigationIndex;\n const [navigationInputValue, setNavigationInputValue] = useState<string | null>(null);\n const [navigationInputError, setNavigationInputError] = useState<\n 'invalid-number' | 'out-of-range' | null\n >(null);\n const navigationInputChangedRef = useRef(false);\n\n const navigateToReviewIndex = useCallback((index: number) => {\n const review = navigationReviews[index];\n if (review) selectReview(review);\n }, [navigationReviews, selectReview]);\n\n const navigateToPageGroupIndex = useCallback((index: number) => {\n if (!activePageGroup || index < 0 || index >= activePageGroup.pages.length) {\n return;\n }\n\n const pageNumber = activePageGroup.pages[index];\n if (pageNumber == null) return;\n\n closeActiveReview();\n setActivePageGroup((current) => current == null ? current : {\n ...current,\n index,\n });\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber,\n requestId: navigationSequenceRef.current,\n });\n }, [activePageGroup, closeActiveReview]);\n\n useEffect(() => {\n if (\n selectedNavigationReviewId &&\n !navigationReviews.some(\n (item) => item.id === selectedNavigationReviewId\n )\n ) {\n setSelectedNavigationReviewId(null);\n }\n }, [navigationReviews, selectedNavigationReviewId]);\n\n useEffect(() => {\n navigationInputChangedRef.current = false;\n setNavigationInputError(null);\n setNavigationInputValue(\n displayedNavigationIndex >= 0\n ? String(displayedNavigationIndex + 1)\n : null\n );\n }, [displayedNavigationIndex, navigationReviews.length]);\n\n useEffect(() => {\n if (!navigationInputChangedRef.current || navigationInputValue == null) return;\n\n const timerId = window.setTimeout(() => {\n const requestedPosition = Number(navigationInputValue.trim());\n const requestedIndex = requestedPosition - 1;\n\n if (\n Number.isInteger(requestedPosition) &&\n requestedIndex >= 0 &&\n requestedIndex < navigationReviews.length\n ) {\n navigationInputChangedRef.current = false;\n navigateToReviewIndex(requestedIndex);\n }\n }, 300);\n\n return () => window.clearTimeout(timerId);\n }, [navigateToReviewIndex, navigationInputValue, navigationReviews.length]);\n\n const badgeLabelById = useMemo(() => {\n const reviewsBySegment = new Map<string, ReviewItem[]>();\n\n reviews.forEach((item) => {\n const segmentReviews = reviewsBySegment.get(getSegmentReviewKey(item.segment)) ?? [];\n segmentReviews.push(item);\n reviewsBySegment.set(getSegmentReviewKey(item.segment), segmentReviews);\n });\n\n const labels = new Map<string, string>();\n reviewsBySegment.forEach((segmentReviews, segmentKey) => {\n const segmentNumber = segmentNumberByKey.get(segmentKey) ?? 1;\n\n segmentReviews\n .sort((left, right) => left.reviewStepIndex - right.reviewStepIndex)\n .forEach((item, index) => {\n labels.set(item.id, `${segmentNumber}${getBadgeSuffix(index)}`);\n });\n });\n\n return labels;\n }, [reviews, segmentNumberByKey]);\n\n const badgeSlotById = useMemo(() => {\n const byPage = new Map<number, ReviewItem[]>();\n reviews.forEach((item) => {\n const pageReviews = byPage.get(item.pageNumber) ?? [];\n pageReviews.push(item);\n byPage.set(item.pageNumber, pageReviews);\n });\n const slots = new Map<string, number>();\n byPage.forEach((pageReviews) => {\n pageReviews.forEach((item, index) => slots.set(item.id, index));\n });\n return slots;\n }, [reviews]);\n\n const setPreloadedRenderRange = useCallback<SetRenderRange>((visibleRange) => ({\n startPage: Math.max(0, visibleRange.startPage - badgePreloadPages),\n endPage: Math.min(\n visibleRange.numPages - 1,\n visibleRange.endPage + badgePreloadPages\n ),\n }), [badgePreloadPages]);\n\n const updateBadgePositions = useCallback(() => {\n const wrapper = wrapperRef.current;\n const viewerHost = viewerHostRef.current;\n if (!wrapper || !viewerHost) return;\n\n const wrapperRect = wrapper.getBoundingClientRect();\n const scrollContainer = viewerHost.querySelector(\n '.rpv-core__inner-pages'\n ) as HTMLElement | null;\n const visibleRect = scrollContainer?.getBoundingClientRect() ??\n viewerHost.getBoundingClientRect();\n\n reviews.forEach((item) => {\n const badge = badgeElementsRef.current.get(item.id);\n if (!badge) return;\n\n const page = viewerHost.querySelector(\n `[data-testid=\"core__page-layer-${item.pageNumber - 1}\"]`\n ) as HTMLElement | null;\n\n if (!page) {\n badge.style.visibility = 'hidden';\n return;\n }\n\n const pageRect = page.getBoundingClientRect();\n const slot = badgeSlotById.get(item.id) ?? 0;\n const badgeTop = pageRect.top + badgeOffsetTop + slot * 40;\n const badgeBottom = badgeTop + (badge.offsetHeight || 32);\n const isBadgePositionVisible =\n badgeTop >= visibleRect.top && badgeBottom <= visibleRect.bottom;\n\n badge.style.top = `${badgeTop - wrapperRect.top}px`;\n badge.style.visibility = isBadgePositionVisible ? 'visible' : 'hidden';\n });\n\n // Page-group redirects do not have review badges. Keep their pill aligned\n // with the redirected PDF page the same way individual badges are.\n const pill = pageGroupElementRef.current;\n if (pill) {\n const pageNumber = activePageGroup?.pages[activePageGroup.index];\n const page = pageNumber == null ? null : viewerHost.querySelector(\n `[data-testid=\"core__page-layer-${pageNumber - 1}\"]`\n ) as HTMLElement | null;\n\n if (!activePageGroup || !page) {\n pill.style.visibility = 'hidden';\n } else {\n const pageRect = page.getBoundingClientRect();\n const pillTop = pageRect.top + badgeOffsetTop;\n const pillBottom = pillTop + (pill.offsetHeight || 25);\n const isPillPositionVisible =\n pillTop >= visibleRect.top && pillBottom <= visibleRect.bottom;\n\n pill.style.top = `${pillTop - wrapperRect.top}px`;\n pill.style.visibility = isPillPositionVisible ? 'visible' : 'hidden';\n }\n }\n\n // A page layer or badge can mount one frame after navigation settles.\n // Position updates therefore also recover the popup anchor instead of\n // relying exclusively on the one-time navigation-settled callback.\n if (activeReviewId && pendingNavigationRef.current == null) {\n const activeBadge = badgeElementsRef.current.get(activeReviewId);\n if (activeBadge && activeBadge.style.visibility !== 'hidden') {\n setAnchorElement((current) => current === activeBadge ? current : activeBadge);\n }\n }\n }, [activePageGroup, activeReviewId, badgeOffsetTop, badgeSlotById, reviews]);\n\n const handleNavigationSettled = useCallback((\n event: PdfNavigationSettledEvent\n ) => {\n const pendingNavigation = pendingNavigationRef.current;\n if (\n !pendingNavigation ||\n pendingNavigation.requestId !== event.requestId ||\n pendingNavigation.pageNumber !== event.pageNumber\n ) {\n return;\n }\n\n pendingNavigationRef.current = null;\n updateBadgePositions();\n\n requestAnimationFrame(() => {\n if (pendingNavigationRef.current != null) return;\n const badge = badgeElementsRef.current.get(pendingNavigation.reviewId);\n if (badge && badge.style.visibility !== 'hidden') setAnchorElement(badge);\n });\n }, [updateBadgePositions]);\n\n useEffect(() => {\n const viewerHost = viewerHostRef.current;\n if (!viewerHost || !showBadges) return;\n\n let frameId: number | null = null;\n const schedulePositionUpdate = () => {\n if (frameId != null) return;\n frameId = requestAnimationFrame(() => {\n frameId = null;\n updateBadgePositions();\n });\n };\n\n viewerHost.addEventListener('scroll', schedulePositionUpdate, true);\n window.addEventListener('resize', schedulePositionUpdate);\n\n const mutationObserver = new MutationObserver(schedulePositionUpdate);\n mutationObserver.observe(viewerHost, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style'],\n });\n\n const resizeObserver = typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(schedulePositionUpdate);\n resizeObserver?.observe(viewerHost);\n\n schedulePositionUpdate();\n\n return () => {\n if (frameId != null) cancelAnimationFrame(frameId);\n viewerHost.removeEventListener('scroll', schedulePositionUpdate, true);\n window.removeEventListener('resize', schedulePositionUpdate);\n mutationObserver.disconnect();\n resizeObserver?.disconnect();\n };\n }, [showBadges, updateBadgePositions]);\n\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{\n ...style,\n display: 'block',\n position: 'relative',\n width: '100%',\n height: '100%',\n minWidth: 0,\n overflowX: 'auto',\n overflowY: 'hidden',\n }}\n >\n <div\n className=\"segment-review-wrapper__container\"\n style={{\n display: 'flex',\n alignItems: 'stretch',\n gap: 0,\n width: '100%',\n minWidth: REVIEW_LAYOUT_MIN_WIDTH,\n height: '100%',\n }}\n >\n <div\n ref={viewerHostRef}\n style={{\n ...viewerStyle,\n flex: '1 1 auto',\n width: showBadges ? 'auto' : '100%',\n minWidth: 0,\n height: '100%',\n boxSizing: 'border-box',\n }}\n >\n <PdfViewer\n highlightText={[]}\n highlightPages={{}}\n highlightCordinatePages={[]}\n useCoordinates={false}\n showRotateButton={true}\n {...pdfViewerProps}\n defaultScale={\n specialZoomLevel === undefined\n ? pdfViewerProps?.defaultScale ?? SpecialZoomLevel.PageFit\n : SEGMENT_PDF_SPECIAL_ZOOM_LEVEL[specialZoomLevel]\n }\n disablePdfAnnotations={disablePdfAnnotations}\n disablePdfTextLayer={disablePdfTextLayer}\n pdfUrl={pdfUrl}\n pdfName={pdfName}\n segments={pdfSegments}\n navigationRequest={navigationRequest}\n onNavigationSettled={handleNavigationSettled}\n setRenderRange={setPreloadedRenderRange}\n onCurrentPageChange={(pageNumber) => {\n setCurrentPage(pageNumber);\n if (\n pendingNavigationRef.current == null &&\n activeReview &&\n activeReview.pageNumber !== pageNumber\n ) {\n closeActiveReview();\n }\n onCurrentPageChange?.(pageNumber);\n }}\n />\n </div>\n\n {showBadges && (\n <aside\n aria-label=\"Page review badges\"\n ref={asideRef}\n style={{\n ...railStyle,\n position: 'relative',\n width: responsiveRailWidth,\n maxWidth: REVIEW_CARD_MAX_WIDTH,\n flex: `0 1 ${responsiveRailWidth}`,\n minHeight: 0,\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n\n {activePageGroup && (\n <span\n ref={pageGroupElementRef}\n style={{\n position: 'absolute',\n top: 0,\n left: 10,\n visibility: 'hidden',\n zIndex: 2,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n minHeight: 25,\n padding: '2px 8px',\n border: '1px solid #E2E8F0',\n borderRadius: 16,\n backgroundColor: '#F8FAFC',\n boxSizing: 'border-box',\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.08)',\n font: 'inherit',\n }}\n >\n <Typography\n fontFamily={'Inter'}\n sx={{ fontSize: 11, fontWeight: 500, color: '#475569', whiteSpace: 'nowrap' }}\n >\n {activePageGroup.label || 'Pages'} Pg: {activePageGroup.index + 1}\n </Typography>\n </span>\n )}\n\n\n {showBadgeNavigation && navigationReviews.length > 0 && !activePageGroup && (\n <nav\n aria-label=\"Review badge navigation\"\n style={{\n position: 'absolute',\n top: 8,\n right: badgeOffsetRight ? badgeOffsetRight : 'auto',\n left: badgeOffsetLeft ? badgeOffsetLeft : 'auto',\n zIndex: 2,\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n width: 128,\n minHeight: 40,\n padding: '4px 6px',\n border: '1px solid #CBD5E1',\n borderRadius: 6,\n backgroundColor: '#FFFFFF',\n boxSizing: 'border-box',\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.06)',\n font: 'inherit',\n }}\n >\n <Tooltip\n title={navigationInputError === 'out-of-range'\n ? 'Please enter valid number present in the range'\n : 'Please enter valid numbers'}\n open={navigationInputError != null}\n placement=\"top\"\n arrow\n >\n <input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n value={navigationInputValue ?? '-'}\n min={0}\n max={navigationReviews.length}\n aria-label=\"Review badge number\"\n aria-invalid={navigationInputError != null}\n onFocus={() => {\n if (navigationInputValue == null) setNavigationInputValue('');\n }}\n onBlur={() => {\n setNavigationInputError(null);\n const numericValue = Number(navigationInputValue);\n if (\n navigationInputValue == null ||\n navigationInputValue === '' ||\n !Number.isInteger(numericValue) ||\n numericValue < 1 ||\n numericValue > navigationReviews.length\n ) {\n navigationInputChangedRef.current = false;\n setNavigationInputValue(\n displayedNavigationIndex >= 0\n ? String(displayedNavigationIndex + 1)\n : null\n );\n }\n }}\n onChange={(event) => {\n const inputValue = event.target.value;\n if (!/^\\d*$/.test(inputValue)) {\n setNavigationInputError('invalid-number');\n return;\n }\n\n const numericValue = Number(inputValue);\n const isOutOfRange = inputValue !== '' && (\n numericValue < 1 || numericValue > navigationReviews.length\n );\n setNavigationInputError(isOutOfRange ? 'out-of-range' : null);\n navigationInputChangedRef.current = true;\n setNavigationInputValue(inputValue);\n }}\n style={{\n width: 30,\n height: 28,\n padding: 0,\n border: `1px solid ${navigationInputError ? '#DC2626' : '#A5B4FC'}`,\n borderRadius: 3,\n color: '#4F46E5',\n backgroundColor: '#FFFFFF',\n textAlign: 'center',\n font: 'inherit',\n fontSize: 15,\n outline: 'none',\n }}\n />\n </Tooltip>\n <span\n aria-label={`${navigationReviews.length} reviews`}\n style={{\n flex: 1,\n color: '#4F46E5',\n fontSize: 14,\n whiteSpace: 'nowrap',\n textAlign: 'center',\n }}\n >\n of {navigationReviews.length}\n </span>\n {(['previous', 'next'] as const).map((direction) => {\n const isPrevious = direction === 'previous';\n const targetIndex = displayedNavigationIndex + (isPrevious ? -1 : 1);\n const isDisabled = targetIndex < 0 || targetIndex >= navigationReviews.length;\n\n return (\n <button\n key={direction}\n type=\"button\"\n aria-label={`${isPrevious ? 'Previous' : 'Next'} review badge`}\n disabled={isDisabled}\n onClick={() => navigateToReviewIndex(targetIndex)}\n style={{\n display: 'grid',\n placeItems: 'center',\n width: 17,\n height: 28,\n padding: 0,\n border: 0,\n background: 'transparent',\n color: isDisabled ? '#C7D2FE' : '#4F46E5',\n cursor: isDisabled ? 'default' : 'pointer',\n }}\n >\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path\n d={isPrevious ? 'M1 7L6 2L11 7' : 'M1 1L6 6L11 1'}\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n );\n })}\n </nav>\n )}\n\n {!activePageGroup && reviews.map((item) => {\n const isActive = activeReviewId === item.id;\n const label = badgeLabelById.get(item.id) ?? '1A';\n const score = item.review_step.score;\n const confidence = item.review_step.confidence;\n const displayScore = formatScore(score, confidence);\n const humanActionBadgeLabel = item.kind === 'boundary'\n ? getBoundaryReviewActionBadgeLabel(\n item.review_step,\n item.segment,\n optimisticStructuralActions.get(getSegmentReviewKey(item.segment))\n )\n : item.kind === 'label'\n ? getTitleReviewActionBadgeLabel(\n item.review_step,\n item.segment,\n optimisticStructuralActions.get(getSegmentReviewKey(item.segment))\n )\n : null;\n const badgeValue = humanActionBadgeLabel ?? (\n displayScore === 'N/A' ? displayScore : `${displayScore}%`\n );\n const isAwaitingLlm = item.segment.confidence?.awaiting_llm === true;\n const confidenceColors = getConfidenceColors(\n score,\n confidence,\n isAwaitingLlm\n );\n const isReviewed = resolvedReviewIds.has(item.id);\n const isDisabled = isAwaitingLlm;\n return (\n <Tooltip\n key={item.id}\n title={isAwaitingLlm ? 'data is being processed' : ''}\n arrow\n >\n <span\n ref={(element) => {\n if (element) badgeElementsRef.current.set(item.id, element);\n else badgeElementsRef.current.delete(item.id);\n }}\n style={{\n position: 'absolute',\n top: 0,\n left: 10,\n visibility: 'hidden',\n display: 'inline-flex',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n }}\n >\n <button\n disabled={isDisabled}\n type=\"button\"\n aria-pressed={isActive}\n aria-label={isAwaitingLlm\n ? `${item.review_step.type} · Page ${item.pageNumber} · Data is being processed`\n : `${item.review_step.type} · Page ${item.pageNumber}`}\n onClick={() => selectReview(item)}\n style={{\n cursor: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-around',\n gap: 4,\n width: humanActionBadgeLabel\n ? (isReviewed && !isAwaitingLlm ? 115 : 90)\n : (isReviewed && !isAwaitingLlm ? 105 : 80),\n minHeight: 25,\n padding: '2px 5px',\n border: `1px solid ${isReviewed && !isAwaitingLlm ? \"#E2E8F0\" : confidenceColors.border}`,\n borderRadius: 16,\n backgroundColor: isReviewed && !isAwaitingLlm ? \"#F8FAFC\" : confidenceColors.background,\n color: isReviewed && !isAwaitingLlm ? \"#475569\" : confidenceColors.text,\n font: 'inherit',\n alignContent: \"center\",\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.08)',\n }}\n >\n {isReviewed && !isAwaitingLlm ? (\n <Typography fontFamily={'Inter'} sx={{ display: 'flex',gap:1, alignItems: 'center', flexDirection: 'row' }}>\n <span style={{ fontSize: 11, fontWeight: 500 }}>{label}</span>\n <span style={{ display: 'flex', alignItems: \"center\" }}><svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={\"#CBD5E1\"} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ fontSize: 11, fontWeight: 500, marginLeft: \"7px\", display: 'flex', alignItems: 'center' }}>{badgeValue}</span>\n\n </span>\n <span style={{ fontSize: 11, fontWeight: 500, display: 'flex', alignItems: 'center' }}>\n <svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={\"#CBD5E1\"} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ display: 'flex', marginLeft: '7px', alignItems: 'center' }}><CircleCheck height={14} width={14} strokeWidth={2} color='#16A34A' /></span>\n </span>\n </Typography>\n ) : (\n <Typography fontFamily={'Inter'} sx={{ display: 'flex', gap: 1, alignItems: 'center', flexDirection: 'row' }}>\n <span style={{ fontSize: 11, fontWeight: 500 }}>{label}</span>\n <span style={{ display: 'flex', alignItems: \"center\" }}><svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={confidenceColors.divider} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ fontSize: 11, fontWeight: 500, marginLeft: \"7px\", display: 'flex', alignItems: 'center' }}>{badgeValue}</span>\n </span>\n </Typography>\n )}\n </button>\n </span>\n </Tooltip>\n );\n })}\n </aside>\n )}\n </div>\n\n {activeReview && anchorElement && (\n <CardWrapper\n anchorElement={anchorElement}\n placement=\"bottom-start\"\n offset={{ top: 8 }}\n width={Math.min(asideWidth, REVIEW_CARD_MAX_WIDTH)}\n maxWidth={REVIEW_CARD_MAX_WIDTH}\n heightBuffer={heightBuffer ?? 25}\n >\n {isCognitiveIntegrityOpen && (\n <CognitiveIntegrity\n width=\"100%\"\n maxWidth=\"100%\"\n score={activeReview.review_step.score}\n reasons={activeCognitiveReasons}\n reason={activeReview.review_step.reason}\n gap={activeReview.review_step.gap}\n onBack={() => setIsCognitiveIntegrityOpen(false)}\n onClose={closeActiveReview}\n />\n )}\n <div style={{ display: isCognitiveIntegrityOpen ? 'none' : 'block' }}>\n {resolvedReviewIds.has(activeReview.id) ?\n <ReviewedCard\n width=\"100%\"\n maxWidth=\"100%\"\n headerName={activeReview.kind === 'page'\n ? 'Page format approved'\n : activeReviewActionLabel === 'Split'\n ? 'Split approved'\n : activeReviewActionLabel === 'Merged'\n ? 'Merge approved'\n : 'User approved'}\n headerIcon={activeReview.kind === 'page'\n ? <Check size={18} strokeWidth={2} />\n : activeReviewActionLabel === 'Merged'\n ? <GitMerge size={18} strokeWidth={2} />\n : activeReviewActionLabel === 'Split'\n ? <ChartBreakoutCircle width={18} height={18} />\n : <CircleCheck size={18} strokeWidth={2} />}\n title={activeReviewTitle}\n pageNo={`Page ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n summary={shouldShowRevert && activeRevertData ? (\n <RevertCard\n key={activeReview.id}\n icon={<CircleCheck size={14} strokeWidth={2} />}\n title={activeReviewTitle}\n pageRange={`Page ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n description={activeRevertDescription ?? null}\n revertData={activeRevertData}\n confirmDisabled={activeReview.kind === 'page' ? !canRevertActiveReview : onRevert == null || !canRevertActiveReview}\n showDocumentHeader={false}\n onRevert={async () => {\n if (activeReview.kind === 'page') {\n if (!onPageTypeRevert || activePageClassificationIds.length === 0) {\n const error = new Error(\n 'SegmentReviewPdfWrapper requires onPageTypeRevert and at least one classification id to revert a page-type decision.'\n );\n onActionError?.(error, getReviewContext(activeReview));\n throw error;\n }\n\n let result: void | RevertActionResult = undefined;\n for (const classificationId of activePageClassificationIds) {\n result = await onPageTypeRevert(\n {\n classification_id: classificationId,\n human_verdict: 'No',\n },\n getReviewContext(activeReview)\n );\n }\n return result;\n }\n\n if (!onRevert) {\n throw new Error(\n 'SegmentReviewPdfWrapper requires onRevert to handle a revert confirmation.'\n );\n }\n\n if (!activeRevertInfo) {\n throw new Error(\n 'There is no valid revert operation for this review.'\n );\n }\n\n const expectedRevertType =\n isStructuralReviewResult\n ? 'boundary'\n : activeReview.kind === 'label'\n ? 'label'\n : activeReview.kind === 'boundary'\n ? 'boundary'\n : null;\n\n const actualRevertType =\n normalizeRevertType(activeRevertInfo.type);\n\n if (\n expectedRevertType &&\n actualRevertType !== expectedRevertType\n ) {\n throw new Error(\n `Cannot use ${actualRevertType ?? 'unknown'} revert metadata for this review. Expected ${expectedRevertType}.`\n );\n }\n\n return onRevert(\n activeRevertInfo,\n getReviewContext(activeReview)\n );\n }}\n onRevertError={(error) => {\n onActionError?.(error, getReviewContext(activeReview));\n }}\n onRevertComplete={(result) => {\n setLocallyResolvedReviewIds(\n () => new Set<string>()\n );\n\n if (activeReview.kind !== 'page') {\n setOptimisticRangeAdjustedSegmentKeys(\n () => new Set<string>()\n );\n setOptimisticStructuralActions(\n () => new Map<string, BoundaryReviewAction>()\n );\n }\n const revertedReviewId = activeReview.id;\n\n const revertedSegment = activeRevertData.previousSegments[0] ??\n activeRevertData.currentSegment;\n const anchorRect = anchorElement?.getBoundingClientRect();\n const viewerRect = viewerHostRef.current?.getBoundingClientRect();\n const toastWidth = Math.min(\n REVIEW_CARD_MAX_WIDTH,\n Math.max(220, asideWidth)\n );\n const preferredLeft = anchorRect?.left ??\n ((viewerRect?.right ?? window.innerWidth - toastWidth - 8) + 8);\n const toastLeft = Math.max(\n 8,\n Math.min(preferredLeft, window.innerWidth - toastWidth - 8)\n );\n const toastTop = anchorRect?.bottom == null\n ? Math.max(8, viewerRect?.top ?? 8)\n : anchorRect.bottom + 8;\n setLocallyResolvedReviewIds(() => new Set<string>());\n if (activeReview.kind !== 'page') {\n pendingStructuralAdvanceRef.current = null;\n }\n setIsRevertToastVisible(false);\n setRevertSuccess({\n title: activeReviewActionLabel === 'Split'\n ? 'Split reverted'\n : activeReviewActionLabel === 'Merged'\n ? 'Merge reverted'\n : 'Approval reverted',\n description: result?.message?.trim() || null,\n segment: revertedSegment,\n position: {\n top: toastTop,\n left: toastLeft,\n width: toastWidth,\n },\n });\n closeActiveReview();\n }}\n />\n ) : undefined}\n additionalActions={activeBoundaryReview ? (\n <ReviewedBoundaryActions\n metadata={activeBoundaryReview.metadata}\n reviewAction={activeReview.segment.review_action ?? undefined}\n startPage={activeReview.segment.start_page}\n endPage={activeReview.segment.end_page}\n title={activeReviewTitle}\n previousSegmentTitle={previousSegmentTitle}\n nextSegmentTitle={nextSegmentTitle}\n disabled={\n disableAllActions ||\n !onBoundaryAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(action, details) => {\n void completeAction(activeBoundaryReview, action, details);\n }}\n />\n ) : undefined}\n cognitiveScore={activeReview.review_step.score}\n styles={{\n root: { borderColor: '#16A34A' },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: '#16A34A',\n },\n },\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n : activeReview.kind === 'boundary' ? (\n <BoundaryCard\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n totalPages={totalPages}\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.question ?? null}\n revertSummary={activeRevertSummary}\n cognitiveScore={activeReview.review_step.score}\n metadata={activeReview.metadata}\n reviewAction={activeReview.segment.review_action ?? undefined}\n previousSegmentTitle={previousSegmentTitle}\n nextSegmentTitle={nextSegmentTitle}\n manualPrompt={manualPrompt ?? \"Set a custom boundary\"}\n defaultStartPage={activeReview.segment.start_page}\n defaultEndPage={activeReview.segment.end_page}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onBoundaryAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(_selectedIndex, option, details) => {\n if (details && isBoundaryReviewAction(option.id)) {\n void completeAction(activeReview, option.id, details);\n }\n }}\n onAdjustManually={() => onAdjustManually?.(getReviewContext(activeReview))}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : activeReview.kind === 'label' ? (\n <LabelCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={\n activeReview.metadata.current_label ||\n activeReview.segment.label ||\n activeReview.segment.title\n }\n pageNo={`Pages ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n content={activeReview.review_step.question ?? null}\n revertSummary={activeRevertSummary}\n cognitiveScore={activeReview.review_step.score}\n metadata={activeReview.metadata}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onLabelAction ||\n pendingReviewId === activeReview.id\n }\n confirmationBlocked={isTitleConfirmationBlocked}\n confirmationWarning={isTitleConfirmationBlocked\n ? 'Please confirm the boundary before confirming the title.'\n : undefined}\n onActionConfirm={(action, details) => {\n void completeAction(activeReview, action, details);\n }}\n onAdjustManually={() => onAdjustManually?.(getReviewContext(activeReview))}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : activeReview.metadata.type_choices?.length === 2 ? (\n <PageTypeChoiceCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.reason}\n choices={activeReview.metadata.type_choices}\n cognitiveScore={activeReview.review_step.score}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onPageAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(selectedPageTypes) => {\n void completePageTypeChoices(activeReview, selectedPageTypes);\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : (\n <PageCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.reason}\n cognitiveScore={activeReview.review_step.score}\n pageType={activeReview.metadata.page_type}\n metadata={activeReview.metadata}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onPageAction ||\n pendingReviewId === activeReview.id\n }\n onActionConfirm={(action, details) => {\n void completeAction(activeReview, action, details);\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n )}\n </div>\n </CardWrapper>\n )}\n {revertSuccess && (\n <Portal>\n <Box\n aria-live=\"polite\"\n sx={{\n position: 'fixed',\n top: revertSuccess.position.top,\n left: revertSuccess.position.left,\n zIndex: 1600,\n width: revertSuccess.position.width,\n maxWidth: 'calc(100vw - 16px)',\n opacity: isRevertToastVisible ? 1 : 0,\n transform: isRevertToastVisible\n ? 'translateY(0)'\n : 'translateY(-6px)',\n transition: 'opacity 500ms ease, transform 500ms ease',\n filter: 'drop-shadow(0 12px 24px rgba(15, 23, 42, 0.18))',\n pointerEvents: isRevertToastVisible ? 'auto' : 'none',\n }}\n >\n <RevertSuccessCard\n title={revertSuccess.title}\n description={revertSuccess.description}\n onReview={() => reviewRevertedSegment(revertSuccess.segment)}\n />\n </Box>\n </Portal>\n )}\n </div>\n );\n}\n"],"names":["REVIEW_CARD_MAX_WIDTH","SegmentPdfSpecialZoomLevel","SEGMENT_PDF_SPECIAL_ZOOM_LEVEL","ActualSize","SpecialZoomLevel","PageFit","PageWidth","getReviewContext","item","reviewId","id","segment","pageNumber","SegmentReviewPdfWrapper","pdfUrl","pdfName","segments","totalPages","styles","pdfViewerProps","specialZoomLevel","showBadges","sortByConfidence","filterByConfidence","showBadgeNavigation","autoSelectReviewOnPageChange","autoAdvanceAfterConfirm","autoAdvanceScoreBand","badgePreloadPages","badgeOffsetTop","badgeOffsetRight","badgeOffsetLeft","initialReviewId","manualPrompt","heightBuffer","onBoundaryAction","onLabelAction","onPageAction","onPageTypeRevert","onRevert","onActiveReviewChange","onCurrentPageChange","onActionError","disableAllActions","disablePdfAnnotations","disablePdfTextLayer","disableTitleCheckUntilBoundaryCheckCompleted","onAdjustManually","onCognitiveClick","className","style","viewerStyle","railStyle","redirectionData","onBadgeSelected","closePopups","console","log","boundaryReviews","labelReviews","pageReviews","useMemo","extractSegmentReviewData","optimisticStructuralActions","setOptimisticStructuralActions","useState","Map","optimisticRangeAdjustedSegmentKeys","setOptimisticRangeAdjustedSegmentKeys","Set","segmentNumberByKey","numberByKey","nextSegmentNumber","forEach","index","segmentKey","getSegmentReviewKey","has","set","segmentsWithTitleReviews","map","review","pendingMergeImpactedSegmentKeys","getPendingMergeImpactedSegmentKeys","useEffect","current","changed","next","action","find","hasPolledStructuralAction","delete","optimisticMergeImpactedSegmentKeys","getOptimisticMergeImpactedSegmentKeys","asideRef","useRef","reviews","filter","shouldHideStructuralBoundaryReview","review_step","get","kind","metadata","focus_page","start_page","page_num","sort","left","right","leftSegmentNumber","Number","MAX_SAFE_INTEGER","rightSegmentNumber","reviewStepIndex","localeCompare","pdfSegments","title","label","trim","page_count","end_page","currentPage","setCurrentPage","activeReviewId","setActiveReviewId","selectedNavigationReviewId","setSelectedNavigationReviewId","isCognitiveIntegrityOpen","setIsCognitiveIntegrityOpen","anchorElement","setAnchorElement","navigationRequest","setNavigationRequest","locallyResolvedReviewIds","setLocallyResolvedReviewIds","pendingReviewId","setPendingReviewId","activePageGroup","setActivePageGroup","revertSuccess","setRevertSuccess","isRevertToastVisible","setIsRevertToastVisible","navigationSequenceRef","pendingNavigationRef","pendingStructuralAdvanceRef","badgeElementsRef","pageGroupElementRef","wrapperRef","viewerHostRef","asideWidth","setAsideWidth","requestedRailWidth","aside","width","responsiveRailWidth","closeAllPopups","useCallback","size","updateAsideWidth","nextWidth","getBoundingClientRect","resizeObserver","ResizeObserver","observe","disconnect","resolvedReviewIds","resolvedIds","add","activeReview","isTitleConfirmationBlocked","some","boundaryScore","getResolvedScore","score","confidence","activeSegmentIndex","findIndex","previousSegment","nextSegment","previousSegmentTitle","nextSegmentTitle","activeReviewColors","getConfidenceColors","awaiting_llm","activeCognitiveReasons","reasons","length","hasCognitiveIntegrityContent","Boolean","text","includes","type","toLowerCase","reason","gap","activeReviewActionLabel","getBoundaryReviewActionBadgeLabel","stable_key","getTitleReviewActionBadgeLabel","activeTitleDecisionValues","human_action_enum","human_resolution","isMergeOrSplitTitleReview","value","normalizedValue","toUpperCase","hasVisibleBoundaryReviewForActiveSegment","isHiddenBoundaryStructuralTitleReview","activeBoundaryReview","boundaryReview","review_action","boundary_margin","user_actions","activeReviewTitle","activeStepRevertInfo","revert","segmentRevertInfo","normalizeRevertType","structuralStepRevertInfo","review_steps","reverse","step","stepType","fallbackRevertInfo","fallbackRevertDecision","decision","isSetRangeStructuralResult","current_segment_ids","previous_state","isStructuralReviewResult","activeRevertInfo","structuralSummaryStep","operation_id","flatMap","change_summary","activeRevertSummary","summary","activeRevertDescription","activeRevertData","currentSegment","startPage","endPage","previousSegments","activePageClassificationIds","type_choices","choice","classification_id","canRevertActiveReview","revertable","shouldShowRevert","requestPageNavigation","requestId","selectReview","segment_id","frameId","requestAnimationFrame","fadeTimeoutId","window","setTimeout","removeTimeoutId","cancelAnimationFrame","clearTimeout","pages","pageIndex","targetPage","closeActiveReview","groupLabel","matchingReview","classificationId","segmentId","segmentStartPage","isInteger","redirectionPageType","pageType","matchingPage","matchesPageType","page_type","reviewRevertedSegment","targetReview","isEligibleAutoAdvanceReview","excludedReviewId","scoreBand","getReviewScoreBand","matchesScoreBand","hasCurrentLocalResolution","isReviewStepResolutionCurrent","isReviewStepResolved","selectNextReview","completedReviewId","completedIndex","nextReview","completePageTypeChoices","async","selectedPageTypes","choices","selectedTypes","context","orderedChoices","isLeftSelected","PageCheckActionEnum","YES","NO","error","completeAction","details","boundaryAction","boundaryDetails","effectiveBoundaryAction","BoundaryReviewActionEnum","SET_RANGE","newStart","newEnd","expanded","shrunk","MERGE_PREV","MERGE_NEXT","SPLIT_HERE","isStructuralBoundaryAction","MERGE_PREVIOUS","originalSegmentIndex","segmentSignature","JSON","stringify","key","version","ready","isMergeAction","titleReview","pendingAdvance","targetSegmentIndex","Math","max","segmentIndexByKey","segmentIndex","pageReview","navigationReviews","availableReviews","remainingConfidenceOrder","confidenceOrder","confidenceRank","leftConfidence","rightConfidence","displayedNavigationIndex","navigationInputValue","setNavigationInputValue","navigationInputError","setNavigationInputError","navigationInputChangedRef","navigateToReviewIndex","String","timerId","requestedPosition","requestedIndex","badgeLabelById","reviewsBySegment","segmentReviews","push","labels","segmentNumber","suffix","fromCharCode","floor","getBadgeSuffix","badgeSlotById","byPage","slots","setPreloadedRenderRange","visibleRange","min","numPages","updateBadgePositions","wrapper","viewerHost","wrapperRect","scrollContainer","querySelector","visibleRect","badge","page","visibility","pageRect","slot","badgeTop","top","badgeBottom","offsetHeight","isBadgePositionVisible","bottom","pill","pillTop","pillBottom","isPillPositionVisible","activeBadge","handleNavigationSettled","event","pendingNavigation","schedulePositionUpdate","addEventListener","mutationObserver","MutationObserver","childList","subtree","attributes","attributeFilter","removeEventListener","jsxs","ref","display","position","height","minWidth","overflowX","overflowY","children","alignItems","jsx","flex","boxSizing","PdfViewer","highlightText","highlightPages","highlightCordinatePages","useCoordinates","showRotateButton","defaultScale","onNavigationSettled","setRenderRange","maxWidth","minHeight","overflow","zIndex","justifyContent","padding","border","borderRadius","backgroundColor","boxShadow","font","Typography","fontFamily","sx","fontSize","fontWeight","color","whiteSpace","Tooltip","open","placement","arrow","inputMode","pattern","onFocus","onBlur","numericValue","onChange","inputValue","target","test","isOutOfRange","textAlign","outline","direction","isPrevious","targetIndex","isDisabled","disabled","onClick","placeItems","background","cursor","viewBox","fill","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","isActive","displayScore","formatScore","humanActionBadgeLabel","badgeValue","isAwaitingLlm","confidenceColors","isReviewed","element","alignContent","flexDirection","xmlns","marginLeft","CircleCheck","divider","CardWrapper","offset","CognitiveIntegrity","onBack","onClose","ReviewedCard","headerName","headerIcon","Check","GitMerge","ChartBreakoutCircle","pageNo","RevertCard","icon","pageRange","description","revertData","confirmDisabled","showDocumentHeader","Error","result","human_verdict","expectedRevertType","actualRevertType","onRevertError","onRevertComplete","revertedSegment","anchorRect","viewerRect","toastWidth","preferredLeft","innerWidth","toastLeft","toastTop","message","additionalActions","ReviewedBoundaryActions","reviewAction","onConfirm","cognitiveScore","root","borderColor","header","BoundaryCard","content","question","revertSummary","defaultStartPage","defaultEndPage","cardBorder","_selectedIndex","option","isBoundaryReviewAction","LabelCheck","current_label","confirmationBlocked","confirmationWarning","onActionConfirm","PageTypeChoiceCheck","PageCheck","Portal","Box","opacity","transform","transition","pointerEvents","RevertSuccessCard","onReview"],"mappings":"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"}