Files
familienarchiv/design_handoff_familienarchiv_redesign/README.md
marcel fa510f3991
Some checks failed
CI / Unit & Component Tests (push) Failing after 2m1s
CI / OCR Service Tests (push) Successful in 28s
CI / Backend Unit Tests (push) Successful in 6m21s
CI / fail2ban Regex (push) Successful in 44s
CI / Semgrep Security Scan (push) Successful in 27s
CI / Compose Bucket Idempotency (push) Successful in 1m8s
feat(redesign): token foundation close-out + design handoff (#854)
Adds the Mappe design handoff as in-repo ground truth and closes out the design-token foundation: --radius-sm/md/full + --shadow-sm/md tokens (distinct dark values in both dark blocks) and the canonical 10-color $lib/shared/avatarPalette.ts (AA-darkened sage/amber/sand swatches), guarded by avatarPalette.spec.ts. Closes #854.
2026-06-16 17:17:27 +02:00

7.4 KiB
Raw Blame History

Handoff: Familienarchiv — Visual Redesign ("Mappe" direction)

Overview

This package hands off a complete visual redesign of the Familienarchiv web app to a developer using Claude Code. Familienarchiv is a private digital family archive (German-first SvelteKit app) for digitising, transcribing, tagging and searching historical correspondence.

The redesign unifies every page under one system — internally called "Mappe" (German for folder/portfolio): a warm, archival, institutional look built on the De Gruyter Brill corporate identity. It also adds three new sections that did not exist in the old app (Geschichten, Zeitstrahl, Aktivitäten) alongside redesigns of the existing ones.

The work is broken into an epic with foundation-first stories. Read the three docs in this order:

  1. README.md (this file) — what's here, fidelity, how to use it.
  2. DESIGN_RULES.md — the binding visual law (tokens, type, the shared patterns). Read this before writing any code.
  3. EPIC.md — the epic + ordered stories + acceptance criteria. Implement in order.

About the design files

The files in prototypes/ are design references created in HTML — high-fidelity prototypes that show the intended look and behaviour exactly. They are not the production codebase and must not be shipped as-is. They are authored as "Design Components" (.dc.html) for a prototyping runtime (support.js); that runtime is not part of the target app.

Your task is to recreate these designs inside the existing Familienarchiv codebase (SvelteKit 2 + Svelte 5 + Tailwind 4 + Paraglide i18n) using its established patterns — real Svelte components, real routes, real i18n message keys. Where the prototype uses a made-up runtime construct (<dc-import>, <sc-for>, renderVals()), map it to the codebase's idiom (a Svelte component import, an {#each} block, component props/state).

Why HTML prototypes are the source of truth

Every colour, size, weight, spacing and radius is written inline in the prototype markup, and the files render. When the written spec and a prototype disagree, the prototype wins — open it in a browser and measure. Treat DESIGN_RULES.md and EPIC.md as the intent and ordering, and the prototypes as the pixel ground truth.

To view a prototype: open any prototypes/*.dc.html in a browser (they are self-contained; colors_and_type.css, support.js and assets/icons/ sit alongside them). Use the Hell / Dunkel toggle in the header to verify dark mode.

Fidelity

High-fidelity (hifi). Final colours, typography, spacing, radii, shadows, copy and interaction intent are all decided. Recreate pixel-perfectly using the codebase's existing libraries. Do not re-interpret the visual language — apply it.

What's in this bundle

design_handoff_familienarchiv_redesign/
├── README.md            ← you are here
├── DESIGN_RULES.md      ← binding tokens + shared patterns (the "rules")
├── EPIC.md              ← epic, stories, acceptance criteria (implement in order)
├── _AUTHORING_KIT.md    ← the contract every prototype was authored against (copy-verbatim snippets)
└── prototypes/          ← runnable hifi references (source of truth)
    │   ── original section screens ──
    ├── ArchiveHeader.dc.html      shared header + nav + theme toggle
    ├── Dokumente.dc.html          dashboard
    ├── Personen.dc.html           person directory
    ├── Geschichten.dc.html        curated story collections (list)
    ├── Geschichte.dc.html         single story detail (2 variants)
    ├── Zeitstrahl.dc.html         chronological timeline
    ├── Aktivitaeten.dc.html       activity feed
    ├── Regeln.dc.html             the design-rules spec page (internal reference)
    │   ── added screens (the previously un-prototyped pages) ──
    ├── Dokumente-Liste.dc.html    document search / grouped results
    ├── Dokument-Detail.dc.html    document viewer + transcription workbench
    ├── Dokument-Bearbeiten.dc.html edit / new / bulk-edit (variant prop)
    ├── PersonDetail.dc.html       person detail (read)
    ├── PersonForm.dc.html         person new / edit (variant prop)
    ├── PersonReview.dc.html       provisional-person triage workflow
    ├── Geschichte-Editor.dc.html  story authoring: new / story / journey (variant prop)
    ├── Ereignis-Editor.dc.html    timeline event new / edit (variant prop)
    ├── Stammbaum.dc.html          family tree
    ├── Themen.dc.html             topics / tag directory
    ├── Anreicherung.dc.html       enrich workflow: list / step / done (variant prop)
    ├── Profil.dc.html             account settings + public profile (variant prop)
    ├── Anmeldung.dc.html          auth: login / register / forgot / reset (variant prop, no app header)
    ├── Hilfe-Transkription.dc.html transcription help / guidelines
    │   ── shared assets ──
    ├── colors_and_type.css        design tokens (port into the app)
    ├── support.js                 prototype runtime — DO NOT ship
    └── assets/icons/              De Gruyter "Simple" icons used by the screens

Status note (2026-06-16). Two facts updated this bundle since the original handoff:

  1. This is now an alignment effort, not a greenfield reskin. The token system (DESIGN_RULES §12), dark mode, the app header, and the three "new" sections (Geschichten, Zeitstrahl, Aktivitäten) already exist in the codebase. Foundation Stories 14 are close-out + extraction of the missing shared primitives (PageHeader, Avatar/avatarFor, SegmentedControl, Card, MetaLine, EmptyState, StatusDot), not from-scratch builds. See the Gitea milestone "Mappe Visual Redesign" for the issue-level breakdown (shared components, then pages).
  2. Briefwechsel was dropped — that feature was removed from the product, so its prototype and nav entry are gone. Admin + OCR pages are deferred to a phase-2 milestone.

Assets

  • Icons — De Gruyter "Simple" Medium-24px SVGs in prototypes/assets/icons/. In the real app these live at static/degruyter-icons/Simple/… and are rendered as <img> tags. Reuse the existing app copies; this bundle ships only the subset the redesign touches so you can see which are needed.
  • Fonts — Montserrat + Tinos via Google Fonts (substitutes for Gotham + Times). The @import is at the top of colors_and_type.css. If the team has the licensed Gotham/Times faces, swap them in and keep the variable names.
  • Logo — none. The brand is the wordmark FAMILIENARCHIV (Montserrat Bold, uppercase, letter-spacing:.16em) on the navy header.

Target codebase notes

  • i18n: all copy in the prototypes is German. The app is German-first with en/es translations (Paraglide). Every visible string must become a message key, German written first. Existing keys live in frontend/messages/{de,en,es}.json.
  • Icons as <img>: keep the app convention — never inline SVG, never icon fonts. Dark mode inverts them globally via img[src*='degruyter-icons'] { filter: invert(1); }.
  • Tailwind 4: the prototypes use inline styles for clarity. Port them to the codebase's Tailwind utilities / @theme tokens — but the values must match the tokens in DESIGN_RULES.md exactly.