import{a as e,c as t,i as n}from"./preload-helper-B45gAKPr.js";import{$ as r,l as i,n as a,pn as o,t as s}from"./iframe-CMLjY6eW.js";import{a as c,i as l,n as u}from"./utils-PcgESe3m.js";import{a as d,i as f,o as p,r as m,s as h}from"./file-hArYcyES.js";import{i as g,r as _}from"./InputFiles-DnRctHku.js";var v=n((()=>{g()})),y,b,x,S,C,w,T=n((()=>{y=`q2D6Pw`,b=`QVgB0d`,x=`-nyQKp`,S=`kY0O9g`,C=`F5K1bE`,w={zone:y,dragOver:b,disabled:x,icon:S,hint:C}}));function E({value:e,onChange:t,onChangeError:n,accept:r,allowedMime:a,maxBytes:o,readMode:s,multiple:l=!0,disabled:f,className:g,children:v}){d(a),p(r);let y=(0,D.useRef)(0),b=(0,D.useRef)(null),[x,S]=(0,D.useState)(!1),C=(0,D.useMemo)(()=>r&&r.length>0?r.join(`,`):a&&a.length>0?a.join(`,`):`*`,[a,r]),T=(0,D.useCallback)(e=>s===`array-buffer`?h(e,{allowedMime:a,maxBytes:o,mode:`array-buffer`}):h(e,{allowedMime:a,maxBytes:o}),[a,o,s]),E=(0,D.useCallback)(async e=>{if(f||e.length===0)return;let r=l?e:e.slice(0,1),i=[];for(let e of r)try{let t=await T(e);i.push(t)}catch(e){e instanceof m&&n&&n(e)}i.length>0&&t(i)},[f,l,t,n,T]),k=(0,D.useCallback)(()=>{f||b.current?.click()},[f]),A=(0,D.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),!f&&(y.current+=1,y.current===1&&S(!0))},[f]),j=(0,D.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),!f&&(e.dataTransfer.dropEffect=`copy`)},[f]),M=(0,D.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),!f&&(--y.current,y.current===0&&S(!1))},[f]),N=(0,D.useCallback)(async e=>{if(e.preventDefault(),e.stopPropagation(),y.current=0,S(!1),f)return;let t=Array.from(e.dataTransfer.files);await E(t)},[f,E]),P=(0,D.useCallback)(async e=>{let t=Array.from(e.target.files??[]);await E(t),e.target.value=``},[E]),F=(0,D.useCallback)(e=>{u(e,k,{disabled:f})},[f,k]);return(0,O.jsxs)(`div`,{children:[(0,O.jsx)(`input`,{ref:b,type:`file`,hidden:!0,disabled:f,multiple:l,accept:C,onChange:P}),(0,O.jsx)(`div`,{className:c(w.zone,x&&w.dragOver,f&&w.disabled,g),onClick:k,onKeyDown:F,onDragEnter:A,onDragOver:j,onDragLeave:M,onDrop:N,role:`button`,tabIndex:f?-1:0,"aria-disabled":f,children:v??(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(i,{className:w.icon}),(0,O.jsx)(`span`,{className:w.hint,children:l?`Перетащите файлы сюда или нажмите для выбора`:`Перетащите файл сюда или нажмите для выбора`})]})}),(0,O.jsx)(_,{files:e,onChange:t})]})}var D,O,k=n((()=>{D=t(o(),1),f(),l(),a(),v(),T(),O=s(),E.__docgenInfo={description:`DropZone — зона для перетаскивания файлов и выбора по клику.

При наведении файла зона подсвечивается (пунктирная рамка меняет цвет).
При сбросе файлов каждый читается через readFile, успешные результаты
передаются в onDrop, ошибки — в onDropError.

Поддерживает кастомный контент через children.
Если children не указан — отображается иконка загрузки и подсказка.`,methods:[],displayName:`DropZone`,props:{value:{required:!0,tsType:{name:`Array`,elements:[{name:`ReadFileResult`}],raw:`ReadFileResult[]`},description:``},onChange:{required:!0,tsType:{name:`signature`,type:`function`,raw:`(results: ReadFileResult[]) => void`,signature:{arguments:[{type:{name:`Array`,elements:[{name:`ReadFileResult`}],raw:`ReadFileResult[]`},name:`results`}],return:{name:`void`}}},description:`Вызывается с массивом результатов readFile после сброса файлов`},onChangeError:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(error: ReadFileError) => void`,signature:{arguments:[{type:{name:`ReadFileError`},name:`error`}],return:{name:`void`}}},description:`Callback ошибки чтения одного из файлов`},accept:{required:!1,tsType:{name:`unknown`},description:'HTML-атрибут accept для нативного input[type="file"] (например `[".pdf", ".docx"]`)'},allowedMime:{required:!1,tsType:{name:`unknown`},description:'Список допустимых MIME-типов — передаётся в readFile (например `["application/pdf", "image/png"]`)'},maxBytes:{required:!1,tsType:{name:`number`},description:`Максимальный размер одного файла в байтах`},readMode:{required:!1,tsType:{name:`ReadMode`},description:`Режим чтения: "data-url" (по умолчанию) или "array-buffer"`},multiple:{required:!1,tsType:{name:`boolean`},description:`Разрешить сброс нескольких файлов (по умолчанию true)`,defaultValue:{value:`true`,computed:!1}},disabled:{required:!1,tsType:{name:`boolean`},description:`Блокировка компонента`},className:{required:!1,tsType:{name:`string`},description:`CSS-класс обёртки`},children:{required:!1,tsType:{name:`ReactNode`},description:`Кастомный контент внутри зоны.
По умолчанию отображается иконка загрузки и текст "Перетащите файлы сюда".`}}}})),A=e({Basic:()=>P,Disabled:()=>I,SingleFile:()=>F,__namedExportsOrder:()=>L,default:()=>N}),j,M,N,P,F,I,L,R=n((()=>{j=t(o(),1),a(),k(),M=s(),N={title:`Shared/UI/DropZone`,component:E,args:{value:[],onChange:()=>{},multiple:!0,readMode:`data-url`,disabled:!1},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{onChange:{description:`Вызывается с массивом успешно прочитанных файлов.`,control:!1},onChangeError:{description:`Вызывается при ошибке валидации или чтения файла.`,control:!1},allowedMime:{description:`Список допустимых MIME-типов для проверки.`,control:!1},maxBytes:{description:`Максимальный размер одного файла в байтах.`,control:`number`},readMode:{description:`Режим чтения файлов: data-url или array-buffer.`,control:`inline-radio`,options:[`data-url`,`array-buffer`]},multiple:{description:`Разрешает принимать несколько файлов за один drop.`,control:`boolean`},disabled:{description:`Блокирует зону и обработку drop-событий.`,control:`boolean`},children:{description:`Кастомный контент внутри drop-зоны.`,control:!1},className:{description:`Дополнительный CSS-класс контейнера.`,control:`text`}}},P={render:e=>{let[t,n]=(0,j.useState)([]);return(0,M.jsxs)(`div`,{style:{display:`grid`,gap:12},children:[(0,M.jsx)(E,{...e,onChange:e=>n(e)}),(0,M.jsx)(`div`,{style:{fontSize:14},children:t.length>0?`Получено файлов: ${t.length}`:`Перетащите файл(ы) в область выше`})]})}},F={render:e=>(0,M.jsx)(E,{...e,multiple:!1,children:(0,M.jsxs)(`div`,{style:{display:`grid`,placeItems:`center`,gap:6,minHeight:120},children:[(0,M.jsx)(r,{}),(0,M.jsx)(`span`,{children:`Перетащите один файл`})]})}),args:{multiple:!1}},I={args:{disabled:!0,multiple:!0}},P.parameters={...P.parameters,docs:{...P.parameters?.docs,source:{originalSource:`{
  render: args => {
    const [files, setFiles] = useState<ReadFileResult[]>([]);
    return <div style={{
      display: "grid",
      gap: 12
    }}>
                <DropZone {...args} onChange={results => setFiles(results)} />
                <div style={{
        fontSize: 14
      }}>
                    {files.length > 0 ? \`Получено файлов: \${files.length}\` : "Перетащите файл(ы) в область выше"}
                </div>
            </div>;
  }
}`,...P.parameters?.docs?.source}}},F.parameters={...F.parameters,docs:{...F.parameters?.docs,source:{originalSource:`{
  render: args => <DropZone {...args} multiple={false}>
            <div style={{
      display: "grid",
      placeItems: "center",
      gap: 6,
      minHeight: 120
    }}>
                <UploadCloudIcon />
                <span>Перетащите один файл</span>
            </div>
        </DropZone>,
  args: {
    multiple: false
  }
}`,...F.parameters?.docs?.source}}},I.parameters={...I.parameters,docs:{...I.parameters?.docs,source:{originalSource:`{
  args: {
    disabled: true,
    multiple: true
  }
}`,...I.parameters?.docs?.source}}},L=[`Basic`,`SingleFile`,`Disabled`]}));R();export{P as Basic,I as Disabled,F as SingleFile,L as __namedExportsOrder,N as default,R as n,A as t};