{"version":3,"file":"index.cjs","sources":["../../src/lib/reducer.ts","../../src/vue/hooks/use-layout-analysis.ts","../../src/vue/components/layout-analysis-layer.vue"],"sourcesContent":["import { Reducer } from '@embedpdf/core';\nimport { LayoutAnalysisState } from './types';\nimport {\n  LayoutAnalysisAction,\n  INIT_LAYOUT_STATE,\n  CLEANUP_LAYOUT_STATE,\n  SET_PAGE_STATUS,\n  SET_PAGE_LAYOUT,\n  SET_PAGE_ERROR,\n  SET_LAYOUT_OVERLAY_VISIBLE,\n  SET_TABLE_STRUCTURE_OVERLAY_VISIBLE,\n  SET_TABLE_STRUCTURE_ENABLED,\n  SET_LAYOUT_THRESHOLD,\n  SET_TABLE_STRUCTURE_THRESHOLD,\n  SELECT_BLOCK,\n  SET_PAGE_TABLE_STRUCTURES,\n  CLEAR_PAGE_RESULTS,\n  CLEAR_ALL_RESULTS,\n} from './actions';\n\nexport const initialState: LayoutAnalysisState = {\n  documents: {},\n  layoutOverlayVisible: true,\n  tableStructureOverlayVisible: true,\n  tableStructureEnabled: false,\n  selectedBlockId: null,\n  layoutThreshold: 0.35,\n  tableStructureThreshold: 0.8,\n};\n\nexport const reducer: Reducer<LayoutAnalysisState, LayoutAnalysisAction> = (\n  state = initialState,\n  action,\n) => {\n  switch (action.type) {\n    case INIT_LAYOUT_STATE: {\n      const { documentId } = action.payload;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: { pages: {} },\n        },\n      };\n    }\n\n    case CLEANUP_LAYOUT_STATE: {\n      const docId = action.payload;\n      const { [docId]: _, ...rest } = state.documents;\n      return { ...state, documents: rest };\n    }\n\n    case SET_PAGE_STATUS: {\n      const { documentId, pageIndex, status } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      const page = doc.pages[pageIndex] ?? {\n        status: 'idle',\n        layout: null,\n        error: null,\n        tableStructureAnalyzed: false,\n      };\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: { ...page, status },\n            },\n          },\n        },\n      };\n    }\n\n    case SET_PAGE_LAYOUT: {\n      const { documentId, pageIndex, layout } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: {\n                status: 'complete',\n                layout,\n                error: null,\n                tableStructureAnalyzed: false,\n              },\n            },\n          },\n        },\n      };\n    }\n\n    case SET_PAGE_ERROR: {\n      const { documentId, pageIndex, error } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: { status: 'error', layout: null, error, tableStructureAnalyzed: false },\n            },\n          },\n        },\n      };\n    }\n\n    case CLEAR_PAGE_RESULTS: {\n      const { documentId, pageIndex } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      const { [pageIndex]: _, ...restPages } = doc.pages;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: { ...doc, pages: restPages },\n        },\n      };\n    }\n\n    case CLEAR_ALL_RESULTS: {\n      const { documentId } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: { ...doc, pages: {} },\n        },\n      };\n    }\n\n    case SET_PAGE_TABLE_STRUCTURES: {\n      const { documentId, pageIndex, tableStructures } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      const page = doc.pages[pageIndex];\n      if (!page?.layout) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: {\n                ...page,\n                layout: { ...page.layout, tableStructures },\n                tableStructureAnalyzed: true,\n              },\n            },\n          },\n        },\n      };\n    }\n\n    case SET_LAYOUT_OVERLAY_VISIBLE:\n      return { ...state, layoutOverlayVisible: action.payload };\n\n    case SET_TABLE_STRUCTURE_OVERLAY_VISIBLE:\n      return { ...state, tableStructureOverlayVisible: action.payload };\n\n    case SET_TABLE_STRUCTURE_ENABLED:\n      return { ...state, tableStructureEnabled: action.payload };\n\n    case SET_LAYOUT_THRESHOLD:\n      return { ...state, layoutThreshold: action.payload };\n\n    case SET_TABLE_STRUCTURE_THRESHOLD:\n      return { ...state, tableStructureThreshold: action.payload };\n\n    case SELECT_BLOCK:\n      return { ...state, selectedBlockId: action.payload };\n\n    default:\n      return state;\n  }\n};\n","import { useCapability, usePlugin } from '@embedpdf/core/vue';\nimport {\n  LayoutAnalysisPlugin,\n  LayoutAnalysisState,\n  PageAnalysisState,\n} from '@embedpdf/plugin-layout-analysis';\nimport { initialState } from '../../lib/reducer';\nimport { ref, watch, toValue, MaybeRefOrGetter, computed } from 'vue';\n\nexport const useLayoutAnalysisPlugin = () =>\n  usePlugin<LayoutAnalysisPlugin>(LayoutAnalysisPlugin.id);\nexport const useLayoutAnalysisCapability = () =>\n  useCapability<LayoutAnalysisPlugin>(LayoutAnalysisPlugin.id);\n\nexport const useLayoutAnalysis = (documentId: MaybeRefOrGetter<string>) => {\n  const { provides } = useLayoutAnalysisCapability();\n  const state = ref<LayoutAnalysisState>(initialState);\n\n  watch(\n    [provides, () => toValue(documentId)],\n    ([providesValue, docId], _, onCleanup) => {\n      if (providesValue && docId) {\n        const scope = providesValue.forDocument(docId);\n        state.value = scope.getState();\n\n        const unsubscribe = scope.onStateChange((newState) => {\n          state.value = newState;\n        });\n        onCleanup(unsubscribe);\n      }\n    },\n    { immediate: true },\n  );\n\n  return {\n    pages: computed(\n      (): Record<number, PageAnalysisState> =>\n        state.value.documents[toValue(documentId)]?.pages ?? {},\n    ),\n    layoutOverlayVisible: computed(() => state.value.layoutOverlayVisible),\n    tableStructureOverlayVisible: computed(() => state.value.tableStructureOverlayVisible),\n    tableStructureEnabled: computed(() => state.value.tableStructureEnabled),\n    layoutThreshold: computed(() => state.value.layoutThreshold),\n    tableStructureThreshold: computed(() => state.value.tableStructureThreshold),\n    selectedBlockId: computed(() => state.value.selectedBlockId),\n    scope: computed(() => provides.value?.forDocument(toValue(documentId)) ?? null),\n    provides,\n  };\n};\n","<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport { useLayoutAnalysisCapability } from '../hooks';\nimport type {\n  PageLayout,\n  LayoutAnalysisState,\n  LayoutBlock,\n  TableStructureElement,\n} from '@embedpdf/plugin-layout-analysis';\n\ninterface LayoutAnalysisLayerProps {\n  documentId: string;\n  pageIndex: number;\n  scale?: number;\n}\n\nconst props = defineProps<LayoutAnalysisLayerProps>();\n\nconst CLASS_COLORS: Record<string, string> = {\n  text: 'rgba(59, 130, 246, 0.15)',\n  table: 'rgba(16, 185, 129, 0.15)',\n  image: 'rgba(245, 158, 11, 0.15)',\n  doc_title: 'rgba(139, 92, 246, 0.15)',\n  header: 'rgba(236, 72, 153, 0.15)',\n  footer: 'rgba(107, 114, 128, 0.15)',\n  formula: 'rgba(6, 182, 212, 0.15)',\n  chart: 'rgba(249, 115, 22, 0.15)',\n  abstract: 'rgba(168, 85, 247, 0.15)',\n  paragraph_title: 'rgba(99, 102, 241, 0.15)',\n  reference: 'rgba(75, 85, 99, 0.15)',\n};\n\nconst CLASS_BORDER_COLORS: Record<string, string> = {\n  text: 'rgba(59, 130, 246, 0.7)',\n  table: 'rgba(16, 185, 129, 0.7)',\n  image: 'rgba(245, 158, 11, 0.7)',\n  doc_title: 'rgba(139, 92, 246, 0.7)',\n  header: 'rgba(236, 72, 153, 0.7)',\n  footer: 'rgba(107, 114, 128, 0.7)',\n  formula: 'rgba(6, 182, 212, 0.7)',\n  chart: 'rgba(249, 115, 22, 0.7)',\n  abstract: 'rgba(168, 85, 247, 0.7)',\n  paragraph_title: 'rgba(99, 102, 241, 0.7)',\n  reference: 'rgba(75, 85, 99, 0.7)',\n};\n\nconst TABLE_STRUCTURE_COLOR = 'rgba(234, 88, 12, 0.12)';\nconst TABLE_STRUCTURE_BORDER_COLOR = 'rgba(234, 88, 12, 0.5)';\n\nfunction hashCode(str: string): number {\n  let hash = 0;\n  for (let i = 0; i < str.length; i++) {\n    hash = (hash * 31 + str.charCodeAt(i)) | 0;\n  }\n  return Math.abs(hash);\n}\n\nfunction getColorForLabel(label: string): string {\n  return CLASS_COLORS[label] ?? `hsla(${hashCode(label) % 360}, 70%, 50%, 0.15)`;\n}\n\nfunction getBorderColorForLabel(label: string): string {\n  return CLASS_BORDER_COLORS[label] ?? `hsla(${hashCode(label) % 360}, 70%, 50%, 0.7)`;\n}\n\nconst { provides: layoutAnalysis } = useLayoutAnalysisCapability();\nconst documentState = useDocumentState(() => props.documentId);\n\nconst layout = ref<PageLayout | null>(null);\nconst pluginState = ref<LayoutAnalysisState | null>(null);\n\nconst scope = computed(() =>\n  layoutAnalysis.value ? layoutAnalysis.value.forDocument(props.documentId) : null,\n);\n\nconst actualScale = computed(() => {\n  if (props.scale !== undefined) return props.scale;\n  return documentState.value?.scale ?? 1;\n});\n\nwatch(\n  [scope, () => props.pageIndex],\n  ([currentScope, page], _, onCleanup) => {\n    if (!currentScope) {\n      layout.value = null;\n      pluginState.value = null;\n      return;\n    }\n\n    layout.value = currentScope.getPageLayout(page);\n    pluginState.value = currentScope.getState();\n\n    const unsub1 = currentScope.onPageLayoutChange((event) => {\n      if (event.pageIndex === page) {\n        layout.value = event.layout;\n      }\n    });\n\n    const unsub2 = currentScope.onStateChange((state) => {\n      pluginState.value = state;\n    });\n\n    onCleanup(() => {\n      unsub1();\n      unsub2();\n    });\n  },\n  { immediate: true },\n);\n\nconst layoutOverlayVisible = computed(() => pluginState.value?.layoutOverlayVisible ?? true);\nconst tableStructureOverlayVisible = computed(\n  () => pluginState.value?.tableStructureOverlayVisible ?? true,\n);\nconst layoutThreshold = computed(() => pluginState.value?.layoutThreshold ?? 0.35);\nconst tableStructureThreshold = computed(() => pluginState.value?.tableStructureThreshold ?? 0.8);\nconst selectedBlockId = computed(() => pluginState.value?.selectedBlockId ?? null);\n\nconst filteredBlocks = computed(() => {\n  if (!layout.value || !layoutOverlayVisible.value) return [];\n  return layout.value.blocks.filter((block) => block.score >= layoutThreshold.value);\n});\n\nconst tableStructureEntries = computed(() => {\n  if (!layout.value || !tableStructureOverlayVisible.value || !layout.value.tableStructures)\n    return [];\n  return Array.from(layout.value.tableStructures.entries())\n    .filter(([blockId]) => {\n      const parent = layout.value!.blocks.find((b) => b.id === blockId);\n      return parent && parent.score >= layoutThreshold.value;\n    })\n    .flatMap(([blockId, elements]) =>\n      elements\n        .filter((el) => el.score >= tableStructureThreshold.value)\n        .map((el, idx) => ({ key: `ts-${blockId}-${idx}`, element: el })),\n    );\n});\n\nconst visible = computed(\n  () => layout.value && (layoutOverlayVisible.value || tableStructureOverlayVisible.value),\n);\n\nfunction handleBlockClick(blockId: string) {\n  layoutAnalysis.value?.selectBlock(selectedBlockId.value === blockId ? null : blockId);\n}\n\nfunction blockStyle(block: LayoutBlock): Record<string, string> {\n  const s = actualScale.value;\n  const isSelected = selectedBlockId.value === block.id;\n  return {\n    position: 'absolute',\n    left: `${block.rect.origin.x * s}px`,\n    top: `${block.rect.origin.y * s}px`,\n    width: `${block.rect.size.width * s}px`,\n    height: `${block.rect.size.height * s}px`,\n    backgroundColor: getColorForLabel(block.label),\n    border: `1.5px solid ${getBorderColorForLabel(block.label)}`,\n    boxSizing: 'border-box',\n    pointerEvents: 'auto',\n    cursor: 'pointer',\n    opacity: isSelected ? '1' : '0.8',\n    outline: isSelected ? '2px solid #3b82f6' : 'none',\n    transition: 'opacity 0.15s',\n  };\n}\n\nfunction labelStyle(block: LayoutBlock): Record<string, string> {\n  return {\n    position: 'absolute',\n    top: '-18px',\n    left: '0',\n    fontSize: '10px',\n    lineHeight: '16px',\n    padding: '0 4px',\n    backgroundColor: getBorderColorForLabel(block.label),\n    color: '#fff',\n    borderRadius: '2px',\n    whiteSpace: 'nowrap',\n    pointerEvents: 'none',\n  };\n}\n\nfunction tableElementStyle(element: TableStructureElement): Record<string, string> {\n  const s = actualScale.value;\n  return {\n    position: 'absolute',\n    left: `${element.rect.origin.x * s}px`,\n    top: `${element.rect.origin.y * s}px`,\n    width: `${element.rect.size.width * s}px`,\n    height: `${element.rect.size.height * s}px`,\n    backgroundColor: TABLE_STRUCTURE_COLOR,\n    border: `1px dashed ${TABLE_STRUCTURE_BORDER_COLOR}`,\n    boxSizing: 'border-box',\n    pointerEvents: 'none',\n  };\n}\n</script>\n\n<template>\n  <div\n    v-if=\"visible\"\n    :style=\"{ pointerEvents: 'none' }\"\n    data-layout-analysis-layer=\"\"\n    v-bind=\"$attrs\"\n  >\n    <div\n      v-for=\"block in filteredBlocks\"\n      :key=\"block.id\"\n      :style=\"blockStyle(block)\"\n      :data-block-id=\"block.id\"\n      :data-block-label=\"block.label\"\n      @click=\"handleBlockClick(block.id)\"\n    >\n      <span :style=\"labelStyle(block)\">\n        {{ block.label }} {{ (block.score * 100).toFixed(0) }}%\n      </span>\n    </div>\n\n    <div\n      v-for=\"{ key, element } in tableStructureEntries\"\n      :key=\"key\"\n      :style=\"tableElementStyle(element)\"\n      :data-table-element=\"element.label\"\n    />\n  </div>\n</template>\n"],"names":["initialState","documents","layoutOverlayVisible","tableStructureOverlayVisible","tableStructureEnabled","selectedBlockId","layoutThreshold","tableStructureThreshold","useLayoutAnalysisCapability","useCapability","LayoutAnalysisPlugin","id","props","__props","CLASS_COLORS","text","table","image","doc_title","header","footer","formula","chart","abstract","paragraph_title","reference","CLASS_BORDER_COLORS","hashCode","str","hash","i","length","charCodeAt","Math","abs","getBorderColorForLabel","label","provides","layoutAnalysis","documentState","useDocumentState","documentId","layout","ref","pluginState","scope","computed","value","forDocument","actualScale","scale","_a","watch","pageIndex","currentScope","page","_","onCleanup","getPageLayout","getState","unsub1","onPageLayoutChange","event","unsub2","onStateChange","state","immediate","filteredBlocks","blocks","filter","block","score","tableStructureEntries","tableStructures","Array","from","entries","blockId","parent","find","b","flatMap","elements","el","map","idx","key","element","visible","blockStyle","s","isSelected","position","left","rect","origin","x","top","y","width","size","height","backgroundColor","border","boxSizing","pointerEvents","cursor","opacity","outline","transition","labelStyle","fontSize","lineHeight","padding","color","borderRadius","whiteSpace","tableElementStyle","_openBlock","_createElementBlock","_mergeProps","style","$attrs","_Fragment","_renderList","_normalizeStyle","onClick","$event","handleBlockClick","selectBlock","_createElementVNode","_toDisplayString","toFixed","toValue","providesValue","docId","newState","pages","usePlugin"],"mappings":"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"}