import{n as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{t as n}from"./react-C21x__mS.js";import{i as r,n as i,r as a}from"./iframe-DaN-XFub.js";import{a as o,i as s,n as c}from"./utils-DUM89eIj.js";import{a as l,i as u,o as d,r as f,s as p}from"./file-vPGnhPr-.js";import{n as m,t as h}from"./InputFilesList-OEX4zGI3.js";var g,_;function v(){return(v=e((()=>{r(),g=[[`path`,{d:`M12 13v8`,key:`1l5pq0`}],[`path`,{d:`M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242`,key:`1pljnt`}],[`path`,{d:`m8 17 4-4 4 4`,key:`1quai1`}]],_=a(`cloud-upload`,g)})))()}var y,b;function x(){return(x=e((()=>{r(),y=[[`path`,{d:`M12 3v12`,key:`1x0j5s`}],[`path`,{d:`m17 8-5-5-5 5`,key:`7q97r8`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}]],b=a(`upload`,y)})))()}var S,C,w,T,E,D;function O(){return(O=e((()=>{S=`q2D6Pw`,C=`QVgB0d`,w=`-nyQKp`,T=`kY0O9g`,E=`F5K1bE`,D={zone:S,dragOver:C,disabled:w,icon:T,hint:E}})))()}function k({value:e,onChange:t,onChangeError:n,accept:r,allowedMime:i,maxBytes:a,readMode:s,multiple:u=!0,disabled:m,className:g,children:_}){l(i),d(r);let v=(0,A.useRef)(0),y=(0,A.useRef)(null),[x,S]=(0,A.useState)(!1),C=(0,A.useMemo)(()=>r&&r.length>0?r.join(`,`):i&&i.length>0?i.join(`,`):`*`,[i,r]),w=(0,A.useCallback)(e=>s===`array-buffer`?p(e,{allowedMime:i,maxBytes:a,mode:`array-buffer`}):p(e,{allowedMime:i,maxBytes:a}),[i,a,s]),T=(0,A.useCallback)(async e=>{if(m||e.length===0)return;let r=u?e:e.slice(0,1),i=[];for(let e of r)try{let t=await w(e);i.push(t)}catch(e){e instanceof f&&n&&n(e)}i.length>0&&t(i)},[m,u,t,n,w]),E=(0,A.useCallback)(()=>{m||y.current?.click()},[m]),O=(0,A.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),!m&&(v.current+=1,v.current===1&&S(!0))},[m]),k=(0,A.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),!m&&(e.dataTransfer.dropEffect=`copy`)},[m]),M=(0,A.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),!m&&(--v.current,v.current===0&&S(!1))},[m]),N=(0,A.useCallback)(async e=>{if(e.preventDefault(),e.stopPropagation(),v.current=0,S(!1),m)return;let t=Array.from(e.dataTransfer.files);await T(t)},[m,T]),P=(0,A.useCallback)(async e=>{let t=Array.from(e.target.files??[]);await T(t),e.target.value=``},[T]),F=(0,A.useCallback)(e=>{c(e,E,{disabled:m})},[m,E]);return(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`input`,{ref:y,type:`file`,hidden:!0,disabled:m,multiple:u,accept:C,onChange:P}),(0,j.jsx)(`div`,{className:o(D.zone,x&&D.dragOver,m&&D.disabled,g),onClick:E,onKeyDown:F,onDragEnter:O,onDragOver:k,onDragLeave:M,onDrop:N,role:`button`,tabIndex:m?-1:0,"aria-disabled":m,children:_??(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(b,{className:D.icon}),(0,j.jsx)(`span`,{className:D.hint,children:u?`Перетащите файлы сюда или нажмите для выбора`:`Перетащите файл сюда или нажмите для выбора`})]})}),(0,j.jsx)(h,{files:e,onChange:t})]})}var A,j;function M(){return(M=e((()=>{A=n(),u(),s(),x(),m(),O(),j=i(),k.__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:`Кастомный контент внутри зоны.
По умолчанию отображается иконка загрузки и текст "Перетащите файлы сюда".`}}}})))()}var N=t({Basic:()=>L,Disabled:()=>z,SingleFile:()=>R,__namedExportsOrder:()=>B,default:()=>I}),P,F,I,L,R,z,B;function V(){return(V=e((()=>{P=n(),v(),M(),F=i(),I={title:`Shared/UI/DropZone`,component:k,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`}}},L={render:e=>{let[t,n]=(0,P.useState)([]);return(0,F.jsxs)(`div`,{style:{display:`grid`,gap:12},children:[(0,F.jsx)(k,{...e,onChange:e=>n(e)}),(0,F.jsx)(`div`,{style:{fontSize:14},children:t.length>0?`Получено файлов: ${t.length}`:`Перетащите файл(ы) в область выше`})]})}},R={render:e=>(0,F.jsx)(k,{...e,multiple:!1,children:(0,F.jsxs)(`div`,{style:{display:`grid`,placeItems:`center`,gap:6,minHeight:120},children:[(0,F.jsx)(_,{}),(0,F.jsx)(`span`,{children:`Перетащите один файл`})]})}),args:{multiple:!1}},z={args:{disabled:!0,multiple:!0}},L.parameters={...L.parameters,docs:{...L.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>;
  }
}`,...L.parameters?.docs?.source}}},R.parameters={...R.parameters,docs:{...R.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
  }
}`,...R.parameters?.docs?.source}}},z.parameters={...z.parameters,docs:{...z.parameters?.docs,source:{originalSource:`{
  args: {
    disabled: true,
    multiple: true
  }
}`,...z.parameters?.docs?.source}}},B=[`Basic`,`SingleFile`,`Disabled`]})))()}export{V as a,R as i,z as n,N as r,L as t};