{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "layout-blocks-segmented-document",
  "title": "Layout blocks segmented document",
  "description": "Projection helpers that convert OCR/layout blocks into segmented-document segments and anchors.",
  "registryDependencies": [
    "@retab/layout-blocks",
    "@retab/segmented-document"
  ],
  "files": [
    {
      "path": "registry/new-york-v4/ui/layout-blocks-segmented-document-model.ts",
      "content": "import { buildColorMap, segmentDisplayLabel } from \"@/lib/segments\";\n\nimport { getScrollTarget } from \"./layout-blocks-geometry\";\nimport type { LayoutDocument, LayoutItem } from \"./layout-blocks-types\";\nimport {\n  createSegmentedDocumentModel,\n  type DocumentSegment,\n  type SegmentAnchor,\n  type SegmentedDocumentModel,\n} from \"./segmented-document-model\";\n\nexport function createOcrSegmentedDocumentModel({\n  document,\n  items,\n}: {\n  document: LayoutDocument;\n  items: readonly LayoutItem[];\n}): SegmentedDocumentModel {\n  const colors = buildColorMap(items.map(layoutItemSegmentLabel));\n  const pageByNumber = new Map(\n    document.pages.map((page) => [page.pageNumber, page]),\n  );\n  const segments: DocumentSegment[] = [];\n  const anchors: SegmentAnchor[] = [];\n\n  items.forEach((item, index) => {\n    const label = layoutItemSegmentLabel(item);\n    const segment: DocumentSegment = {\n      id: layoutItemSegmentId(item),\n      label,\n      pages: [],\n      color:\n        colors.get(label) ??\n        colors.get(segmentDisplayLabel(label)) ??\n        \"var(--color-muted-foreground)\",\n      confidence: item.confidence ?? null,\n      index,\n      sourceId: item.id,\n    };\n    const page = pageByNumber.get(item.pageNumber);\n    if (page) {\n      const target = getScrollTarget(item, page);\n      segment.pages = [target.pageNumber];\n      anchors.push({\n        id: `${segment.id}:anchor`,\n        segmentId: segment.id,\n        pageNumber: target.pageNumber,\n        bounds: {\n          x: target.left / 100,\n          y: target.top / 100,\n          width: target.width / 100,\n          height: target.height / 100,\n        },\n      });\n    }\n    segments.push(segment);\n  });\n\n  return createSegmentedDocumentModel({\n    anchors,\n    pages: document.pages.map((page) => ({\n      pageNumber: page.pageNumber,\n      width: page.width,\n      height: page.height,\n    })),\n    segments,\n  });\n}\n\nfunction layoutItemSegmentLabel(item: LayoutItem): string {\n  return segmentDisplayLabel(item.text || item.kind || item.level);\n}\n\nfunction layoutItemSegmentId(item: LayoutItem): string {\n  return `layout:${item.id}`;\n}\n",
      "type": "registry:ui",
      "target": "@ui/layout-blocks-segmented-document-model.ts"
    }
  ],
  "type": "registry:ui"
}