@webority/ui-react 0.60.1 → 0.61.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- import e from"./warnInvalidValue.js";import t from"./warnUnknownProps.js";import{shortcutAria as n}from"../lib/shortcutChip.js";import r from"./withTooltip.js";import i from"./renderIconProp.js";import{jsx as a}from"react/jsx-runtime";var o=[`linear`,`outline`,`bold`,`bulk`,`broken`,`twotone`];function s({icon:s,iconVariant:c,label:l,tooltipPlacement:u=`auto`,shortcut:d,danger:f=!1,disabled:p=!1,size:m=20,onClick:h,className:g=``,as:_,href:v,...y}){t(`AppActionIcon`,_===void 0?y:{...y,as:_}),e(`AppActionIcon`,`iconVariant`,c,o);let b=[`u-action`,f?`danger`:``,g].filter(Boolean).join(` `),{style:x,...S}=y,C={"--wui-action-size":`${m+16}px`,...x},w=_??(v?`a`:`button`),T=w===`button`;return r(a(w,{type:T?`button`:void 0,href:T||p?void 0:v,className:b,style:C,"aria-label":l,"aria-keyshortcuts":n(d),disabled:T?p:void 0,"aria-disabled":!T&&p?`true`:void 0,role:!T&&p?`link`:void 0,tabIndex:!T&&p?-1:void 0,onClick:e=>{if(p){e.preventDefault(),e.stopPropagation();return}h?.(e)},...S,children:i(s,{size:m,variant:c})}),l,u,d)}export{s as default};
1
+ import e from"./warnInvalidValue.js";import t from"./warnUnknownProps.js";import{shortcutAria as n}from"../lib/shortcutChip.js";import r from"./withTooltip.js";import i from"./renderIconProp.js";import{useRef as a}from"react";import{Fragment as o,jsx as s,jsxs as c}from"react/jsx-runtime";var l=[`linear`,`outline`,`bold`,`bulk`,`broken`,`twotone`];function u({icon:u,iconVariant:d,label:f,tooltipPlacement:p=`auto`,shortcut:m,danger:h=!1,disabled:g=!1,size:_=20,onClick:v,className:y=``,as:b,href:x,accept:S,multiple:C=!1,onFiles:w,...T}){t(`AppActionIcon`,b===void 0?T:{...T,as:b}),e(`AppActionIcon`,`iconVariant`,d,l);let E=typeof w==`function`;E&&(b!==void 0||x!==void 0)&&console.warn(`AppActionIcon: file mode renders a button; href and as are ignored.`),!E&&(S!==void 0||C)&&console.warn(`AppActionIcon: accept and multiple apply only in file mode (pass onFiles).`);let D=a(null),O=e=>{let t=[...e.target.files];e.target.value=``,t.length>0&&w(t)},k=[`u-action`,h?`danger`:``,y].filter(Boolean).join(` `),{style:A,...j}=T,M={"--wui-action-size":`${_+16}px`,...A},N=E?`button`:b??(x?`a`:`button`),P=N===`button`,F=r(s(N,{type:P?`button`:void 0,href:P||g?void 0:x,className:k,style:M,"aria-label":f,"aria-keyshortcuts":n(m),disabled:P?g:void 0,"aria-disabled":!P&&g?`true`:void 0,role:!P&&g?`link`:void 0,tabIndex:!P&&g?-1:void 0,onClick:e=>{if(g){e.preventDefault(),e.stopPropagation();return}v?.(e),E&&!e.defaultPrevented&&D.current?.click()},...j,children:i(u,{size:_,variant:d})}),f,p,m);return E?c(o,{children:[F,s(`input`,{type:`file`,ref:D,className:`wui-action-icon-file`,hidden:!0,tabIndex:-1,"aria-hidden":`true`,accept:S,multiple:C,onChange:O,onClick:e=>e.stopPropagation()})]}):F}export{u as default};
@@ -1 +1 @@
1
- import e from"./warnUnknownProps.js";import t from"./AppIcon.js";import{DEFAULT_MAX_SIZE_MB as n,acceptLabel as r,validateFile as i}from"@webority/ui-elements/helpers";import{useId as a,useState as o}from"react";import{jsx as s,jsxs as c}from"react/jsx-runtime";function l({label:l,id:u,onChange:d,multiple:f=!1,accept:p=``,maxSizeMb:m=n,error:h,hint:g,disabled:_=!1,className:v=``,fieldClassName:y=``,style:b,...x}){e(`AppDropZone`,x);let[S,C]=o(!1),[w,T]=o(``),E=a(),D=u||E,O=h||w,k=O?`${D}-error`:void 0,A=g&&!O?`${D}-hint`:void 0,j=k||A,M=p?r(p):`Any file type`,N=e=>{let t=Array.from(e||[]);if(!t.length)return;if(!f){let e=i(t[0],{accept:p,maxSizeMb:m});T(e||``),e||d(t[0]);return}let n=``,r=[];for(let e of t){let t=i(e,{accept:p,maxSizeMb:m});if(t){n||=t;continue}r.push(e)}T(n),r.length&&d(r)};return c(`div`,{className:`field${y?` ${y}`:``}`,children:[l?s(`label`,{className:`label`,htmlFor:D,children:l}):null,c(`div`,{className:`file-input file-input-tall${S?` dragging`:``}${O?` error`:``}${v?` ${v}`:``}`,style:b,"aria-disabled":_||void 0,onDragOver:e=>{e.preventDefault(),!_&&!S&&C(!0)},onDragLeave:e=>{e.preventDefault(),C(!1)},onDrop:e=>{e.preventDefault(),C(!1),_||N(e.dataTransfer.files)},children:[c(`label`,{htmlFor:D,className:`file-input-zone-label`,children:[s(`span`,{className:`file-input-icon`,children:s(t,{name:`upload`,size:24})}),c(`span`,{className:`file-input-title`,children:[s(`span`,{className:`browse`,children:`Click to upload`}),` or drag & drop`]}),s(`span`,{className:`file-input-text`,children:m>0?`${M} · up to ${m} MB`:M})]}),s(`input`,{id:D,type:`file`,"aria-describedby":j,accept:p,multiple:f||void 0,disabled:_||void 0,className:`visually-hidden`,onClick:e=>{e.currentTarget.value=``},onChange:e=>N(e.target.files),...x})]}),O?s(`div`,{className:`field-error`,id:k,children:O}):g?s(`div`,{className:`field-hint`,id:A,children:g}):null]})}export{l as default};
1
+ import e from"./warnUnknownProps.js";import t from"./AppIcon.js";import{DEFAULT_MAX_SIZE_MB as n,acceptLabel as r,validateFile as i}from"@webority/ui-elements/helpers";import{useId as a,useState as o}from"react";import{jsx as s,jsxs as c}from"react/jsx-runtime";function l({label:l,id:u,onChange:d,multiple:f=!1,accept:p=``,maxSizeMb:m=n,error:h,hint:g,disabled:_=!1,className:v=``,fieldClassName:y=``,style:b,...x}){e(`AppDropZone`,x);let[S,C]=o(!1),[w,T]=o(``),E=a(),D=u||E,O=h||w,k=O?`${D}-error`:void 0,A=g&&!O?`${D}-hint`:void 0,j=k||A,M=p?r(p):`Any file type`,N=e=>{let t=Array.from(e||[]);if(!t.length)return;if(!f){let e=i(t[0],{accept:p,maxSizeMb:m});T(e||``),e||d(t[0]);return}let n=``,r=[];for(let e of t){let t=i(e,{accept:p,maxSizeMb:m});if(t){n||=t;continue}r.push(e)}T(n),r.length&&d(r)};return c(`div`,{className:`field${y?` ${y}`:``}`,children:[l?s(`label`,{className:`label`,htmlFor:D,children:l}):null,c(`div`,{className:`file-input file-input-tall${S?` dragging`:``}${O?` error`:``}${v?` ${v}`:``}`,style:b,"aria-disabled":_||void 0,onDragOver:e=>{e.preventDefault(),!_&&!S&&C(!0)},onDragLeave:e=>{e.preventDefault(),C(!1)},onDrop:e=>{e.preventDefault(),C(!1),_||N(e.dataTransfer.files)},children:[c(`label`,{htmlFor:D,className:`file-input-zone-label`,children:[s(`span`,{className:`file-input-icon`,children:s(t,{name:`upload`,size:24})}),c(`span`,{className:`file-input-title`,children:[s(`span`,{className:`browse`,children:`Click to upload`}),` or drag & drop`]}),s(`span`,{className:`file-input-text`,children:m>0?`${M}, up to ${m} MB`:M})]}),s(`input`,{id:D,type:`file`,"aria-describedby":j,accept:p,multiple:f||void 0,disabled:_||void 0,className:`visually-hidden`,onClick:e=>{e.currentTarget.value=``},onChange:e=>N(e.target.files),...x})]}),O?s(`div`,{className:`field-error`,id:k,children:O}):g?s(`div`,{className:`field-hint`,id:A,children:g}):null]})}export{l as default};
@@ -1 +1 @@
1
- import e from"./warnUnknownProps.js";import t from"./withTooltip.js";import n from"./AppIcon.js";import r from"./AppRequiredMark.js";import{keyOf as i}from"../lib/fileItem.js";import a from"../lib/FileItemRow.js";import{DEFAULT_MAX_SIZE_MB as o,acceptLabel as s,isImageFile as c,isImageOnlyAccept as ee,isPdfFile as l,validateFile as u}from"@webority/ui-elements/helpers";import{useEffect as d,useId as te,useRef as f,useState as p}from"react";import{jsx as m,jsxs as h}from"react/jsx-runtime";function g({label:g,value:_,name:ne,id:re,onPick:v,multiple:y=!1,maxFiles:b,accept:x=`.jpg,.jpeg,.png`,maxSizeMb:S=o,required:ie,error:ae,hint:C,loading:w=!1,className:T=``,fieldClassName:E=``,style:D,...O}){e(`AppFilePicker`,O);let[oe,k]=p(null),[se,A]=p(null),[j,M]=p(!1),[N,P]=p(``),F=f(null),ce=te(),I=re||ce;d(()=>{if(!y&&_ instanceof File&&c(_)){let e=URL.createObjectURL(_);return k(e),()=>URL.revokeObjectURL(e)}k(null)},[_,y]);let L=!y&&_&&!c(_)&&l(_)?_ instanceof File?_:_.url:null;d(()=>{if(!L){A(null);return}let e=!0,t=null;return import(`@webority/ui-elements/file-viewer`).then(e=>e.renderPdfFirstPage(typeof L==`string`?{url:L}:L)).then(n=>{e&&(t=URL.createObjectURL(n),A(t))}).catch(e=>console.warn(`[AppFilePicker] the PDF preview failed:`,e?.message)),()=>{e=!1,A(null),t&&URL.revokeObjectURL(t)}},[L]);let R=y?Array.isArray(_)?_:_?[_]:[]:[],z=ae||N,B=z?`${I}-error`:void 0,V=C&&!z?`${I}-hint`:void 0,H=B||V,U=ee(x),W=!y&&!!_,G=W&&(_ instanceof File?c(_):U||c(_)),le=_?.name,K=G?_?.url||oe:se,q=G?`image`:`file`,ue=g?`Change ${g}`:`Change ${q}`,J=g?`Remove ${g}`:`Remove ${q}`,Y=g?`${g} preview`:`Selected ${q} preview`,X=e=>{let t=u(e,{accept:x,maxSizeMb:S});return t?(P(t),!1):(P(``),v(e),!0)},Z=e=>{let t=Array.from(e||[]);if(!t.length)return;let n=Array.isArray(_)?_:_?[_]:[],r=new Set(n.map(i)),a=``,o=[];for(let e of t){let t=u(e,{accept:x,maxSizeMb:S});if(t){a||=t;continue}r.has(i(e))||(r.add(i(e)),o.push(e))}let s=n.concat(o);b&&s.length>b&&(s=s.slice(0,b),a||=`Up to ${b} files.`),P(a),v(s)},de=e=>{if(y){Z(e.target.files);return}let t=e.target.files?.[0]||null;t&&(X(t)||(e.target.value=``))},fe=e=>{if(e.preventDefault(),M(!1),w)return;if(y){Z(e.dataTransfer.files);return}let t=e.dataTransfer.files?.[0];t&&X(t)},pe=e=>{P(``),v(R.filter((t,n)=>n!==e))},me=()=>F.current?.click(),Q=w?m(`span`,{className:`wui-file-busy`,children:m(`span`,{className:`spinner-border spinner-border-sm`,role:`status`,"aria-label":`Loading`})}):null,$=m(`input`,{id:I,name:ne,ref:F,type:`file`,"aria-describedby":H,accept:x,multiple:y||void 0,disabled:w||void 0,className:`visually-hidden`,onClick:e=>{e.currentTarget.value=``},onChange:de,...O});return h(`div`,{className:`field${E?` ${E}`:``}`,children:[h(`label`,{className:`label`,htmlFor:I,children:[g,ie&&m(r,{})]}),W?h(`div`,{className:`file-preview${z?` error`:``}${T?` ${T}`:``}`,style:D,"aria-busy":w||void 0,children:[h(`button`,{type:`button`,className:`file-preview-open`,"aria-label":ue,onClick:me,disabled:w,children:[K?m(`img`,{src:K,alt:Y,className:`file-preview-img`}):h(`span`,{className:`file-preview-file`,children:[m(n,{name:`file-text`,size:28}),m(`span`,{className:`file-preview-file-name`,children:le})]}),m(`span`,{className:`file-preview-overlay`,children:h(`span`,{className:`file-preview-cta`,children:[m(n,{name:G?`image`:`file-text`,size:16}),` `,G?`Change image`:`Change file`]})})]}),t(m(`button`,{type:`button`,className:`file-preview-remove`,"aria-label":J,onClick:()=>v(null),disabled:w,children:m(n,{name:`x`,size:16})}),J),$,Q]}):h(`div`,{className:`file-input file-input-tall${j?` dragging`:``}${z?` error`:``}${y&&R.length>0?` has-files`:``}${T?` ${T}`:``}`,style:D,"aria-busy":w||void 0,onDragOver:e=>{e.preventDefault(),!w&&!j&&M(!0)},onDragLeave:e=>{e.preventDefault(),M(!1)},onDrop:fe,children:[h(`label`,{htmlFor:I,className:`file-input-zone-label`,children:[m(`span`,{className:`file-input-icon`,children:m(n,{name:`upload`,size:24})}),h(`span`,{className:`file-input-title`,children:[m(`span`,{className:`browse`,children:`Click to upload`}),` or drag & drop`]}),m(`span`,{className:`file-input-text`,children:S>0?`${s(x)} · up to ${S} MB`:s(x)})]}),$,Q,y&&R.length>0&&m(`div`,{className:`attach-list`,children:R.map((e,t)=>m(a,{item:e,isImage:e instanceof File?c(e):U||c(e),noun:`file`,onRemove:()=>pe(t)},i(e)))})]}),z?m(`div`,{className:`field-error`,id:B,children:z}):C?m(`div`,{className:`field-hint`,id:V,children:C}):null]})}export{g as default};
1
+ import e from"./warnUnknownProps.js";import t from"./withTooltip.js";import n from"./AppIcon.js";import r from"./AppRequiredMark.js";import{keyOf as i}from"../lib/fileItem.js";import a from"../lib/FileItemRow.js";import{DEFAULT_MAX_SIZE_MB as o,acceptLabel as s,isImageFile as c,isImageOnlyAccept as ee,isPdfFile as l,validateFile as u}from"@webority/ui-elements/helpers";import{useEffect as d,useId as te,useRef as f,useState as p}from"react";import{jsx as m,jsxs as h}from"react/jsx-runtime";function g({label:g,value:_,name:ne,id:re,onPick:v,multiple:y=!1,maxFiles:b,accept:x=`.jpg,.jpeg,.png`,maxSizeMb:S=o,required:ie,error:ae,hint:C,loading:w=!1,className:T=``,fieldClassName:E=``,style:D,...O}){e(`AppFilePicker`,O);let[oe,k]=p(null),[se,A]=p(null),[j,M]=p(!1),[N,P]=p(``),F=f(null),ce=te(),I=re||ce;d(()=>{if(!y&&_ instanceof File&&c(_)){let e=URL.createObjectURL(_);return k(e),()=>URL.revokeObjectURL(e)}k(null)},[_,y]);let L=!y&&_&&!c(_)&&l(_)?_ instanceof File?_:_.url:null;d(()=>{if(!L){A(null);return}let e=!0,t=null;return import(`@webority/ui-elements/file-viewer`).then(e=>e.renderPdfFirstPage(typeof L==`string`?{url:L}:L)).then(n=>{e&&(t=URL.createObjectURL(n),A(t))}).catch(e=>console.warn(`[AppFilePicker] the PDF preview failed:`,e?.message)),()=>{e=!1,A(null),t&&URL.revokeObjectURL(t)}},[L]);let R=y?Array.isArray(_)?_:_?[_]:[]:[],z=ae||N,B=z?`${I}-error`:void 0,V=C&&!z?`${I}-hint`:void 0,H=B||V,U=ee(x),W=!y&&!!_,G=W&&(_ instanceof File?c(_):U||c(_)),le=_?.name,K=G?_?.url||oe:se,q=G?`image`:`file`,ue=g?`Change ${g}`:`Change ${q}`,J=g?`Remove ${g}`:`Remove ${q}`,Y=g?`${g} preview`:`Selected ${q} preview`,X=e=>{let t=u(e,{accept:x,maxSizeMb:S});return t?(P(t),!1):(P(``),v(e),!0)},Z=e=>{let t=Array.from(e||[]);if(!t.length)return;let n=Array.isArray(_)?_:_?[_]:[],r=new Set(n.map(i)),a=``,o=[];for(let e of t){let t=u(e,{accept:x,maxSizeMb:S});if(t){a||=t;continue}r.has(i(e))||(r.add(i(e)),o.push(e))}let s=n.concat(o);b&&s.length>b&&(s=s.slice(0,b),a||=`Up to ${b} files.`),P(a),v(s)},de=e=>{if(y){Z(e.target.files);return}let t=e.target.files?.[0]||null;t&&(X(t)||(e.target.value=``))},fe=e=>{if(e.preventDefault(),M(!1),w)return;if(y){Z(e.dataTransfer.files);return}let t=e.dataTransfer.files?.[0];t&&X(t)},pe=e=>{P(``),v(R.filter((t,n)=>n!==e))},me=()=>F.current?.click(),Q=w?m(`span`,{className:`wui-file-busy`,children:m(`span`,{className:`spinner-border spinner-border-sm`,role:`status`,"aria-label":`Loading`})}):null,$=m(`input`,{id:I,name:ne,ref:F,type:`file`,"aria-describedby":H,accept:x,multiple:y||void 0,disabled:w||void 0,className:`visually-hidden`,onClick:e=>{e.currentTarget.value=``},onChange:de,...O});return h(`div`,{className:`field${E?` ${E}`:``}`,children:[h(`label`,{className:`label`,htmlFor:I,children:[g,ie&&m(r,{})]}),W?h(`div`,{className:`file-preview${z?` error`:``}${T?` ${T}`:``}`,style:D,"aria-busy":w||void 0,children:[h(`button`,{type:`button`,className:`file-preview-open`,"aria-label":ue,onClick:me,disabled:w,children:[K?m(`img`,{src:K,alt:Y,className:`file-preview-img`}):h(`span`,{className:`file-preview-file`,children:[m(n,{name:`file-text`,size:28}),m(`span`,{className:`file-preview-file-name`,children:le})]}),m(`span`,{className:`file-preview-overlay`,children:h(`span`,{className:`file-preview-cta`,children:[m(n,{name:G?`image`:`file-text`,size:16}),` `,G?`Change image`:`Change file`]})})]}),t(m(`button`,{type:`button`,className:`file-preview-remove`,"aria-label":J,onClick:()=>v(null),disabled:w,children:m(n,{name:`x`,size:16})}),J),$,Q]}):h(`div`,{className:`file-input file-input-tall${j?` dragging`:``}${z?` error`:``}${y&&R.length>0?` has-files`:``}${T?` ${T}`:``}`,style:D,"aria-busy":w||void 0,onDragOver:e=>{e.preventDefault(),!w&&!j&&M(!0)},onDragLeave:e=>{e.preventDefault(),M(!1)},onDrop:fe,children:[h(`label`,{htmlFor:I,className:`file-input-zone-label`,children:[m(`span`,{className:`file-input-icon`,children:m(n,{name:`upload`,size:24})}),h(`span`,{className:`file-input-title`,children:[m(`span`,{className:`browse`,children:`Click to upload`}),` or drag & drop`]}),m(`span`,{className:`file-input-text`,children:S>0?`${s(x)}, up to ${S} MB`:s(x)})]}),$,Q,y&&R.length>0&&m(`div`,{className:`attach-list`,children:R.map((e,t)=>m(a,{item:e,isImage:e instanceof File?c(e):U||c(e),noun:`file`,onRemove:()=>pe(t)},i(e)))})]}),z?m(`div`,{className:`field-error`,id:B,children:z}):C?m(`div`,{className:`field-hint`,id:V,children:C}):null]})}export{g as default};
@@ -1 +1 @@
1
- import{useEffect as e,useState as t}from"react";function n(e){return e instanceof File?`${e.name}:${e.size}`:e?.url||e?.name||`item`}function r(e){return e instanceof File?e.name:e?.name}function i(e){return e instanceof File?`${(e.size/1024).toFixed(0)} KB`:null}function a(n,r){let[i,a]=t(null);return e(()=>{if(!r){a(null);return}if(n instanceof File){let e=URL.createObjectURL(n);return a(e),()=>URL.revokeObjectURL(e)}a(n?.url||null)},[n,r]),i}export{n as keyOf,r as nameOf,i as sizeLabelOf,a as useItemUrl};
1
+ import{useEffect as e,useState as t}from"react";function n(e){return e instanceof File?`${e.name}:${e.size}`:e?.url||e?.name||`item`}function r(e){return e instanceof File?e.name:e?.name}var i=[`KB`,`MB`,`GB`];function a(e){if(!(e instanceof File))return null;if(e.size<1024)return`${e.size} B`;let t=e.size/1024,n=0;for(;t>=1024&&n<i.length-1;)t/=1024,n+=1;return`${new Intl.NumberFormat(void 0,{minimumFractionDigits:1,maximumFractionDigits:1}).format(t)} ${i[n]}`}function o(n,r){let[i,a]=t(null);return e(()=>{if(!r){a(null);return}if(n instanceof File){let e=URL.createObjectURL(n);return a(e),()=>URL.revokeObjectURL(e)}a(n?.url||null)},[n,r]),i}export{n as keyOf,r as nameOf,a as sizeLabelOf,o as useItemUrl};
@@ -7,6 +7,7 @@
7
7
  * `label` is required: an icon-only control with no accessible name is unusable with a screen
