{"version":3,"file":"index.cjs","sources":["../../src/lib/reducer.ts","../../src/svelte/hooks/use-layout-analysis.svelte.ts","../../src/svelte/components/LayoutAnalysisLayer.svelte"],"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/svelte';\nimport {\n  LayoutAnalysisPlugin,\n  LayoutAnalysisState,\n  LayoutAnalysisScope,\n  PageAnalysisState,\n} from '@embedpdf/plugin-layout-analysis';\nimport { initialState } from '../../lib/reducer';\n\nexport const useLayoutAnalysisPlugin = () =>\n  usePlugin<LayoutAnalysisPlugin>(LayoutAnalysisPlugin.id);\nexport const useLayoutAnalysisCapability = () =>\n  useCapability<LayoutAnalysisPlugin>(LayoutAnalysisPlugin.id);\n\ninterface UseLayoutAnalysisReturn {\n  pages: Record<number, PageAnalysisState>;\n  layoutOverlayVisible: boolean;\n  tableStructureOverlayVisible: boolean;\n  tableStructureEnabled: boolean;\n  layoutThreshold: number;\n  tableStructureThreshold: number;\n  selectedBlockId: string | null;\n  scope: LayoutAnalysisScope | null;\n  provides: LayoutAnalysisPlugin['provides'] extends () => infer R ? R : never;\n}\n\nexport const useLayoutAnalysis = (getDocumentId: () => string | null): UseLayoutAnalysisReturn => {\n  const capability = useLayoutAnalysisCapability();\n\n  let state = $state<LayoutAnalysisState>(initialState);\n\n  const documentId = $derived(getDocumentId());\n\n  const scopedProvides = $derived(\n    capability.provides && documentId ? capability.provides.forDocument(documentId) : null,\n  );\n\n  $effect(() => {\n    const provides = capability.provides;\n    const docId = documentId;\n\n    if (!provides || !docId) {\n      state = initialState;\n      return;\n    }\n\n    const scope = provides.forDocument(docId);\n    state = scope.getState();\n\n    return scope.onStateChange((newState) => {\n      state = newState;\n    });\n  });\n\n  return {\n    get pages() {\n      return documentId ? (state.documents[documentId]?.pages ?? {}) : {};\n    },\n    get layoutOverlayVisible() {\n      return state.layoutOverlayVisible;\n    },\n    get tableStructureOverlayVisible() {\n      return state.tableStructureOverlayVisible;\n    },\n    get tableStructureEnabled() {\n      return state.tableStructureEnabled;\n    },\n    get layoutThreshold() {\n      return state.layoutThreshold;\n    },\n    get tableStructureThreshold() {\n      return state.tableStructureThreshold;\n    },\n    get selectedBlockId() {\n      return state.selectedBlockId;\n    },\n    get scope() {\n      return scopedProvides;\n    },\n    get provides() {\n      return capability.provides;\n    },\n  };\n};\n","<script lang=\"ts\">\n  import { useDocumentState } from '@embedpdf/core/svelte';\n  import { useLayoutAnalysisCapability } from '../hooks';\n  import type {\n    PageLayout,\n    LayoutAnalysisState,\n    LayoutBlock,\n    TableStructureElement,\n  } from '@embedpdf/plugin-layout-analysis';\n\n  interface LayoutAnalysisLayerProps {\n    documentId: string;\n    pageIndex: number;\n    scale?: number;\n    class?: string;\n    style?: string;\n  }\n\n  const {\n    documentId,\n    pageIndex,\n    scale: scaleOverride,\n    class: propsClass,\n    style: propsStyle,\n  }: LayoutAnalysisLayerProps = $props();\n\n  const 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\n  const 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\n  const TABLE_STRUCTURE_COLOR = 'rgba(234, 88, 12, 0.12)';\n  const TABLE_STRUCTURE_BORDER = 'rgba(234, 88, 12, 0.5)';\n\n  function 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\n  function getColorForLabel(label: string): string {\n    return CLASS_COLORS[label] ?? `hsla(${hashCode(label) % 360}, 70%, 50%, 0.15)`;\n  }\n\n  function getBorderColorForLabel(label: string): string {\n    return CLASS_BORDER_COLORS[label] ?? `hsla(${hashCode(label) % 360}, 70%, 50%, 0.7)`;\n  }\n\n  const layoutAnalysisCapability = useLayoutAnalysisCapability();\n  const documentState = useDocumentState(() => documentId);\n\n  let layout = $state<PageLayout | null>(null);\n  let pluginState = $state<LayoutAnalysisState | null>(null);\n\n  const scope = $derived(\n    layoutAnalysisCapability.provides\n      ? layoutAnalysisCapability.provides.forDocument(documentId)\n      : null,\n  );\n\n  const actualScale = $derived(\n    scaleOverride !== undefined ? scaleOverride : (documentState.current?.scale ?? 1),\n  );\n\n  $effect(() => {\n    const currentScope = scope;\n    const page = pageIndex;\n\n    if (!currentScope) {\n      layout = null;\n      pluginState = null;\n      return;\n    }\n\n    layout = currentScope.getPageLayout(page);\n    pluginState = currentScope.getState();\n\n    const unsub1 = currentScope.onPageLayoutChange((event) => {\n      if (event.pageIndex === page) {\n        layout = event.layout;\n      }\n    });\n\n    const unsub2 = currentScope.onStateChange((state) => {\n      pluginState = state;\n    });\n\n    return () => {\n      unsub1();\n      unsub2();\n    };\n  });\n\n  const layoutOverlayVisible = $derived(pluginState?.layoutOverlayVisible ?? true);\n  const tableStructureOverlayVisible = $derived(pluginState?.tableStructureOverlayVisible ?? true);\n  const layoutThreshold = $derived(pluginState?.layoutThreshold ?? 0.35);\n  const tableStructureThreshold = $derived(pluginState?.tableStructureThreshold ?? 0.8);\n  const selectedBlockId = $derived(pluginState?.selectedBlockId ?? null);\n\n  const filteredBlocks = $derived.by(() => {\n    if (!layout || !layoutOverlayVisible) return [];\n    return layout.blocks.filter((block) => block.score >= layoutThreshold);\n  });\n\n  const tableStructureEntries = $derived.by(() => {\n    if (!layout || !tableStructureOverlayVisible || !layout.tableStructures) return [];\n    return Array.from(layout.tableStructures.entries())\n      .filter(([blockId]) => {\n        const parent = layout!.blocks.find((b) => b.id === blockId);\n        return parent && parent.score >= layoutThreshold;\n      })\n      .flatMap(([blockId, elements]) =>\n        elements\n          .filter((el) => el.score >= tableStructureThreshold)\n          .map((el, idx) => ({ key: `ts-${blockId}-${idx}`, element: el })),\n      );\n  });\n\n  const visible = $derived(layout && (layoutOverlayVisible || tableStructureOverlayVisible));\n\n  function handleBlockClick(blockId: string) {\n    layoutAnalysisCapability.provides?.selectBlock(selectedBlockId === blockId ? null : blockId);\n  }\n</script>\n\n{#if visible}\n  <div\n    style={`pointer-events: none; ${propsStyle ?? ''}`}\n    class={propsClass}\n    data-layout-analysis-layer=\"\"\n  >\n    {#each filteredBlocks as block (block.id)}\n      <!-- svelte-ignore a11y_click_events_have_key_events -->\n      <!-- svelte-ignore a11y_no_static_element_interactions -->\n      <div\n        style={`position: absolute; left: ${block.rect.origin.x * actualScale}px; top: ${block.rect.origin.y * actualScale}px; width: ${block.rect.size.width * actualScale}px; height: ${block.rect.size.height * actualScale}px; background-color: ${getColorForLabel(block.label)}; border: 1.5px solid ${getBorderColorForLabel(block.label)}; box-sizing: border-box; pointer-events: auto; cursor: pointer; opacity: ${selectedBlockId === block.id ? 1 : 0.8}; ${selectedBlockId === block.id ? 'outline: 2px solid #3b82f6;' : ''} transition: opacity 0.15s;`}\n        data-block-id={block.id}\n        data-block-label={block.label}\n        onclick={() => handleBlockClick(block.id)}\n      >\n        <span\n          style={`position: absolute; top: -18px; left: 0; font-size: 10px; line-height: 16px; padding: 0 4px; background-color: ${getBorderColorForLabel(block.label)}; color: #fff; border-radius: 2px; white-space: nowrap; pointer-events: none;`}\n        >\n          {block.label}\n          {(block.score * 100).toFixed(0)}%\n        </span>\n      </div>\n    {/each}\n\n    {#each tableStructureEntries as { key, element } (key)}\n      <div\n        style={`position: absolute; left: ${element.rect.origin.x * actualScale}px; top: ${element.rect.origin.y * actualScale}px; width: ${element.rect.size.width * actualScale}px; height: ${element.rect.size.height * actualScale}px; background-color: ${TABLE_STRUCTURE_COLOR}; border: 1px dashed ${TABLE_STRUCTURE_BORDER}; box-sizing: border-box; pointer-events: none;`}\n        data-table-element={element.label}\n      ></div>\n    {/each}\n  </div>\n{/if}\n"],"names":["initialState","documents","layoutOverlayVisible","tableStructureOverlayVisible","tableStructureEnabled","selectedBlockId","layoutThreshold","tableStructureThreshold","useLayoutAnalysisCapability","useCapability","LayoutAnalysisPlugin","id","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","layoutAnalysisCapability","documentState","useDocumentState","$$props","documentId","layout","$","state","pluginState","scope","derived","provides","forDocument","actualScale","scale","_a","current","user_effect","currentScope","page","pageIndex","set","getPageLayout","getState","unsub1","onPageLayoutChange","event","unsub2","onStateChange","get","filteredBlocks","blocks","filter","block","score","tableStructureEntries","tableStructures","Array","from","entries","blockId","parent","find","b","flatMap","elements","el","map","idx","key","element","visible","div","root_1","each","node_1","div_1","root_2","__click","handleBlockClick","selectBlock","span","$0","$1","set_text","rect","origin","x","y","size","width","height","toFixed","node_2","$$anchor","$$item","div_2","root_3","set_style","clsx","class","consequent","getDocumentId","capability","scopedProvides","docId","newState","pages","usePlugin"],"mappings":"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"}