HiddenDropZone

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

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

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

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

Валидация (accept, maxSize → onFilesReject) и колбеки работают так же, как у 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
acceptAcceptInput—noРазрешённые типы: MIME-тип (`image/png`), шаблон (`image/*`) или расширение (`.pdf`). Строка или массив.
captureboolean | "user" | "environment"—noНативный `capture` скрытого input — источник захвата на мобильных (камера/микрофон).
childrenReactNode—yesДочерний контент, поверх которого отображается dropzone при drag
classNamestring—noCSS-класс
contentReactNode—noКонтент dropzone при drag (overlay)
data-test-idstring—no
disabledboolean—noДеактивирован ли компонент
formstring—noНативный `form` скрытого input — привязка к форме по `id`.
idstring—noНативный `id` скрытого input — для связи с `<label htmlFor>`.
innerRefRef<HTMLInputElement>—noСсылка на нативный `<input type="file">` — для интеграции с формами (react-hook-form `ref`).
maxSizenumber—noМаксимальный размер одного файла в байтах. Превысившие уходят в `onFilesReject`.
mode"multiple" | "single"multiplenoРежим загрузки
namestring—noНативный `name` скрытого input — для отправки формы и интеграции с form-библиотеками.
onChangeChangeEventHandler<HTMLInputElement>—noНативный `onChange` скрытого input. Вызывается до валидации с исходным событием.
onFilesReject((rejections: FileRejection[]) => void)—noКолбек с отклонёнными файлами и причиной (`maxSize` / `mime`).
onFilesUpload(files: File[]) => void—yesКолбек с принятыми файлами (прошедшими проверку `maxSize` и `accept`).
requiredboolean—noНативный `required` скрытого input.
size"l" | "m" | "s"mnoРазмер компонента

Unions

Types

HiddenDropZoneProps

Unions

Storybook

Figma