JSON Form Sources
retab-ui/json-form-sources-blockFreeBlock
Extraction rendered as a JSON form beside the source PDF — hover a form field to highlight where its value came from through segmented-document state.
Install it
npx shadcn@latest add https://ui.retab.com/r/json-form-sources-block.jsonSource
1"use client";23import * as React from "react";4import type { JSONSchema7 } from "json-schema";5import { useForm } from "react-hook-form";67import { extractionSourcesToSourceMap } from "@/lib/document-source";8import {9 FileViewer,10 FileViewerContent,11 FileViewerHeader,12 FileViewerTitle,13 FileViewerInset,14 FileViewerProvider,15 FileViewerSidebar,16 FileViewerSidebarTrigger,17 FileViewerControls,18 FileViewerViewport,19 type ViewerSource,20 useFileViewerResource,21} from "@/components/ui/file-viewer";22import {23 ImageViewerFrames,24 ImageViewerProvider,25 type ImageViewerHandle,26} from "@/components/ui/image-viewer";27import { PdfViewerPages, PdfViewerProvider } from "@/components/ui/pdf-viewer";28import { ScrollArea } from "@/components/ui/scroll-area";29import {30 SegmentedDocumentProvider,31 useSegmentedDocumentViewport,32} from "@/components/ui/segmented-document-provider";33import { sourceMapToEvidenceModel } from "@/components/ui/source-evidence";34import { useSegmentedSourceFieldLink } from "@/components/ui/source-field-link";35import { SourceIndicator } from "@/components/ui/source-indicator";36import { createSourcesSegmentedDocumentModel } from "@/components/ui/source-segmented-document-model";37import {38 useSegmentedImageSourceOverlay,39 useSegmentedImageViewerHandle,40 useSegmentedPdfSourceOverlay,41 useSegmentedPdfViewerHandle,42} from "@/components/ui/source-segmented-document-overlays";43import { JsonForm } from "@/components/json-form/json-form";44import sourcesSample from "@/components/viewers/sample-data/json-form-sources.json";4546const PDF_URL = "/samples/jane-doe-bank-statement-5-pages.pdf";47const PDF_SOURCE = {48 kind: "url" as const,49 url: PDF_URL,50 fileName: "jane-doe-bank-statement-5-pages.pdf",51};52const JSON_FORM_SOURCES_DEFAULT_OPEN_PATHS = ["transactions"] as const;5354// An extraction of the bank-statement sample shaped like the55// `GET /v1/extractions/{id}/sources` response: a JSON Schema, the extracted56// values, and a parallel `sources` tree (leaves `{ value, source }`).57const SAMPLE_SCHEMA = sourcesSample.schema as JSONSchema7;58const SAMPLE_EXTRACTION = sourcesSample.extraction as Record<string, unknown>;59const SAMPLE_SOURCES = sourcesSample.sources;6061export type JsonFormSourcesBlockProps = {62 defaultOpenPaths?: readonly string[];63 documentKind?: "pdf" | "image";64 extraction?: Record<string, unknown>;65 fallbackFrameSize?: { width: number; height: number };66 schema?: JSONSchema7;67 source?: ViewerSource;68 sources?: unknown;69};7071// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from retab-ui
All 130 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Classify Consensusclassify-consensus-viewer-block | retab-ui | Blocks | Free | 1 dep · 4 files | |
| CSV Sourcescsv-sources-block | retab-ui | Blocks | Free | no deps · 2 files | |
| DOCX Sourcesdocx-sources-block | retab-ui | Blocks | Free | no deps · 2 files | |
| Avatar Image Slotdropzone-avatar-image-slot | retab-ui | Blocks | Free | 1 dep · 2 files | |
| Dropzonedropzone-block | retab-ui | Blocks | Free | 1 dep · 26 files | |
| Comparison Pairdropzone-comparison-pair-upload | retab-ui | Blocks | Free | 1 dep · 2 files | |
| Controlled Queuedropzone-controlled-queue | retab-ui | Blocks | Free | 1 dep · 2 files | |
| Custom Thumbnail Griddropzone-custom-thumbnail-grid | retab-ui | Blocks | Free | 1 dep · 2 files |
