From 567612761d08fae4dfd23ef5693b69afb1dafb3a Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 5 May 2026 14:53:31 +0200 Subject: [PATCH] refactor: move lib-root files to lib/shared/ and finalize domain structure - Move api.server.ts, errors.ts, types.ts, utils.ts, relativeTime.ts to lib/shared/ - Move person relationship components to lib/person/relationship/ - Move Stammbaum components to lib/person/genealogy/ - Move HelpPopover to lib/shared/primitives/ - Update all import paths across routes, specs, and lib files - Update vi.mock() paths in server-project test files - Remove now-empty legacy directories (components/, hooks/, server/, etc.) - Update vite.config.ts coverage include paths for new structure - Update frontend/CLAUDE.md to reflect domain-based lib/ layout Co-Authored-By: Claude Sonnet 4.6 --- frontend/CLAUDE.md | 63 ++++++++++++------- .../document/DashboardNeedsMetadata.svelte | 2 +- .../document/DocumentMetadataDrawer.svelte | 2 +- .../annotation/AnnotationEditOverlay.svelte | 2 +- .../AnnotationEditOverlay.svelte.test.ts | 2 +- .../annotation/AnnotationLayer.svelte | 2 +- .../annotation/AnnotationLayer.svelte.test.ts | 2 +- .../annotation/AnnotationShape.svelte | 2 +- .../annotation/AnnotationShape.svelte.test.ts | 2 +- .../transcription/TranscriptionBlock.svelte | 2 +- .../TranscriptionBlock.test-host.svelte | 2 +- .../TranscriptionEditView.svelte | 2 +- .../TranscriptionPanelHeader.svelte | 2 +- .../TranscriptionReadView.svelte | 2 +- .../TranscriptionReadView.svelte.spec.ts | 2 +- .../TranscriptionReadView.svelte.test.ts | 2 +- .../transcription/blockConflictMerge.spec.ts | 2 +- .../transcription/blockConflictMerge.ts | 2 +- .../saveBlockWithConflictRetry.spec.ts | 2 +- .../saveBlockWithConflictRetry.ts | 2 +- .../useBlockAutoSave.svelte.test.ts | 2 +- .../transcription/useBlockAutoSave.svelte.ts | 2 +- .../useBlockDragDrop.svelte.test.ts | 2 +- .../transcription/useBlockDragDrop.svelte.ts | 2 +- .../src/lib/document/viewer/PdfViewer.svelte | 4 +- .../{ => genealogy}/StammbaumCard.svelte | 4 +- .../StammbaumCard.svelte.spec.ts | 4 +- .../{ => genealogy}/StammbaumSidePanel.svelte | 4 +- .../StammbaumSidePanel.svelte.spec.ts | 0 .../{ => genealogy}/StammbaumTree.svelte | 0 .../StammbaumTree.svelte.test.ts | 0 .../AddRelationshipForm.svelte | 0 .../AddRelationshipForm.svelte.spec.ts | 0 .../RelationshipChip.svelte | 0 .../RelationshipChip.svelte.spec.ts | 0 .../RelationshipPill.svelte | 0 frontend/src/lib/{ => shared}/api.server.ts | 0 .../shared/discussion/CommentMessage.svelte | 2 +- .../discussion/CommentMessage.svelte.spec.ts | 2 +- .../shared/discussion/CommentThread.svelte | 2 +- .../discussion/CommentThread.svelte.spec.ts | 2 +- .../shared/discussion/MentionEditor.svelte | 2 +- .../discussion/PersonMentionEditor.svelte | 2 +- .../src/lib/shared/discussion/mention.spec.ts | 2 +- frontend/src/lib/shared/discussion/mention.ts | 2 +- .../discussion/mentionSerializer.spec.ts | 2 +- .../shared/discussion/mentionSerializer.ts | 2 +- frontend/src/lib/{ => shared}/errors.ts | 0 .../{help => primitives}/HelpPopover.svelte | 0 .../HelpPopover.svelte.spec.ts | 0 .../src/lib/{ => shared}/relativeTime.spec.ts | 0 frontend/src/lib/{ => shared}/relativeTime.ts | 0 frontend/src/lib/{ => shared}/types.ts | 0 frontend/src/lib/{ => shared}/utils.spec.ts | 0 frontend/src/lib/{ => shared}/utils.ts | 0 frontend/src/routes/+page.server.ts | 2 +- frontend/src/routes/DropZone.svelte | 2 +- frontend/src/routes/admin/+layout.server.ts | 4 +- .../src/routes/admin/groups/+layout.server.ts | 2 +- .../routes/admin/groups/[id]/+page.server.ts | 4 +- .../admin/groups/[id]/page.server.spec.ts | 2 +- .../routes/admin/groups/layout.server.spec.ts | 4 +- .../routes/admin/groups/new/+page.server.ts | 4 +- .../src/routes/admin/invites/+page.server.ts | 2 +- .../src/routes/admin/invites/+page.svelte | 2 +- .../src/routes/admin/layout.server.spec.ts | 4 +- frontend/src/routes/admin/ocr/+page.server.ts | 4 +- .../admin/ocr/[personId]/+page.server.ts | 4 +- .../admin/ocr/[personId]/page.server.spec.ts | 2 +- .../routes/admin/ocr/global/+page.server.ts | 4 +- .../admin/ocr/global/page.server.spec.ts | 2 +- .../src/routes/admin/ocr/page.server.spec.ts | 2 +- .../src/routes/admin/tags/+layout.server.ts | 2 +- .../routes/admin/tags/[id]/+page.server.ts | 4 +- .../admin/tags/[id]/page.server.spec.ts | 2 +- .../routes/admin/tags/layout.server.spec.ts | 4 +- .../src/routes/admin/users/+layout.server.ts | 2 +- .../routes/admin/users/[id]/+page.server.ts | 4 +- .../routes/admin/users/layout.server.spec.ts | 4 +- .../routes/admin/users/new/+page.server.ts | 4 +- .../src/routes/aktivitaeten/+page.server.ts | 2 +- .../routes/aktivitaeten/page.server.spec.ts | 2 +- .../src/routes/briefwechsel/+page.server.ts | 4 +- .../routes/briefwechsel/page.server.spec.ts | 8 ++- frontend/src/routes/documents/+page.server.ts | 4 +- frontend/src/routes/documents/+page.svelte | 2 +- .../src/routes/documents/[id]/+page.server.ts | 4 +- .../src/routes/documents/[id]/+page.svelte | 6 +- .../documents/[id]/edit/+page.server.ts | 4 +- .../routes/documents/[id]/page.server.spec.ts | 4 +- .../routes/documents/bulk-edit/+page.svelte | 2 +- .../src/routes/documents/new/+page.server.ts | 4 +- .../src/routes/documents/page.server.spec.ts | 4 +- frontend/src/routes/enrich/+page.server.ts | 2 +- .../src/routes/enrich/[id]/+page.server.ts | 4 +- .../routes/forgot-password/+page.server.ts | 2 +- .../src/routes/geschichten/+page.server.ts | 4 +- .../routes/geschichten/[id]/+page.server.ts | 4 +- .../geschichten/[id]/edit/+page.server.ts | 4 +- .../routes/geschichten/[id]/edit/+page.svelte | 2 +- .../routes/geschichten/new/+page.server.ts | 2 +- .../src/routes/geschichten/new/+page.svelte | 2 +- frontend/src/routes/login/+page.server.ts | 2 +- frontend/src/routes/page.server.spec.ts | 4 +- frontend/src/routes/persons/+page.server.ts | 4 +- .../src/routes/persons/[id]/+page.server.ts | 4 +- .../routes/persons/[id]/edit/+page.server.ts | 4 +- .../src/routes/persons/[id]/edit/+page.svelte | 2 +- .../routes/persons/[id]/page.server.spec.ts | 4 +- .../src/routes/persons/new/+page.server.ts | 4 +- frontend/src/routes/profile/+page.server.ts | 4 +- frontend/src/routes/register/+page.server.ts | 2 +- frontend/src/routes/register/+page.svelte | 2 +- .../src/routes/reset-password/+page.server.ts | 4 +- .../src/routes/reset-password/+page.svelte | 2 +- frontend/src/routes/stammbaum/+page.server.ts | 4 +- frontend/src/routes/stammbaum/+page.svelte | 4 +- .../src/routes/users/[id]/+page.server.ts | 4 +- frontend/vite.config.ts | 2 +- 119 files changed, 186 insertions(+), 167 deletions(-) rename frontend/src/lib/person/{ => genealogy}/StammbaumCard.svelte (96%) rename frontend/src/lib/person/{ => genealogy}/StammbaumCard.svelte.spec.ts (90%) rename frontend/src/lib/person/{ => genealogy}/StammbaumSidePanel.svelte (96%) rename frontend/src/lib/person/{ => genealogy}/StammbaumSidePanel.svelte.spec.ts (100%) rename frontend/src/lib/person/{ => genealogy}/StammbaumTree.svelte (100%) rename frontend/src/lib/person/{ => genealogy}/StammbaumTree.svelte.test.ts (100%) rename frontend/src/lib/person/{ => relationship}/AddRelationshipForm.svelte (100%) rename frontend/src/lib/person/{ => relationship}/AddRelationshipForm.svelte.spec.ts (100%) rename frontend/src/lib/person/{ => relationship}/RelationshipChip.svelte (100%) rename frontend/src/lib/person/{ => relationship}/RelationshipChip.svelte.spec.ts (100%) rename frontend/src/lib/person/{ => relationship}/RelationshipPill.svelte (100%) rename frontend/src/lib/{ => shared}/api.server.ts (100%) rename frontend/src/lib/{ => shared}/errors.ts (100%) rename frontend/src/lib/shared/{help => primitives}/HelpPopover.svelte (100%) rename frontend/src/lib/shared/{help => primitives}/HelpPopover.svelte.spec.ts (100%) rename frontend/src/lib/{ => shared}/relativeTime.spec.ts (100%) rename frontend/src/lib/{ => shared}/relativeTime.ts (100%) rename frontend/src/lib/{ => shared}/types.ts (100%) rename frontend/src/lib/{ => shared}/utils.spec.ts (100%) rename frontend/src/lib/{ => shared}/utils.ts (100%) diff --git a/frontend/CLAUDE.md b/frontend/CLAUDE.md index 551a1f34..47b2d1b9 100644 --- a/frontend/CLAUDE.md +++ b/frontend/CLAUDE.md @@ -35,24 +35,40 @@ src/ │ ├── api/ # Internal API proxies (server-side only) │ ├── login/ logout/ # Auth pages │ └── ... -├── lib/ -│ ├── components/ # Reusable Svelte components -│ │ ├── document/ # Document-specific components -│ │ ├── chronik/ # Activity feed components -│ │ └── user/ # User-related components +├── lib/ # Domain-based package structure (mirrors backend) +│ ├── document/ # Document domain: components, stores, services, utils +│ │ ├── annotation/ # Annotation overlay components +│ │ ├── comment/ # Comment thread components +│ │ └── transcription/ # Transcription editor + block logic +│ ├── person/ # Person domain: chips, typeahead, avatar, format +│ │ ├── relationship/ # Relationship form + chip components +│ │ └── genealogy/ # Stammbaum (family tree) components +│ ├── tag/ # Tag domain: TagInput, TagChipList, TagParentPicker +│ ├── geschichte/ # Geschichte (story) domain: editor + card +│ ├── notification/ # Notification bell + dropdown + store +│ ├── activity/ # Activity feed (Chronik) components +│ ├── conversation/ # Bilateral conversation (Briefwechsel) components +│ ├── ocr/ # OCR progress, training cards, trigger +│ ├── user/ # User profile/password/groups section components +│ ├── shared/ # Cross-domain utilities and primitives +│ │ ├── actions/ # Svelte actions (clickOutside, etc.) +│ │ ├── hooks/ # Reusable Svelte state hooks (useTypeahead, etc.) +│ │ ├── server/ # Server-only utilities (locale, session) +│ │ ├── services/ # Client-side service helpers +│ │ ├── utils/ # Pure utility functions (date, search, etc.) +│ │ ├── primitives/ # Generic UI primitives (BackButton, ProgressRing, etc.) +│ │ ├── dashboard/ # Dashboard stat components +│ │ ├── discussion/ # CommentThread + shared discussion UI +│ │ ├── help/ # Help/FAQ page components +│ │ ├── api.server.ts # Typed API client factory +│ │ ├── errors.ts # Error code mapping (mirrors backend ErrorCode) +│ │ ├── types.ts # Shared TypeScript types +│ │ ├── relativeTime.ts # Relative time formatting +│ │ └── utils.ts # Top-level shared utilities │ ├── generated/ # Auto-generated API types (openapi-typescript) -│ ├── server/ # Server-only utilities (db, auth helpers) -│ ├── services/ # Client-side service logic -│ ├── stores/ # Svelte stores (global state) -│ ├── types.ts # Shared TypeScript types -│ ├── errors.ts # Error code mapping (mirrors backend ErrorCode) -│ ├── api.server.ts # Typed API client factory -│ ├── utils.ts # Shared utilities -│ ├── relativeTime.ts # Time formatting -│ ├── search.ts # Search utilities │ └── paraglide/ # Generated i18n code ├── hooks/ # SvelteKit hooks (handle, handleFetch) -└── actions/ # Custom Svelte actions (click outside, etc.) +└── ... # Other SvelteKit config files ``` ## API Client Pattern @@ -130,14 +146,15 @@ Card pattern for content sections: ## Key UI Components -| Component | Props | Description | -| -------------------- | ---------------------------------------------------- | ------------------------------------- | -| `PersonTypeahead` | `name`, `label`, `value`, `initialName`, `on:change` | Single-person selector with typeahead | -| `PersonMultiSelect` | `selectedPersons` (bind) | Chip-based multi-person selector | -| `TagInput` | `tags` (bind), `allowCreation?`, `on:change` | Tag chip input with typeahead | -| `PdfViewer` | `url`, `annotations`, `on:annotation` | PDF rendering with annotation overlay | -| `TranscriptionBlock` | `block`, `mode` | Read/edit transcription block | -| `DocumentTopBar` | `document` | Responsive document metadata header | +| Component | Location | Props | Description | +| -------------------- | ------------------------------ | --------------------------------------- | ------------------------------------------ | +| `PersonTypeahead` | `$lib/person/` | `name`, `label`, `value`, `initialName` | Single-person selector with typeahead | +| `PersonMultiSelect` | `$lib/person/` | `selectedPersons` (bind) | Chip-based multi-person selector | +| `TagInput` | `$lib/tag/` | `tags` (bind), `allowCreation?` | Tag chip input with typeahead | +| `PdfViewer` | `$lib/document/` | `url`, `annotations` | PDF rendering with annotation overlay | +| `TranscriptionBlock` | `$lib/document/transcription/` | `block`, `mode` | Read/edit transcription block | +| `DocumentTopBar` | `$lib/document/` | `document` | Responsive document metadata header | +| `BackButton` | `$lib/shared/primitives/` | — | Calls `history.back()`; 44 px touch target | ## How to Run diff --git a/frontend/src/lib/document/DashboardNeedsMetadata.svelte b/frontend/src/lib/document/DashboardNeedsMetadata.svelte index 79303308..9bcf1c72 100644 --- a/frontend/src/lib/document/DashboardNeedsMetadata.svelte +++ b/frontend/src/lib/document/DashboardNeedsMetadata.svelte @@ -1,6 +1,6 @@