8
8
  * reader, and it doubles as the hover/focus tooltip — shown through `AppTooltip` (Popper), so it
9
9
  * is collision-aware: it prefers `tooltipPlacement` and flips to stay on-screen.
10
+ * A camera on a defect or a paperclip on a ticket uses its file mode (`onFiles`).
10
11
  *
11
12
  * @param {object} props
12
13
  * @param {string|import('react').ReactNode} props.icon glyph name (see Icon), or a custom node (e.g. an iconsax glyph)
@@ -29,8 +30,11 @@
29
30
  * for the tooltip (Popper) to anchor correctly — router `Link`s already do; a hand-rolled `as`
30
31
  * wrapper must use `forwardRef` (the tooltip still opens without it, but may be mispositioned).
31
32
  * @param {string} [props.href] sets an anchor without needing `as`.
33
+ * @param {(files: File[]) => void} [props.onFiles] turns the button into a file chooser: a hidden file input opens on click, Enter and Space, and the chosen files arrive here. The control is always a button in this mode.
34
+ * @param {string} [props.accept] file types the chooser offers (the input's accept), file mode only
35
+ * @param {boolean} [props.multiple=false] allow several files, file mode only
32
36
  */
33
- export default function AppActionIcon({ icon, iconVariant, label, tooltipPlacement, shortcut, danger, disabled, size, onClick, className, as, href, ...rest }: {
37
+ export default function AppActionIcon({ icon, iconVariant, label, tooltipPlacement, shortcut, danger, disabled, size, onClick, className, as, href, accept, multiple, onFiles, ...rest }: {
34
38
  icon: string | import('react').ReactNode;
35
39
  iconVariant?: 'linear' | 'outline' | 'bold' | 'bulk' | 'broken' | 'twotone';
36
40
  label: string;
@@ -43,4 +47,7 @@ export default function AppActionIcon({ icon, iconVariant, label, tooltipPlaceme
43
47
  className?: string;
44
48
  as?: React.ElementType;
45
49
  href?: string;
50
+ onFiles?: (files: File[]) => void;
51
+ accept?: string;
52
+ multiple?: boolean;
46
53
  }): any;
@@ -6,7 +6,10 @@
6
6
  /** Stable-ish key for an item: name+size for a File, url/name for an existing value. */
7
7
  export declare function keyOf(item: any): any;
8
8
  export declare function nameOf(item: any): any;
9
- /** `123 KB` for a freshly-picked File; null for an existing attachment (size unknown). */
9
+ /**
10
+ * `193 B`, `2.0 KB`, `1.5 MB` for a freshly-picked File; null for an existing attachment (size
11
+ * unknown). Whole bytes below 1 KB, so a small file never reads "0 KB".
12
+ */
10
13
  export declare function sizeLabelOf(item: any): string;
11
14
  /**
12
15
  * A freshly-picked File has no URL of its own; mint one (for images) and revoke it on
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webority/ui-react",
3
- "version": "0.60.1",
3
+ "version": "0.61.1",
4
4
  "description": "Webority shared React component library — App* primitives on react-bootstrap + the @webority/theme design system.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",
@@ -27,8 +27,8 @@
27
27
  },
28
28
  "sideEffects": false,
29
29
  "dependencies": {
30
- "@webority/theme": "0.60.1",
31
- "@webority/ui-elements": "0.60.1"
30
+ "@webority/theme": "0.61.1",
31
+ "@webority/ui-elements": "0.61.1"
32
32
  },
33
33
  "peerDependencies": {
34
34
  "@webority/analytics": "^0.23.0",