@e-llm-studio/citation 0.0.253 → 0.0.254

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 (47) hide show
  1. package/dist/cjs/features/ChatDrawer/ChatDrawer.js +1 -1
  2. package/dist/cjs/features/ChatDrawer/ChatDrawer.js.map +1 -1
  3. package/dist/cjs/features/IngestionStatus/IngestionStatusComponent.js +1 -1
  4. package/dist/cjs/features/IngestionStatus/IngestionStatusComponent.js.map +1 -1
  5. package/dist/cjs/features/IngestionStatus/useIngestionStatus.js +1 -1
  6. package/dist/cjs/features/IngestionStatus/useIngestionStatus.js.map +1 -1
  7. package/dist/cjs/features/PdfViewer/PdfViewer.js +1 -1
  8. package/dist/cjs/features/PdfViewer/PdfViewer.js.map +1 -1
  9. package/dist/cjs/features/PdfViewer/usePdfHighlight.js +1 -1
  10. package/dist/cjs/features/PdfViewer/usePdfHighlight.js.map +1 -1
  11. package/dist/cjs/features/SegmentReviewComponents/CognitiveIntegrity.js +1 -1
  12. package/dist/cjs/features/SegmentReviewComponents/CognitiveIntegrity.js.map +1 -1
  13. package/dist/cjs/features/SegmentReviewComponents/SaveAsLearningCard.js +1 -1
  14. package/dist/cjs/features/SegmentReviewComponents/SaveAsLearningCard.js.map +1 -1
  15. package/dist/cjs/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js +1 -1
  16. package/dist/cjs/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js.map +1 -1
  17. package/dist/features/ChatDrawer/ChatDrawer.js +1 -1
  18. package/dist/features/ChatDrawer/ChatDrawer.js.map +1 -1
  19. package/dist/features/IngestionStatus/IngestionStatusComponent.js +1 -1
  20. package/dist/features/IngestionStatus/IngestionStatusComponent.js.map +1 -1
  21. package/dist/features/IngestionStatus/useIngestionStatus.js +1 -1
  22. package/dist/features/IngestionStatus/useIngestionStatus.js.map +1 -1
  23. package/dist/features/PdfViewer/PdfViewer.js +1 -1
  24. package/dist/features/PdfViewer/PdfViewer.js.map +1 -1
  25. package/dist/features/PdfViewer/usePdfHighlight.js +1 -1
  26. package/dist/features/PdfViewer/usePdfHighlight.js.map +1 -1
  27. package/dist/features/SegmentReviewComponents/CognitiveIntegrity.js +1 -1
  28. package/dist/features/SegmentReviewComponents/CognitiveIntegrity.js.map +1 -1
  29. package/dist/features/SegmentReviewComponents/SaveAsLearningCard.js +1 -1
  30. package/dist/features/SegmentReviewComponents/SaveAsLearningCard.js.map +1 -1
  31. package/dist/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js +1 -1
  32. package/dist/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js.map +1 -1
  33. package/dist/types/features/ChatDrawer/ChatDrawer.d.ts.map +1 -1
  34. package/dist/types/features/IngestionStatus/IngestionStatusComponent.d.ts +1 -0
  35. package/dist/types/features/IngestionStatus/IngestionStatusComponent.d.ts.map +1 -1
  36. package/dist/types/features/IngestionStatus/useIngestionStatus.d.ts +1 -1
  37. package/dist/types/features/IngestionStatus/useIngestionStatus.d.ts.map +1 -1
  38. package/dist/types/features/PdfViewer/PdfViewer.d.ts.map +1 -1
  39. package/dist/types/features/PdfViewer/usePdfHighlight.d.ts +1 -0
  40. package/dist/types/features/PdfViewer/usePdfHighlight.d.ts.map +1 -1
  41. package/dist/types/features/SegmentReviewComponents/CognitiveIntegrity.d.ts +6 -1
  42. package/dist/types/features/SegmentReviewComponents/CognitiveIntegrity.d.ts.map +1 -1
  43. package/dist/types/features/SegmentReviewComponents/SaveAsLearningCard.d.ts +2 -1
  44. package/dist/types/features/SegmentReviewComponents/SaveAsLearningCard.d.ts.map +1 -1
  45. package/dist/types/features/SegmentReviewComponents/SegmentReviewPdfWrapper.d.ts +8 -1
  46. package/dist/types/features/SegmentReviewComponents/SegmentReviewPdfWrapper.d.ts.map +1 -1
  47. package/package.json +1 -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, Stack, 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';\n\nimport SaveAsLearningCard, { type SaveAsLearningResult } from './SaveAsLearningCard';\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';\nimport ApprovalDescriptionBanner from './ApprovalDescriptionBanner';\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\n /**\n * Persist a confirmed review decision as an instant-learning example.\n * The wrapper supplies the operation id (when available) and review\n * context; the host owns the instant-learning id, auth token, and the\n * actual request.\n */\n onSaveAsLearning?: (\n details: { operationId: string | null },\n context: SegmentReviewActionContext\n ) => void | SaveAsLearningResult | Promise<void | SaveAsLearningResult>;\n\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 onPdfLoadError?: PdfViewerProps['onError'];\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 onSaveAsLearning,\n closePopups = false,\n onPdfLoadError,\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 [learningSavedReviewIds, setLearningSavedReviewIds] = useState<Set<string>>(\n () => new Set()\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 onError={onPdfLoadError}\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 <Stack spacing={0.75}>\n {activeRevertDescription && (\n <ApprovalDescriptionBanner icon={<CircleCheck size={14} strokeWidth={2} />} description={activeRevertDescription} />\n )}\n\n {onSaveAsLearning && \n // !learningSavedReviewIds.has(activeReview.id) &&\n (\n <SaveAsLearningCard\n disabled={disableAllActions}\n onSave={async () => {\n const result = await onSaveAsLearning(\n { operationId: activeRevertInfo?.operation_id ?? null },\n getReviewContext(activeReview)\n );\n\n if (result && result.success) {\n closeActiveReview();\n }\n\n return result;\n }}\n onSaveComplete={() => {\n setLearningSavedReviewIds((current) => {\n const next = new Set(current);\n next.add(activeReview.id);\n return next;\n });\n closeActiveReview();\n }}\n onSaveError={(error) => {\n onActionError?.(error, getReviewContext(activeReview));\n }}\n />\n )}\n <RevertCard\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 { classification_id: classificationId, human_verdict: 'No' },\n getReviewContext(activeReview)\n );\n }\n return result;\n }\n\n if (!onRevert) {\n throw new Error('SegmentReviewPdfWrapper requires onRevert to handle a revert confirmation.');\n }\n\n if (!activeRevertInfo) {\n throw new Error('There is no valid revert operation for this review.');\n }\n\n const expectedRevertType = isStructuralReviewResult\n ? 'boundary'\n : activeReview.kind === 'label'\n ? 'label'\n : activeReview.kind === 'boundary'\n ? 'boundary'\n : null;\n\n const actualRevertType = normalizeRevertType(activeRevertInfo.type);\n\n if (expectedRevertType && actualRevertType !== expectedRevertType) {\n throw new Error(\n `Cannot use ${actualRevertType ?? 'unknown'} revert metadata for this review. Expected ${expectedRevertType}.`\n );\n }\n\n return onRevert(activeRevertInfo, getReviewContext(activeReview));\n }}\n onRevertError={(error) => {\n onActionError?.(error, getReviewContext(activeReview));\n }}\n onRevertComplete={(result) => {\n setLocallyResolvedReviewIds(() => new Set<string>());\n\n if (activeReview.kind !== 'page') {\n setOptimisticRangeAdjustedSegmentKeys(() => new Set<string>());\n setOptimisticStructuralActions(() => new Map<string, BoundaryReviewAction>());\n }\n\n const revertedSegment = activeRevertData.previousSegments[0] ?? activeRevertData.currentSegment;\n const anchorRect = anchorElement?.getBoundingClientRect();\n const viewerRect = viewerHostRef.current?.getBoundingClientRect();\n const toastWidth = Math.min(REVIEW_CARD_MAX_WIDTH, Math.max(220, asideWidth));\n const preferredLeft = anchorRect?.left ?? ((viewerRect?.right ?? window.innerWidth - toastWidth - 8) + 8);\n const toastLeft = Math.max(8, Math.min(preferredLeft, window.innerWidth - toastWidth - 8));\n const toastTop = anchorRect?.bottom == null ? Math.max(8, viewerRect?.top ?? 8) : anchorRect.bottom + 8;\n\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: { top: toastTop, left: toastLeft, width: toastWidth },\n });\n closeActiveReview();\n }}\n />\n </Stack>\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","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","onSaveAsLearning","closePopups","onPdfLoadError","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","learningSavedReviewIds","setLearningSavedReviewIds","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","onError","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","Stack","spacing","ApprovalDescriptionBanner","icon","description","SaveAsLearningCard","onSave","result","operationId","success","onSaveComplete","onSaveError","RevertCard","pageRange","revertData","confirmDisabled","showDocumentHeader","Error","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, Stack, 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';\n\nimport SaveAsLearningCard, { type SaveAsLearningResult } from './SaveAsLearningCard';\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';\nimport ApprovalDescriptionBanner from './ApprovalDescriptionBanner';\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\n /**\n * Persist a confirmed review decision as an instant-learning example.\n * The wrapper supplies the operation id (when available) and review\n * context; the host owns the instant-learning id, auth token, and the\n * actual request.\n */\n onSaveAsLearning?: (\n details: { operationId: string | null },\n context: SegmentReviewActionContext\n ) => void | SaveAsLearningResult | Promise<void | SaveAsLearningResult>;\n /** Review IDs already persisted as learning examples by the host. */\n savedLearningReviewIds?: readonly string[];\n\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 * Renders evidence and gap text in the Cognitive Integrity popup. Hosts can\n * use this to replace citation anchor markup with their interactive citation UI.\n */\n renderCognitiveReason?: (text: string) => React.ReactNode;\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 onPdfLoadError?: PdfViewerProps['onError'];\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 renderCognitiveReason,\n className,\n style,\n viewerStyle,\n railStyle,\n redirectionData,\n onBadgeSelected,\n onSaveAsLearning,\n savedLearningReviewIds = [],\n closePopups = false,\n onPdfLoadError,\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 learningSavedReviewIds = useMemo(\n () => new Set(savedLearningReviewIds),\n [savedLearningReviewIds]\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 onError={onPdfLoadError}\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 renderReason={renderCognitiveReason}\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 <Stack spacing={0.75}>\n {activeRevertDescription && (\n <ApprovalDescriptionBanner icon={<CircleCheck size={14} strokeWidth={2} />} description={activeRevertDescription} />\n )}\n\n {onSaveAsLearning && (\n <SaveAsLearningCard\n isSaved={activeReview ? learningSavedReviewIds.has(activeReview.id) : false}\n disabled={disableAllActions}\n onSave={async () => {\n const result = await onSaveAsLearning(\n { operationId: activeRevertInfo?.operation_id ?? null },\n getReviewContext(activeReview)\n );\n\n if (result && result.success) {\n closeActiveReview();\n }\n\n return result;\n }}\n onSaveComplete={() => {\n // This only creates the candidate and opens Teach Me.\n // The host marks the review saved after Teach Me's\n // postSaveCallback has persisted saved_learning_data.\n closeActiveReview();\n }}\n onSaveError={(error) => {\n onActionError?.(error, getReviewContext(activeReview));\n }}\n />\n )}\n <RevertCard\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 { classification_id: classificationId, human_verdict: 'No' },\n getReviewContext(activeReview)\n );\n }\n return result;\n }\n\n if (!onRevert) {\n throw new Error('SegmentReviewPdfWrapper requires onRevert to handle a revert confirmation.');\n }\n\n if (!activeRevertInfo) {\n throw new Error('There is no valid revert operation for this review.');\n }\n\n const expectedRevertType = isStructuralReviewResult\n ? 'boundary'\n : activeReview.kind === 'label'\n ? 'label'\n : activeReview.kind === 'boundary'\n ? 'boundary'\n : null;\n\n const actualRevertType = normalizeRevertType(activeRevertInfo.type);\n\n if (expectedRevertType && actualRevertType !== expectedRevertType) {\n throw new Error(\n `Cannot use ${actualRevertType ?? 'unknown'} revert metadata for this review. Expected ${expectedRevertType}.`\n );\n }\n\n return onRevert(activeRevertInfo, getReviewContext(activeReview));\n }}\n onRevertError={(error) => {\n onActionError?.(error, getReviewContext(activeReview));\n }}\n onRevertComplete={(result) => {\n setLocallyResolvedReviewIds(() => new Set<string>());\n\n if (activeReview.kind !== 'page') {\n setOptimisticRangeAdjustedSegmentKeys(() => new Set<string>());\n setOptimisticStructuralActions(() => new Map<string, BoundaryReviewAction>());\n }\n\n const revertedSegment = activeRevertData.previousSegments[0] ?? activeRevertData.currentSegment;\n const anchorRect = anchorElement?.getBoundingClientRect();\n const viewerRect = viewerHostRef.current?.getBoundingClientRect();\n const toastWidth = Math.min(REVIEW_CARD_MAX_WIDTH, Math.max(220, asideWidth));\n const preferredLeft = anchorRect?.left ?? ((viewerRect?.right ?? window.innerWidth - toastWidth - 8) + 8);\n const toastLeft = Math.max(8, Math.min(preferredLeft, window.innerWidth - toastWidth - 8));\n const toastTop = anchorRect?.bottom == null ? Math.max(8, viewerRect?.top ?? 8) : anchorRect.bottom + 8;\n\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: { top: toastTop, left: toastLeft, width: toastWidth },\n });\n closeActiveReview();\n }}\n />\n </Stack>\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","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","renderCognitiveReason","className","style","viewerStyle","railStyle","redirectionData","onBadgeSelected","onSaveAsLearning","savedLearningReviewIds","closePopups","onPdfLoadError","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","learningSavedReviewIds","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","onError","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","renderReason","onBack","onClose","ReviewedCard","headerName","headerIcon","Check","GitMerge","ChartBreakoutCircle","pageNo","Stack","spacing","ApprovalDescriptionBanner","icon","description","SaveAsLearningCard","isSaved","onSave","result","operationId","success","onSaveComplete","onSaveError","RevertCard","pageRange","revertData","confirmDisabled","showDocumentHeader","Error","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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"}