HiddenDropZone

Скрытая зона загрузки, которая становится видимой только во время перетаскивания файлов. Оверлей рендерится поверх произвольного контента (форма, карточка, редактор) и позволяет прикрепить файлы к существующей сущности без отдельной визуальной области.

Когда использовать

  • Прикрепление файлов к форме, где уже есть другие поля и нет места под явную зону.
  • Drop-to-attach поверх карточки задачи, чата, редактора.
  • Массовая загрузка поверх полноэкранного списка.

Когда не подходит: когда загрузка — первичный сценарий страницы и должна быть видна сразу — используйте Dropzone.

Валидация (accept, maxSizeonFilesReject) и колбеки работают так же, как у Dropzone. Но скрытая зона рендерит нативный <input type="file"> только во время перетаскивания, поэтому нативные form-атрибуты (name, required, submit по форме) на ней ненадёжны — для полноценного поля формы берите Dropzone или FileUpload.

Установка

pnpm add @cloud-ru/ds-dropzone
import { HiddenDropZone } from '@cloud-ru/ds-dropzone'

Примеры использования

Оверлей над формой

Оверлей над формойHiddenDropZone накрывает форму при drag
tsx
import { HiddenDropZone } from '@cloud-ru/ds-dropzone';
import { useState } from 'react';

export function HiddenDropZoneBasic() {
  const [files, setFiles] = useState<File[]>([]);

  return (
    <HiddenDropZone onFilesUpload={setFiles} content={<span>Отпустите, чтобы прикрепить файлы</span>}>
      <form>
        <label>
          Имя <input type='text' />
        </label>
        {files.length > 0 && <p>Прикреплено: {files.map(f => f.name).join(', ')}</p>}
      </form>
    </HiddenDropZone>
  );
}

Props

Types

PropsHiddenDropZoneProps
PropTypeDefaultRequiredDescription
acceptAcceptInputnoРазрешённые типы: MIME-тип (`image/png`), шаблон (`image/*`) или расширение (`.pdf`). Строка или массив.
captureboolean | "user" | "environment"noНативный `capture` скрытого input — источник захвата на мобильных (камера/микрофон).
childrenReactNodeyesДочерний контент, поверх которого отображается dropzone при drag
classNamestringnoCSS-класс
contentReactNodenoКонтент dropzone при drag (overlay)
data-test-idstringno
disabledbooleannoДеактивирован ли компонент
formstringnoНативный `form` скрытого input — привязка к форме по `id`.
idstringnoНативный `id` скрытого input — для связи с `<label htmlFor>`.
innerRefRef<HTMLInputElement>noСсылка на нативный `<input type="file">` — для интеграции с формами (react-hook-form `ref`).
maxSizenumbernoМаксимальный размер одного файла в байтах. Превысившие уходят в `onFilesReject`.
mode"multiple" | "single"multiplenoРежим загрузки
namestringnoНативный `name` скрытого input — для отправки формы и интеграции с form-библиотеками.
onChangeChangeEventHandler<HTMLInputElement>noНативный `onChange` скрытого input. Вызывается до валидации с исходным событием.
onFilesReject((rejections: FileRejection[]) => void)noКолбек с отклонёнными файлами и причиной (`maxSize` / `mime`).
onFilesUpload(files: File[]) => voidyesКолбек с принятыми файлами (прошедшими проверку `maxSize` и `accept`).
requiredbooleannoНативный `required` скрытого input.
size"l" | "m" | "s"mnoРазмер компонента

Unions

Types

HiddenDropZoneProps

Unions

Storybook

Figma