FileDropZone
ui formuploadinteraction
Wrappt beliebige Children und nimmt darauf abgelegte Dateien entgegen (MIME-Filter via accept). Beim Drag-Over erscheint ein dezenter Overlay-Hinweis. Nutzt den useFileDrop-Hook.
Dateien in den Bereich ziehen …
Abhängigkeiten
Barrierefreiheit
- Overlay ist aria-hidden (rein visuell). Für reine Tastaturbedienung zusätzlich einen <input type="file"> anbieten.
Beispiele
Bilder ablegen
<FileDropZone accept="image/*" onFiles={(files) => upload(files)} overlayLabel="Bilder ablegen">
<Gallery />
</FileDropZone> Genutzte Tokens · 7
--accent--elev-raised--fg--radius-md--space-3--space-5--surface
Quelldateien
components/ui/FileDropZone.tsx tsx
import type { ReactNode } from 'react';
import { useFileDrop } from '../../hooks/useFileDrop';
import styles from './FileDropZone.module.css';
interface Props {
accept?: string;
onFiles: (files: File[]) => void;
disabled?: boolean;
className?: string;
children: ReactNode;
/** Optionale Hinweis-Zeile, die beim Drag-Over als Overlay angezeigt wird. */
overlayLabel?: string;
}
/** Wrappt beliebige Children und nimmt darauf abgelegte Dateien entgegen.
* Beim Drag-Over wird ein dezenter Overlay-Hint eingeblendet. */
export function FileDropZone({
accept,
onFiles,
disabled,
className,
children,
overlayLabel = 'Dateien hier ablegen',
}: Props) {
const { dragOver, dropHandlers } = useFileDrop({ accept, onFiles, disabled });
const cls = [styles.root, dragOver ? styles.active : '', className].filter(Boolean).join(' ');
return (
<div className={cls} {...dropHandlers}>
{children}
{dragOver && (
<div className={styles.overlay} aria-hidden>
<div className={styles.overlayBox}>{overlayLabel}</div>
</div>
)}
</div>
);
}
components/ui/FileDropZone.module.css css
.root {
position: relative;
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
}
.overlay {
position: absolute;
inset: 0;
display: grid;
place-items: center;
pointer-events: none;
background: color-mix(in oklab, var(--accent), transparent 88%);
border: 2px dashed var(--accent);
border-radius: var(--radius-md);
z-index: 10;
}
.overlayBox {
background: var(--surface);
border: 1px solid var(--accent);
color: var(--fg);
padding: var(--space-3) var(--space-5);
border-radius: var(--radius-md);
font-weight: 500;
box-shadow: var(--elev-raised);
}
Holen
# MCP (Claude Code / Cursor)
get_component({ name: "file-drop-zone" })
# Registry direkt
https://www.ekklesi.tools/design/registry/components/file-drop-zone.json