# document (frontend) UI for the archive's core concept: viewing, uploading, editing, searching, bulk-selecting, and transcribing documents. ## What this domain owns Components: `DocumentRow`, `DocumentThumbnail`, `DocumentTopBar`, `DocumentViewer`, `DocumentMetadataDrawer`, `DocumentEditLayout`, `DocumentStatusChip`, `UploadZone`, `BulkSelectionBar`, `BulkDropZone`. Utilities: `search.ts` (search-param helpers), `filename.ts` (filename formatting), `documentStatusLabel.ts` (i18n label mapping), `validateFile.ts` (upload validation), `groupDocuments.ts` (list grouping). Sub-folders: `annotation/`, `transcription/`, `viewer/`. ## What this domain does NOT own - Person typeahead — `person/PersonTypeahead.svelte` (cross-domain import, allowed by ESLint rule) - Tag input — `tag/TagInput.svelte` (cross-domain import, allowed) - Shared discussion — `shared/discussion/` (comment/mention editor) ## Key components | Component | Route used in | Notes | | --------------------------- | ---------------------------------- | ------------------------------------ | | `DocumentRow.svelte` | `/` (search results), admin queues | Compact document card with thumbnail | | `DocumentViewer.svelte` | `/documents/[id]` | PDF/image inline viewer | | `DocumentEditLayout.svelte` | `/documents/[id]/edit` | Full edit form with sticky save bar | | `UploadZone.svelte` | `/documents/new`, bulk upload | Drag-and-drop file drop area | | `BulkSelectionBar.svelte` | `/documents` bulk mode | Multi-select action bar | ## Cross-domain imports - `person/PersonTypeahead.svelte` — sender / receiver selection - `tag/TagInput.svelte` — tag chip input - `ocr/OcrProgress.svelte` — job status indicator in the document header - `shared/primitives/BackButton.svelte`, `shared/discussion/` — shared UI ## Backend counterpart `backend/src/main/java/org/raddatz/familienarchiv/document/README.md`