Files
HealthLog/src/app/documents/page.tsx
T
Marc-André Bombeck b8009d2e73 feat(documents): the vault surface
The page becomes one wide, calm filing-cabinet view: PageHeader with an
Upload action, a drop-target upload zone whose accept list and per-file
cap come from the usage endpoint (quota bar only above 80 %), a sticky
filter rail (200 ms debounced search focused by '/', nine type chips,
condition chips from linked episodes, a year segmenter, one-tap clear),
and the virtualized timeline below. Filter state lives in the URL so
every view is shareable and back-button-safe; uploads filtered to an
episode arrive pre-linked. Hovering a card prefetches detail metadata —
never the blob. Designed states: a skeleton grid that matches the loaded
layout, a teaching empty state, a distinct no-matches state, and a
retryable error card. /documents joins the shell's wide-container list;
the shell stays the single owner of the page frame. Locale bundles gain
the vault vocabulary in all six languages and drop the retired
extraction-review strings.

Plan-Task: W2-T1, W2-T4 (zone), W2-T5 (prefetch), W2-T6
2026-07-07 12:26:06 +02:00

19 lines
607 B
TypeScript

import { Suspense } from "react";
import { DocumentsView } from "@/components/documents/documents-view";
/**
* The Dokumente vault — server shell only. The client surface owns the
* module gate, the URL-backed filter state (which needs `useSearchParams`,
* hence the Suspense boundary), the virtualized timeline, and the upload
* queue. The route rides the AuthShell's wide-container flag: the shell
* owns the page frame, this file never re-implements paddings.
*/
export default function DocumentsPage() {
return (
<Suspense fallback={null}>
<DocumentsView />
</Suspense>
);
}