# 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
- `shared/utils/monthBuckets.ts` — the density chart's pure month-bucket math (boundaries, gap-fill, year aggregation, axis ticks) now lives in `shared/` so the `timeline/` domain can reuse it; `document/timeline.ts` keeps only the `/api/documents/density` glue (`fetchDensity`, `buildDensityUrl`)

## Backend counterpart

`backend/src/main/java/org/raddatz/familienarchiv/document/README.md`
