@tribepad/themis 1.9.4 → 1.9.5

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.
Files changed (128) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/elements/AlertDialog/index.js +1 -1
  3. package/dist/elements/AlertDialog/index.js.map +1 -1
  4. package/dist/elements/AlertDialog/index.mjs +1 -1
  5. package/dist/elements/AlertDialog/index.mjs.map +1 -1
  6. package/dist/elements/Breadcrumbs/index.js +1 -1
  7. package/dist/elements/Breadcrumbs/index.js.map +1 -1
  8. package/dist/elements/Breadcrumbs/index.mjs +1 -1
  9. package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
  10. package/dist/elements/Button/index.js +1 -1
  11. package/dist/elements/Button/index.js.map +1 -1
  12. package/dist/elements/Button/index.mjs +1 -1
  13. package/dist/elements/Button/index.mjs.map +1 -1
  14. package/dist/elements/Card/index.js +1 -1
  15. package/dist/elements/Card/index.js.map +1 -1
  16. package/dist/elements/Card/index.mjs +1 -1
  17. package/dist/elements/Card/index.mjs.map +1 -1
  18. package/dist/elements/Carousel/Carousel.d.ts +8 -1
  19. package/dist/elements/Carousel/Carousel.d.ts.map +1 -1
  20. package/dist/elements/Carousel/LazyCarousel.d.ts +1 -1
  21. package/dist/elements/Carousel/LazyCarousel.d.ts.map +1 -1
  22. package/dist/elements/Carousel/index.js +1 -1
  23. package/dist/elements/Carousel/index.js.map +1 -1
  24. package/dist/elements/Carousel/index.mjs +1 -1
  25. package/dist/elements/Carousel/index.mjs.map +1 -1
  26. package/dist/elements/ChatInterface/ChatLiveRegions.d.ts +2 -2
  27. package/dist/elements/ChatInterface/ChatLiveRegions.d.ts.map +1 -1
  28. package/dist/elements/ChatInterface/ChatMessageBubble.d.ts +1 -1
  29. package/dist/elements/ChatInterface/ChatMessageBubble.d.ts.map +1 -1
  30. package/dist/elements/ChatInterface/ChatThinkingDisplay.d.ts +2 -2
  31. package/dist/elements/ChatInterface/ChatThinkingDisplay.d.ts.map +1 -1
  32. package/dist/elements/ChatInterface/ChatTypingIndicator.d.ts +2 -2
  33. package/dist/elements/ChatInterface/ChatTypingIndicator.d.ts.map +1 -1
  34. package/dist/elements/ChatInterface/index.js +1 -1
  35. package/dist/elements/ChatInterface/index.js.map +1 -1
  36. package/dist/elements/ChatInterface/index.mjs +1 -1
  37. package/dist/elements/ChatInterface/index.mjs.map +1 -1
  38. package/dist/elements/FeatureIcon/FeatureIcon.d.ts +3 -0
  39. package/dist/elements/FeatureIcon/FeatureIcon.d.ts.map +1 -0
  40. package/dist/elements/FeatureIcon/FeatureIcon.styles.d.ts +17 -0
  41. package/dist/elements/FeatureIcon/FeatureIcon.styles.d.ts.map +1 -0
  42. package/dist/elements/FeatureIcon/FeatureIcon.types.d.ts +137 -0
  43. package/dist/elements/FeatureIcon/FeatureIcon.types.d.ts.map +1 -0
  44. package/dist/elements/FeatureIcon/index.d.ts +25 -0
  45. package/dist/elements/FeatureIcon/index.d.ts.map +1 -0
  46. package/dist/elements/FeatureIcon/index.js +3 -0
  47. package/dist/elements/FeatureIcon/index.js.map +1 -0
  48. package/dist/elements/FeatureIcon/index.mjs +3 -0
  49. package/dist/elements/FeatureIcon/index.mjs.map +1 -0
  50. package/dist/elements/FileField/index.js +1 -1
  51. package/dist/elements/FileField/index.js.map +1 -1
  52. package/dist/elements/FileField/index.mjs +1 -1
  53. package/dist/elements/FileField/index.mjs.map +1 -1
  54. package/dist/elements/Filters/index.js +1 -1
  55. package/dist/elements/Filters/index.js.map +1 -1
  56. package/dist/elements/Filters/index.mjs +1 -1
  57. package/dist/elements/Filters/index.mjs.map +1 -1
  58. package/dist/elements/Modal/Modal.styles.d.ts +2 -2
  59. package/dist/elements/Modal/Modal.types.d.ts +2 -2
  60. package/dist/elements/NumberField/index.js +1 -1
  61. package/dist/elements/NumberField/index.js.map +1 -1
  62. package/dist/elements/NumberField/index.mjs +1 -1
  63. package/dist/elements/NumberField/index.mjs.map +1 -1
  64. package/dist/elements/PageTitle/index.js +1 -1
  65. package/dist/elements/PageTitle/index.js.map +1 -1
  66. package/dist/elements/PageTitle/index.mjs +1 -1
  67. package/dist/elements/PageTitle/index.mjs.map +1 -1
  68. package/dist/elements/Pagination/index.js +1 -1
  69. package/dist/elements/Pagination/index.js.map +1 -1
  70. package/dist/elements/Pagination/index.mjs +1 -1
  71. package/dist/elements/Pagination/index.mjs.map +1 -1
  72. package/dist/elements/Panel/Panel.d.ts +1 -1
  73. package/dist/elements/Panel/Panel.types.d.ts +2 -2
  74. package/dist/elements/PasswordField/index.js +1 -1
  75. package/dist/elements/PasswordField/index.js.map +1 -1
  76. package/dist/elements/PasswordField/index.mjs +1 -1
  77. package/dist/elements/PasswordField/index.mjs.map +1 -1
  78. package/dist/elements/Resizable/index.js +1 -1
  79. package/dist/elements/Resizable/index.js.map +1 -1
  80. package/dist/elements/Resizable/index.mjs +1 -1
  81. package/dist/elements/Resizable/index.mjs.map +1 -1
  82. package/dist/elements/SearchField/index.js +1 -1
  83. package/dist/elements/SearchField/index.js.map +1 -1
  84. package/dist/elements/SearchField/index.mjs +1 -1
  85. package/dist/elements/SearchField/index.mjs.map +1 -1
  86. package/dist/elements/Select/Select.d.ts +3 -3
  87. package/dist/elements/Select/Select.d.ts.map +1 -1
  88. package/dist/elements/Sidebar/Sidebar.styles.d.ts +1 -1
  89. package/dist/elements/Sidebar/Sidebar.styles.d.ts.map +1 -1
  90. package/dist/elements/Sidebar/Sidebar.types.d.ts +2 -2
  91. package/dist/elements/Sidebar/SidebarRail.d.ts.map +1 -1
  92. package/dist/elements/Sidebar/index.js +1 -1
  93. package/dist/elements/Sidebar/index.js.map +1 -1
  94. package/dist/elements/Sidebar/index.mjs +1 -1
  95. package/dist/elements/Sidebar/index.mjs.map +1 -1
  96. package/dist/elements/Table/index.js +1 -1
  97. package/dist/elements/Table/index.js.map +1 -1
  98. package/dist/elements/Table/index.mjs +1 -1
  99. package/dist/elements/Table/index.mjs.map +1 -1
  100. package/dist/elements/TextField/index.js +1 -1
  101. package/dist/elements/TextField/index.js.map +1 -1
  102. package/dist/elements/TextField/index.mjs +1 -1
  103. package/dist/elements/TextField/index.mjs.map +1 -1
  104. package/dist/elements/Timeline/index.js +1 -1
  105. package/dist/elements/Timeline/index.js.map +1 -1
  106. package/dist/elements/Timeline/index.mjs +1 -1
  107. package/dist/elements/Timeline/index.mjs.map +1 -1
  108. package/dist/elements/Toast/index.js +1 -1
  109. package/dist/elements/Toast/index.js.map +1 -1
  110. package/dist/elements/Toast/index.mjs +1 -1
  111. package/dist/elements/Toast/index.mjs.map +1 -1
  112. package/dist/elements/Wizard/index.js +1 -1
  113. package/dist/elements/Wizard/index.js.map +1 -1
  114. package/dist/elements/Wizard/index.mjs +1 -1
  115. package/dist/elements/Wizard/index.mjs.map +1 -1
  116. package/dist/elements/index.d.ts +2 -0
  117. package/dist/elements/index.d.ts.map +1 -1
  118. package/dist/elements/index.js +1 -1
  119. package/dist/elements/index.js.map +1 -1
  120. package/dist/elements/index.mjs +1 -1
  121. package/dist/elements/index.mjs.map +1 -1
  122. package/dist/index.js +2 -2
  123. package/dist/index.js.map +1 -1
  124. package/dist/index.mjs +2 -2
  125. package/dist/index.mjs.map +1 -1
  126. package/dist/styles/animations.css +15 -0
  127. package/package.json +16 -14
  128. package/src/elements/FeatureIcon/FeatureIcon.stories.tsx +164 -0
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {createContext,memo,forwardRef,useId,useState,useRef,useCallback,useContext,useEffect}from'react';import {Button,FileTrigger,ProgressBar}from'react-aria-components';import {Loader2,Zap,Upload,X,FileIcon,AudioLines,VideoIcon,ImageIcon}from'lucide-react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {cva}from'class-variance-authority';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {z}from'zod';function b(...e){return twMerge(clsx(e))}var me=cva("inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),ge=cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-normal ring-offset-background motion-safe:transition-transform motion-safe:duration-200 motion-safe:[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] hover:-translate-y-1",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] hover:bg-[var(--destructive-background-hover,var(--destructive-background))] motion-safe:hover:btn-warn-shake",outline:"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)]",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] hover:bg-[var(--secondary-hover,var(--secondary))]",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]",link:"text-[var(--text-link)] underline underline-offset-4 hover:bg-[var(--accent)] hover:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-6 text-base",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});var ve="data-[pressed]:scale-[0.97]";var te="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",re="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";var dt=createContext(null);dt.displayName="ButtonGroupContext";function ut(){return useContext(dt)}var ct=createContext(null);ct.displayName="ButtonGroupItemContext";function ft(){return useContext(ct)}cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var pt=cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}});cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});var D=memo(forwardRef(({className:e,buttonVisualClassName:r,variant:t,size:a,visualSize:i,fullWidth:o,loading:d=false,loadingText:m="Loading...",shortcut:u,children:c,isDisabled:g,paywall:s=false,paywallRedirect:h,paywallDescription:V,onPress:f,...I},de)=>{let Y=useId(),v=ut(),N=ft(),B=t??v?.variant??"default",ue=a??v?.size,U=g??v?.isDisabled??false,X=v?.orientation==="vertical",q=o||X,ce=N?pt({orientation:v?.orientation??"horizontal",position:N.position}):"",M=i??ue??"default";return process.env.NODE_ENV!=="production"&&(M==="dot"||M==="icon")&&!I["aria-label"]&&!c&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsx(Button,{ref:de,isDisabled:U||d||void 0,"aria-disabled":s?true:void 0,"aria-describedby":s?Y:void 0,onPress:R=>{if(s){h&&window.open(h,"_blank","noopener,noreferrer");return}f?.(R);},className:b(me({fullWidth:q,inVerticalGroup:X}),e),...I,children:R=>jsxs("span",{className:b(ge({variant:B,visualSize:M,paywall:s,fullWidth:q}),ce,r,ve,"",te,re),"data-pressed":R.isPressed||void 0,children:[d&&jsxs(Fragment,{children:[jsx(Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsx("span",{className:"sr-only","aria-live":"polite",children:m})]}),!d&&c,s&&jsx(Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),s&&jsxs("span",{id:Y,className:"sr-only",children:["Premium feature: ",V||"Upgrade required to access this feature"]}),R.isFocusVisible&&u&&jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:u})]})})}));D.displayName="Button";var Ee=["focus-within:outline-none","focus-within:ring-2","focus-within:ring-[var(--ring)]","focus-within:ring-offset-2"],he=["focus-visible:outline-none","focus-visible:ring-2","focus-visible:ring-[var(--ring)]","focus-visible:ring-offset-2"];var Ie=["disabled:pointer-events-none","disabled:opacity-50"];var w={sm:"text-xs",default:"text-sm",lg:"text-base"},ie={sm:"text-sm",default:"text-base",lg:"text-lg"},ne=["min-h-[44px]","min-w-[44px]"];var Fe=["flex","items-center","gap-1.5","text-[var(--destructive-background)]"],_e=["flex","items-center","gap-1.5","text-[var(--success-background)]"],Te=["text-[var(--menu-muted)]"],Ve=["font-medium","text-[var(--content-foreground)]"];var oe=["transition-colors","duration-200"];function O(...e){return e.flatMap(r=>Array.isArray(r)?[...r]:[r])}var Ne=cva("flex flex-col gap-1.5 w-full",{variants:{size:ie},defaultVariants:{size:"default"}}),ye=cva(O("flex flex-col items-center justify-center rounded-md border-2 border-dashed","bg-[var(--content-background)] text-[var(--content-foreground)]",oe,Ee),{variants:{size:{sm:"min-h-[100px] p-4 gap-2",default:"min-h-[140px] p-6 gap-3",lg:"min-h-[180px] p-8 gap-4"},isDragOver:{true:"border-[var(--primary)] bg-[var(--primary)]/5",false:"border-[var(--input-border)] hover:border-[var(--primary)]/50"},isInvalid:{true:"border-[var(--destructive-background)] bg-[var(--destructive-background)]/5",false:""},isDisabled:{true:"opacity-50 cursor-not-allowed pointer-events-none",false:"cursor-pointer"}},compoundVariants:[{isInvalid:true,isDragOver:true,className:"border-[var(--destructive-background)] bg-[var(--destructive-background)]/5"}],defaultVariants:{size:"default",isDragOver:false,isInvalid:false,isDisabled:false}}),Pe=cva(O("inline-flex items-center justify-center gap-2 rounded-md font-medium",oe,ne,he,Ie),{variants:{size:{sm:"px-3 py-2 text-xs",default:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},variant:{default:"bg-[var(--primary)] text-[var(--primary-foreground)] hover:bg-[var(--primary)]/90",outline:"border border-[var(--input-border)] bg-transparent hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]"}},defaultVariants:{size:"default",variant:"default"}}),Re=cva("flex flex-col gap-2 mt-3",{variants:{size:{sm:"gap-1.5",default:"gap-2",lg:"gap-3"}},defaultVariants:{size:"default"}}),mt=cva("flex items-center justify-between mb-1",{variants:{size:w},defaultVariants:{size:"default"}}),Oe=cva("flex items-center justify-between gap-3 bg-[var(--accent-background)] rounded-md border border-[var(--border)]",{variants:{size:{sm:"px-2 py-1.5 text-xs",default:"px-3 py-2 text-sm",lg:"px-4 py-3 text-base"}},defaultVariants:{size:"default"}}),Ae=cva(O("inline-flex items-center justify-center rounded-full",ne,"-mr-2 -my-1","text-[var(--menu-muted)] hover:text-[var(--destructive-background)] hover:bg-[var(--destructive-background)]/10","transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)]"),{variants:{size:{sm:"",default:"",lg:""}},defaultVariants:{size:"default"}}),Le=cva(O(Fe,"font-medium"),{variants:{size:w},defaultVariants:{size:"default"}}),De=cva(O(_e,"font-medium"),{variants:{size:w},defaultVariants:{size:"default"}}),we=cva(Te,{variants:{size:w},defaultVariants:{size:"default"}}),Ce=cva(Ve,{variants:{size:ie,isRequired:{true:"after:content-['*'] after:ml-0.5 after:text-[var(--destructive-background)]",false:""}},defaultVariants:{size:"default",isRequired:false}});function se(e){if(e===0)return "0 B";let r=1024,t=["B","KB","MB","GB"],a=Math.floor(Math.log(e)/Math.log(r)),i=parseFloat((e/Math.pow(r,a)).toFixed(1));return `${i%1===0?i.toFixed(0):i.toFixed(1)} ${t[a]}`}function $(e,r=30){if(e.length<=r)return e;let t=e.lastIndexOf(".");if(t===-1)return `${e.slice(0,r-3)}...`;let a=e.slice(t),i=e.slice(0,t),o=r-a.length-3;return o<1?`...${a}`:`${i.slice(0,o)}...${a}`}function Be(e,r){return !r||r.length===0?true:r.some(t=>{if(t.endsWith("/*")){let a=t.slice(0,-2);return e.type.startsWith(`${a}/`)}return t.includes("/")?e.type===t:t.startsWith(".")?e.name.toLowerCase().endsWith(t.toLowerCase()):false})}function j(e){return e.type.startsWith("image/")?"image":e.type.startsWith("video/")?"video":e.type.startsWith("audio/")?"audio":"file"}function W(e,r){let t=[...e];for(let a of r){let i=t.findIndex(o=>o.name===a.name);i>=0?t[i]=a:t.push(a);}return t}function Zt(e){return !e||e.length===0?"any file":e.map(t=>t==="image/*"?"images":t==="video/*"?"videos":t==="audio/*"?"audio":t.startsWith(".")?t.slice(1).toUpperCase():t.includes("/")?(t.split("/")[1]??t).toUpperCase():t).join(", ")}var gt=2*1024*1024;function Ue(e){return e.type.startsWith("image/")?true:/\.(jpg|jpeg|png|gif|webp|svg|bmp|ico|avif|heic|heif|tiff|tif)$/i.test(e.name)}async function vt(e,r=200){return new Promise((t,a)=>{let i=new window.Image,o=URL.createObjectURL(e);i.onload=()=>{URL.revokeObjectURL(o);let d=Math.min(r/i.width,r/i.height,1),m=Math.round(i.width*d),u=Math.round(i.height*d),c=document.createElement("canvas");c.width=m,c.height=u;let g=c.getContext("2d");if(!g){a(new Error("Canvas context unavailable"));return}g.drawImage(i,0,0,m,u),c.toBlob(s=>{s?t(URL.createObjectURL(s)):a(new Error("Failed to create blob"));},"image/jpeg",.8);},i.onerror=()=>{URL.revokeObjectURL(o),a(new Error("Failed to load image"));},i.src=o;})}async function Me(e,r=200){return e.size>gt?vt(e,r):URL.createObjectURL(e)}function ze(e,r={}){let{enabled:t=true,maxBytes:a=10*1024*1024,maxDimension:i=200}=r,[o,d]=useState(null),[m,u]=useState(false),[c,g]=useState(null),s=Ue(e);return useEffect(()=>{if(!t||!s){d(null),u(false),g(null);return}if(e.size>a){d(null),u(false),g("File too large for preview");return}let h=true,V=null;return (async()=>{u(true),g(null);try{V=await Me(e,i),h?(d(V),u(!1)):URL.revokeObjectURL(V);}catch(I){h&&(g(I instanceof Error?I.message:"Failed to generate preview"),u(false),d(null));}})(),()=>{h=false,V&&URL.revokeObjectURL(V),d(I=>(I&&URL.revokeObjectURL(I),null));}},[e,t,a,i,s]),{preview:o,isLoading:m,error:c,isImage:s}}function Ge({file:e,size:r=64,maxBytes:t=10*1024*1024,renderPreview:a,className:i}){let{preview:o,isLoading:d,error:m,isImage:u}=ze(e,{enabled:true,maxBytes:t,maxDimension:r*2}),c={width:r,height:r,minWidth:r,minHeight:r};if(!u&&a)return jsx("div",{className:b("flex items-center justify-center rounded-md overflow-hidden","bg-[var(--accent-background)]",i),style:c,children:a(e)});if(d)return jsx("div",{className:b("flex items-center justify-center rounded-md overflow-hidden","bg-[var(--accent-background)]",i),style:c,"aria-busy":"true","aria-label":`Loading preview for ${e.name}`,children:jsx(Loader2,{className:"h-4 w-4 animate-spin text-[var(--menu-muted)]","aria-hidden":"true"})});if(u&&o&&!m)return jsx("div",{className:b("flex items-center justify-center rounded-md overflow-hidden","bg-[var(--accent-background)]",i),style:c,children:jsx("img",{src:o,alt:e.name,className:"w-full h-full object-cover",loading:"lazy"})});let g=j(e),s=er(g),h=Math.max(16,Math.floor(r*.4));return jsx("div",{className:b("flex items-center justify-center rounded-md overflow-hidden","bg-[var(--accent-background)]",i),style:c,"aria-label":m?`Preview unavailable for ${e.name}`:void 0,children:jsx(s,{className:"text-[var(--menu-muted)]",style:{width:h,height:h},"aria-hidden":"true"})})}function er(e){switch(e){case "image":return ImageIcon;case "video":return VideoIcon;case "audio":return AudioLines;default:return FileIcon}}var ke=cva(["flex","flex-col","gap-1","w-full"],{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}}),$e=cva(["rounded-full","bg-[var(--accent-background)]","overflow-hidden"],{variants:{size:{sm:"h-1.5",default:"h-2",lg:"h-3"}},defaultVariants:{size:"default"}}),je=cva(["h-full","rounded-full","transition-all","duration-300"],{variants:{status:{pending:["bg-gradient-to-r","from-[var(--menu-muted)]","via-[var(--accent-background)]","to-[var(--menu-muted)]","bg-[length:200%_100%]","animate-progress-shimmer"],uploading:"bg-[var(--primary)]",complete:"bg-[var(--success-background)]",error:"bg-[var(--destructive-background)]"}},defaultVariants:{status:"pending"}}),We=cva(["flex","items-center","justify-between","gap-2"],{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}}),Ze=cva(["flex","items-center","justify-between","gap-2","mt-1","text-[var(--destructive-background)]"],{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}}),Ye=cva(["underline","hover:no-underline","min-h-[44px]","min-w-[44px]","inline-flex","items-center","justify-center","-mr-3","-my-2","focus-visible:outline-none","focus-visible:ring-2","focus-visible:ring-[var(--ring)]","focus-visible:ring-offset-2","rounded"],{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}});function ar(e,r){switch(e){case "pending":return "Queued for upload\u2026";case "uploading":return `Uploading\u2026 ${r}%`;case "complete":return "Upload complete";case "error":return "Upload failed \u2014 try again"}}function le({file:e,progress:r,status:t,error:a,onRetry:i,size:o="default",className:d}){let m=t==="pending",u=`progress-error-${e.name.replace(/[^a-zA-Z0-9]/g,"-")}`,c=ar(t,r);return jsxs("div",{className:b(ke({size:o}),d),children:[jsx(ProgressBar,{"aria-label":e.name,value:m?void 0:r,isIndeterminate:m,"aria-describedby":t==="error"&&a?u:void 0,children:({percentage:g,valueText:s})=>jsxs(Fragment,{children:[jsxs("div",{className:We({size:o}),children:[jsx("span",{className:"truncate",title:e.name,children:$(e.name,30)}),jsx("span",{className:"text-[var(--menu-muted)] flex-shrink-0",children:t==="error"?c:s??c})]}),jsx("div",{className:$e({size:o}),children:jsx("div",{className:je({status:t}),style:{width:m?"100%":`${g??0}%`}})})]})}),t==="error"&&a&&jsxs("div",{id:u,className:Ze({size:o}),children:[jsx("span",{children:a}),i&&jsx(Button,{onPress:i,className:Ye({size:o}),children:"Retry"})]}),jsxs("div",{"aria-live":"polite","aria-atomic":"true",className:"sr-only",children:[t==="complete"&&`${e.name} upload complete`,t==="error"&&`${e.name} upload failed${a?`: ${a}`:""}`]})]})}le.displayName="FileProgress";var bt=forwardRef(function({label:r,acceptedFileTypes:t,allowsMultiple:a=false,maxFileSize:i,maxFiles:o,description:d,errorMessage:m,successMessage:u,triggerText:c,isRequired:g,isDisabled:s,isInvalid:h,isValid:V,size:f="default",name:I,id:de,className:Y,value:v=[],onChange:N,validate:B,showPreviews:ue=false,previewSize:U=64,maxPreviewBytes:X$1=10*1024*1024,renderPreview:q,showProgress:ce=false,uploadProgress:M,uploadStatus:Xe,uploadErrors:qe,onRetry:R,"data-testid":Qe,"aria-label":xr,"aria-labelledby":br,"aria-describedby":Ke,...Et},ht){let It=useId(),Q=de??It,Je=`${Q}-label`,et=`${Q}-description`,tt=`${Q}-error`,[rt,fe]=useState(false),[Ft,pe]=useState(null),K=useRef(0),H=m??Ft,_t=h||!!H,z=[];Ke&&z.push(Ke),d&&z.push(et),H&&z.push(tt);let Tt=z.length>0?z.join(" "):void 0,at=useCallback((n,x=[])=>{let F=[],S=[];for(let E of n){if(t&&!Be(E,t)){S.push(`"${E.name}" is not a supported file type. Accepted: ${t}`);continue}if(i&&E.size>i){S.push(`"${E.name}" is too large (max ${se(i)}). Try compressing or resizing the file.`);continue}F.push(E);}return o&&a&&W(x,F).length>o?(S.push(`Maximum ${o} files allowed`),{valid:[],errors:S}):{valid:F,errors:S}},[t,i,o,a]),J=useCallback(n=>{if(!n||n.length===0)return;pe(null);let x=Array.from(n),F=a?v:[],{valid:S,errors:E}=at(x,F);if(E.length>0){pe(E[0]??"Invalid file");return}if(B&&S.length>0){let ee=B(a?W(F,S):S);if(ee){pe(ee);return}}let G;a?G=W(F,S):G=S.slice(0,1),N?.(G);},[a,v,at,B,N]),Vt=useCallback(n=>{J(n);},[J]),Nt=useCallback(n=>{let x=v.filter(F=>F!==n);N?.(x);},[v,N]),yt=useCallback(()=>{N?.([]);},[N]),Pt=useCallback(n=>{n.preventDefault(),n.stopPropagation(),!s&&(K.current++,fe(true));},[s]),Rt=useCallback(n=>{n.preventDefault(),n.stopPropagation();},[]),Ot=useCallback(n=>{n.preventDefault(),n.stopPropagation(),K.current--,K.current===0&&fe(false);},[]),At=useCallback(n=>{if(n.preventDefault(),n.stopPropagation(),K.current=0,fe(false),s)return;let x=n.dataTransfer?.files;J(x??null);},[s,J]),Lt=n=>{switch(j(n)){case "image":return ImageIcon;case "video":return VideoIcon;case "audio":return AudioLines;default:return FileIcon}},Dt=t?.join(",");return jsxs("div",{ref:ht,id:Q,className:b(Ne({size:f}),Y),"data-testid":Qe??"file-field",...Et,children:[jsx("label",{id:Je,className:Ce({size:f,isRequired:g}),children:r}),jsxs("div",{role:"group","data-testid":`${Qe??"file-field"}-dropzone`,className:b("drop-zone",ye({size:f,isDragOver:rt,isInvalid:_t,isDisabled:s})),onDragEnter:Pt,onDragOver:Rt,onDragLeave:Ot,onDrop:At,"aria-labelledby":Je,"aria-describedby":Tt,"aria-disabled":s||void 0,children:[jsx(FileTrigger,{acceptedFileTypes:t,allowsMultiple:a,onSelect:Vt,children:jsxs(D,{variant:"outline",isDisabled:s,buttonVisualClassName:Pe({size:f}),children:[jsx(Upload,{className:"h-4 w-4","aria-hidden":"true"}),rt?"Drop files here":c??(a?"Choose files":"Choose file")]})}),I&&jsx("input",{type:"file",name:I,accept:Dt,multiple:a,disabled:s,className:"sr-only",tabIndex:-1,"aria-hidden":"true"})]}),d&&jsx("p",{id:et,className:we({size:f}),children:d}),v.length>0&&jsxs("div",{className:Re({size:f}),children:[v.length>=2&&jsxs("div",{className:mt({size:f}),children:[jsxs("span",{className:"text-[var(--menu-muted)]",children:[v.length," files selected"]}),jsx(D,{variant:"link",visualSize:"sm",onPress:yt,buttonVisualClassName:b("text-[var(--menu-muted)] hover:text-[var(--destructive-background)]","underline-offset-4 hover:underline"),"aria-label":"Clear all files",children:"Clear all"})]}),jsx("ul",{className:"space-y-2",children:v.map((n,x)=>{let F=Lt(n),S=f==="sm"?Math.min(U,40):f==="lg"?Math.min(U,80):Math.min(U,48),E=Xe?.[x],G=M?.[x]??0,ee=qe?.get(x),it=ce&&E!==void 0;return jsx("li",{className:it?"p-3":Oe({size:f}),children:it?jsx(le,{file:n,progress:G,status:E,error:ee,onRetry:R?()=>R(x):void 0,size:f}):jsxs(Fragment,{children:[jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[ue?jsx(Ge,{file:n,size:S,maxBytes:X$1,renderPreview:q,className:"flex-shrink-0"}):jsx(F,{className:"h-4 w-4 flex-shrink-0 text-[var(--menu-muted)]","aria-hidden":"true"}),jsx("span",{className:"truncate",title:n.name,children:$(n.name,30)}),jsx("span",{className:"text-[var(--menu-muted)] flex-shrink-0",children:se(n.size)})]}),jsx(D,{variant:"ghost",visualSize:"icon",onPress:()=>Nt(n),buttonVisualClassName:Ae({size:f}),"aria-label":`Remove ${n.name}`,isDisabled:s,children:jsx(X,{className:"h-4 w-4","aria-hidden":"true"})})]})},`${n.name}-${x}`)})})]}),H&&jsx("p",{id:tt,role:"alert",className:Le({size:f}),children:H}),!H&&V&&u&&jsx("p",{className:De({size:f}),children:u})]})});bt.displayName="FileField";var St=z.object({className:z.string().optional(),children:z.any().optional(),id:z.string().optional(),"aria-label":z.string().optional(),"aria-labelledby":z.string().optional(),"aria-describedby":z.string().optional(),"aria-live":z.enum(["off","polite","assertive"]).optional(),"aria-hidden":z.boolean().optional(),"data-testid":z.string().optional()});var vr=St.extend({label:z.string(),acceptedFileTypes:z.array(z.string()).optional(),allowsMultiple:z.boolean().default(false),maxFileSize:z.number().optional(),maxFiles:z.number().optional(),description:z.string().optional(),errorMessage:z.string().optional(),successMessage:z.string().optional(),triggerText:z.string().optional(),isRequired:z.boolean().optional(),isDisabled:z.boolean().optional(),isInvalid:z.boolean().optional(),isValid:z.boolean().optional(),size:z.enum(["sm","default","lg"]).default("default"),name:z.string().optional(),showPreviews:z.boolean().default(false),previewSize:z.number().min(16).max(256).default(64),maxPreviewBytes:z.number().default(10*1024*1024),showProgress:z.boolean().default(false),uploadProgress:z.array(z.number().min(0).max(100)).optional(),uploadStatus:z.array(z.enum(["pending","uploading","complete","error"])).optional()}).refine(e=>!(e.successMessage&&e.errorMessage),{message:"Cannot provide both successMessage and errorMessage. Use one based on validation state.",path:["successMessage"]}).refine(e=>(typeof process<"u"&&process.env.NODE_ENV==="development"&&e.isValid&&e.isInvalid&&console.error("[FileField] Both isValid and isInvalid are true. isInvalid takes precedence."),true));export{bt as FileField,vr as FileFieldPropsSchema,Ge as FilePreview,le as FileProgress,gt as RESIZE_THRESHOLD,vt as createResizedPreview,W as deduplicateFiles,Ne as fileFieldContainerVariants,we as fileFieldDescriptionVariants,ye as fileFieldDropZoneVariants,Le as fileFieldErrorVariants,Oe as fileFieldItemVariants,Ce as fileFieldLabelVariants,Re as fileFieldListVariants,Ae as fileFieldRemoveButtonVariants,De as fileFieldSuccessVariants,Pe as fileFieldTriggerVariants,je as fileProgressBarVariants,Ze as fileProgressErrorVariants,We as fileProgressHeaderVariants,Ye as fileProgressRetryVariants,$e as fileProgressTrackVariants,ke as fileProgressVariants,Zt as formatAcceptedTypes,se as formatFileSize,Me as generatePreview,j as getFileIcon,Be as isFileTypeAccepted,Ue as isImageFile,$ as truncateFileName,ze as useFilePreview};//# sourceMappingURL=index.mjs.map
2
+ import {createContext,memo,forwardRef,useId,useState,useRef,useCallback,useContext,useEffect}from'react';import {Button,FileTrigger,ProgressBar}from'react-aria-components';import {Loader2,Zap,Upload,X,FileIcon,AudioLines,VideoIcon,ImageIcon}from'lucide-react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {cva}from'class-variance-authority';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {z}from'zod';function b(...e){return twMerge(clsx(e))}var me=cva("inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),ge=cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-normal ring-offset-background motion-safe:transition-transform motion-safe:duration-200 motion-safe:[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] hover:-translate-y-1",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] hover:bg-[var(--destructive-background-hover,var(--destructive-background))] motion-safe:hover:btn-warn-shake",outline:"border border-[var(--input-border)] bg-[var(--content-background)] hover:bg-[var(--accent-background)]/50",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] hover:bg-[var(--secondary-hover,var(--secondary))]",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]",link:"text-[var(--text-link)] underline underline-offset-4 hover:bg-[var(--accent)] hover:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-6 text-base",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});var ve="data-[pressed]:scale-[0.97]";var te="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",re="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";var dt=createContext(null);dt.displayName="ButtonGroupContext";function ut(){return useContext(dt)}var ct=createContext(null);ct.displayName="ButtonGroupItemContext";function ft(){return useContext(ct)}cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var pt=cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}});cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});var D=memo(forwardRef(({className:e,buttonVisualClassName:r,variant:t,size:a,visualSize:i,fullWidth:o,loading:d=false,loadingText:m="Loading...",shortcut:u,children:c,isDisabled:g,paywall:s=false,paywallRedirect:h,paywallDescription:V,onPress:f,...I},de)=>{let Y=useId(),v=ut(),N=ft(),B=t??v?.variant??"default",ue=a??v?.size,U=g??v?.isDisabled??false,X=v?.orientation==="vertical",q=o||X,ce=N?pt({orientation:v?.orientation??"horizontal",position:N.position}):"",M=i??ue??"default";return process.env.NODE_ENV!=="production"&&(M==="dot"||M==="icon")&&!I["aria-label"]&&!c&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsx(Button,{ref:de,isDisabled:U||d||void 0,"aria-disabled":s?true:void 0,"aria-describedby":s?Y:void 0,onPress:R=>{if(s){h&&window.open(h,"_blank","noopener,noreferrer");return}f?.(R);},className:b(me({fullWidth:q,inVerticalGroup:X}),e),...I,children:R=>jsxs("span",{className:b(ge({variant:B,visualSize:M,paywall:s,fullWidth:q}),ce,r,ve,"",te,re),"data-pressed":R.isPressed||void 0,children:[d&&jsxs(Fragment,{children:[jsx(Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsx("span",{className:"sr-only","aria-live":"polite",children:m})]}),!d&&c,s&&jsx(Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),s&&jsxs("span",{id:Y,className:"sr-only",children:["Premium feature: ",V||"Upgrade required to access this feature"]}),R.isFocusVisible&&u&&jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:u})]})})}));D.displayName="Button";var Ee=["focus-within:outline-none","focus-within:ring-2","focus-within:ring-[var(--ring)]","focus-within:ring-offset-2"],he=["focus-visible:outline-none","focus-visible:ring-2","focus-visible:ring-[var(--ring)]","focus-visible:ring-offset-2"];var Ie=["disabled:pointer-events-none","disabled:opacity-50"];var w={sm:"text-xs",default:"text-sm",lg:"text-base"},ie={sm:"text-sm",default:"text-base",lg:"text-lg"},ne=["min-h-[44px]","min-w-[44px]"];var Fe=["flex","items-center","gap-1.5","text-[var(--destructive-background)]"],_e=["flex","items-center","gap-1.5","text-[var(--success-background)]"],Te=["text-[var(--menu-muted)]"],Ve=["font-medium","text-[var(--content-foreground)]"];var oe=["transition-colors","duration-200"];function O(...e){return e.flatMap(r=>Array.isArray(r)?[...r]:[r])}var Ne=cva("flex flex-col gap-1.5 w-full",{variants:{size:ie},defaultVariants:{size:"default"}}),ye=cva(O("flex flex-col items-center justify-center rounded-md border-2 border-dashed","bg-[var(--content-background)] text-[var(--content-foreground)]",oe,Ee),{variants:{size:{sm:"min-h-[100px] p-4 gap-2",default:"min-h-[140px] p-6 gap-3",lg:"min-h-[180px] p-8 gap-4"},isDragOver:{true:"border-[var(--primary)] bg-[var(--primary)]/5",false:"border-[var(--input-border)] hover:border-[var(--primary)]/50"},isInvalid:{true:"border-[var(--destructive-background)] bg-[var(--destructive-background)]/5",false:""},isDisabled:{true:"opacity-50 cursor-not-allowed pointer-events-none",false:"cursor-pointer"}},compoundVariants:[{isInvalid:true,isDragOver:true,className:"border-[var(--destructive-background)] bg-[var(--destructive-background)]/5"}],defaultVariants:{size:"default",isDragOver:false,isInvalid:false,isDisabled:false}}),Pe=cva(O("inline-flex items-center justify-center gap-2 rounded-md font-medium",oe,ne,he,Ie),{variants:{size:{sm:"px-3 py-2 text-xs",default:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},variant:{default:"bg-[var(--primary)] text-[var(--primary-foreground)] hover:bg-[var(--primary)]/90",outline:"border border-[var(--input-border)] bg-transparent hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]"}},defaultVariants:{size:"default",variant:"default"}}),Re=cva("flex flex-col gap-2 mt-3",{variants:{size:{sm:"gap-1.5",default:"gap-2",lg:"gap-3"}},defaultVariants:{size:"default"}}),mt=cva("flex items-center justify-between mb-1",{variants:{size:w},defaultVariants:{size:"default"}}),Oe=cva("flex items-center justify-between gap-3 bg-[var(--accent-background)] rounded-md border border-[var(--border)]",{variants:{size:{sm:"px-2 py-1.5 text-xs",default:"px-3 py-2 text-sm",lg:"px-4 py-3 text-base"}},defaultVariants:{size:"default"}}),Ae=cva(O("inline-flex items-center justify-center rounded-full",ne,"-mr-2 -my-1","text-[var(--menu-muted)] hover:text-[var(--destructive-background)] hover:bg-[var(--destructive-background)]/10","transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)]"),{variants:{size:{sm:"",default:"",lg:""}},defaultVariants:{size:"default"}}),Le=cva(O(Fe,"font-medium"),{variants:{size:w},defaultVariants:{size:"default"}}),De=cva(O(_e,"font-medium"),{variants:{size:w},defaultVariants:{size:"default"}}),we=cva(Te,{variants:{size:w},defaultVariants:{size:"default"}}),Ce=cva(Ve,{variants:{size:ie,isRequired:{true:"after:content-['*'] after:ml-0.5 after:text-[var(--destructive-background)]",false:""}},defaultVariants:{size:"default",isRequired:false}});function se(e){if(e===0)return "0 B";let r=1024,t=["B","KB","MB","GB"],a=Math.floor(Math.log(e)/Math.log(r)),i=parseFloat((e/Math.pow(r,a)).toFixed(1));return `${i%1===0?i.toFixed(0):i.toFixed(1)} ${t[a]}`}function $(e,r=30){if(e.length<=r)return e;let t=e.lastIndexOf(".");if(t===-1)return `${e.slice(0,r-3)}...`;let a=e.slice(t),i=e.slice(0,t),o=r-a.length-3;return o<1?`...${a}`:`${i.slice(0,o)}...${a}`}function Be(e,r){return !r||r.length===0?true:r.some(t=>{if(t.endsWith("/*")){let a=t.slice(0,-2);return e.type.startsWith(`${a}/`)}return t.includes("/")?e.type===t:t.startsWith(".")?e.name.toLowerCase().endsWith(t.toLowerCase()):false})}function j(e){return e.type.startsWith("image/")?"image":e.type.startsWith("video/")?"video":e.type.startsWith("audio/")?"audio":"file"}function W(e,r){let t=[...e];for(let a of r){let i=t.findIndex(o=>o.name===a.name);i>=0?t[i]=a:t.push(a);}return t}function Zt(e){return !e||e.length===0?"any file":e.map(t=>t==="image/*"?"images":t==="video/*"?"videos":t==="audio/*"?"audio":t.startsWith(".")?t.slice(1).toUpperCase():t.includes("/")?(t.split("/")[1]??t).toUpperCase():t).join(", ")}var gt=2*1024*1024;function Ue(e){return e.type.startsWith("image/")?true:/\.(jpg|jpeg|png|gif|webp|svg|bmp|ico|avif|heic|heif|tiff|tif)$/i.test(e.name)}async function vt(e,r=200){return new Promise((t,a)=>{let i=new window.Image,o=URL.createObjectURL(e);i.onload=()=>{URL.revokeObjectURL(o);let d=Math.min(r/i.width,r/i.height,1),m=Math.round(i.width*d),u=Math.round(i.height*d),c=document.createElement("canvas");c.width=m,c.height=u;let g=c.getContext("2d");if(!g){a(new Error("Canvas context unavailable"));return}g.drawImage(i,0,0,m,u),c.toBlob(s=>{s?t(URL.createObjectURL(s)):a(new Error("Failed to create blob"));},"image/jpeg",.8);},i.onerror=()=>{URL.revokeObjectURL(o),a(new Error("Failed to load image"));},i.src=o;})}async function Me(e,r=200){return e.size>gt?vt(e,r):URL.createObjectURL(e)}function ze(e,r={}){let{enabled:t=true,maxBytes:a=10*1024*1024,maxDimension:i=200}=r,[o,d]=useState(null),[m,u]=useState(false),[c,g]=useState(null),s=Ue(e);return useEffect(()=>{if(!t||!s){d(null),u(false),g(null);return}if(e.size>a){d(null),u(false),g("File too large for preview");return}let h=true,V=null;return (async()=>{u(true),g(null);try{V=await Me(e,i),h?(d(V),u(!1)):URL.revokeObjectURL(V);}catch(I){h&&(g(I instanceof Error?I.message:"Failed to generate preview"),u(false),d(null));}})(),()=>{h=false,V&&URL.revokeObjectURL(V),d(I=>(I&&URL.revokeObjectURL(I),null));}},[e,t,a,i,s]),{preview:o,isLoading:m,error:c,isImage:s}}function Ge({file:e,size:r=64,maxBytes:t=10*1024*1024,renderPreview:a,className:i}){let{preview:o,isLoading:d,error:m,isImage:u}=ze(e,{enabled:true,maxBytes:t,maxDimension:r*2}),c={width:r,height:r,minWidth:r,minHeight:r};if(!u&&a)return jsx("div",{className:b("flex items-center justify-center rounded-md overflow-hidden","bg-[var(--accent-background)]",i),style:c,children:a(e)});if(d)return jsx("div",{className:b("flex items-center justify-center rounded-md overflow-hidden","bg-[var(--accent-background)]",i),style:c,"aria-busy":"true","aria-label":`Loading preview for ${e.name}`,children:jsx(Loader2,{className:"h-4 w-4 animate-spin text-[var(--menu-muted)]","aria-hidden":"true"})});if(u&&o&&!m)return jsx("div",{className:b("flex items-center justify-center rounded-md overflow-hidden","bg-[var(--accent-background)]",i),style:c,children:jsx("img",{src:o,alt:e.name,className:"w-full h-full object-cover",loading:"lazy"})});let g=j(e),s=er(g),h=Math.max(16,Math.floor(r*.4));return jsx("div",{className:b("flex items-center justify-center rounded-md overflow-hidden","bg-[var(--accent-background)]",i),style:c,"aria-label":m?`Preview unavailable for ${e.name}`:void 0,children:jsx(s,{className:"text-[var(--menu-muted)]",style:{width:h,height:h},"aria-hidden":"true"})})}function er(e){switch(e){case "image":return ImageIcon;case "video":return VideoIcon;case "audio":return AudioLines;default:return FileIcon}}var ke=cva(["flex","flex-col","gap-1","w-full"],{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}}),$e=cva(["rounded-full","bg-[var(--accent-background)]","overflow-hidden"],{variants:{size:{sm:"h-1.5",default:"h-2",lg:"h-3"}},defaultVariants:{size:"default"}}),je=cva(["h-full","rounded-full","transition-all","duration-300"],{variants:{status:{pending:["bg-gradient-to-r","from-[var(--menu-muted)]","via-[var(--accent-background)]","to-[var(--menu-muted)]","bg-[length:200%_100%]","animate-progress-shimmer"],uploading:"bg-[var(--primary)]",complete:"bg-[var(--success-background)]",error:"bg-[var(--destructive-background)]"}},defaultVariants:{status:"pending"}}),We=cva(["flex","items-center","justify-between","gap-2"],{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}}),Ze=cva(["flex","items-center","justify-between","gap-2","mt-1","text-[var(--destructive-background)]"],{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}}),Ye=cva(["underline","hover:no-underline","min-h-[44px]","min-w-[44px]","inline-flex","items-center","justify-center","-mr-3","-my-2","focus-visible:outline-none","focus-visible:ring-2","focus-visible:ring-[var(--ring)]","focus-visible:ring-offset-2","rounded"],{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}});function ar(e,r){switch(e){case "pending":return "Queued for upload\u2026";case "uploading":return `Uploading\u2026 ${r}%`;case "complete":return "Upload complete";case "error":return "Upload failed \u2014 try again"}}function le({file:e,progress:r,status:t,error:a,onRetry:i,size:o="default",className:d}){let m=t==="pending",u=`progress-error-${e.name.replace(/[^a-zA-Z0-9]/g,"-")}`,c=ar(t,r);return jsxs("div",{className:b(ke({size:o}),d),children:[jsx(ProgressBar,{"aria-label":e.name,value:m?void 0:r,isIndeterminate:m,"aria-describedby":t==="error"&&a?u:void 0,children:({percentage:g,valueText:s})=>jsxs(Fragment,{children:[jsxs("div",{className:We({size:o}),children:[jsx("span",{className:"truncate",title:e.name,children:$(e.name,30)}),jsx("span",{className:"text-[var(--menu-muted)] flex-shrink-0",children:t==="error"?c:s??c})]}),jsx("div",{className:$e({size:o}),children:jsx("div",{className:je({status:t}),style:{width:m?"100%":`${g??0}%`}})})]})}),t==="error"&&a&&jsxs("div",{id:u,className:Ze({size:o}),children:[jsx("span",{children:a}),i&&jsx(Button,{onPress:i,className:Ye({size:o}),children:"Retry"})]}),jsxs("div",{"aria-live":"polite","aria-atomic":"true",className:"sr-only",children:[t==="complete"&&`${e.name} upload complete`,t==="error"&&`${e.name} upload failed${a?`: ${a}`:""}`]})]})}le.displayName="FileProgress";var bt=forwardRef(function({label:r,acceptedFileTypes:t,allowsMultiple:a=false,maxFileSize:i,maxFiles:o,description:d,errorMessage:m,successMessage:u,triggerText:c,isRequired:g,isDisabled:s,isInvalid:h,isValid:V,size:f="default",name:I,id:de,className:Y,value:v=[],onChange:N,validate:B,showPreviews:ue=false,previewSize:U=64,maxPreviewBytes:X$1=10*1024*1024,renderPreview:q,showProgress:ce=false,uploadProgress:M,uploadStatus:Xe,uploadErrors:qe,onRetry:R,"data-testid":Qe,"aria-label":xr,"aria-labelledby":br,"aria-describedby":Ke,...Et},ht){let It=useId(),Q=de??It,Je=`${Q}-label`,et=`${Q}-description`,tt=`${Q}-error`,[rt,fe]=useState(false),[Ft,pe]=useState(null),K=useRef(0),H=m??Ft,_t=h||!!H,z=[];Ke&&z.push(Ke),d&&z.push(et),H&&z.push(tt);let Tt=z.length>0?z.join(" "):void 0,at=useCallback((n,x=[])=>{let F=[],S=[];for(let E of n){if(t&&!Be(E,t)){S.push(`"${E.name}" is not a supported file type. Accepted: ${t}`);continue}if(i&&E.size>i){S.push(`"${E.name}" is too large (max ${se(i)}). Try compressing or resizing the file.`);continue}F.push(E);}return o&&a&&W(x,F).length>o?(S.push(`Maximum ${o} files allowed`),{valid:[],errors:S}):{valid:F,errors:S}},[t,i,o,a]),J=useCallback(n=>{if(!n||n.length===0)return;pe(null);let x=Array.from(n),F=a?v:[],{valid:S,errors:E}=at(x,F);if(E.length>0){pe(E[0]??"Invalid file");return}if(B&&S.length>0){let ee=B(a?W(F,S):S);if(ee){pe(ee);return}}let G;a?G=W(F,S):G=S.slice(0,1),N?.(G);},[a,v,at,B,N]),Vt=useCallback(n=>{J(n);},[J]),Nt=useCallback(n=>{let x=v.filter(F=>F!==n);N?.(x);},[v,N]),yt=useCallback(()=>{N?.([]);},[N]),Pt=useCallback(n=>{n.preventDefault(),n.stopPropagation(),!s&&(K.current++,fe(true));},[s]),Rt=useCallback(n=>{n.preventDefault(),n.stopPropagation();},[]),Ot=useCallback(n=>{n.preventDefault(),n.stopPropagation(),K.current--,K.current===0&&fe(false);},[]),At=useCallback(n=>{if(n.preventDefault(),n.stopPropagation(),K.current=0,fe(false),s)return;let x=n.dataTransfer?.files;J(x??null);},[s,J]),Lt=n=>{switch(j(n)){case "image":return ImageIcon;case "video":return VideoIcon;case "audio":return AudioLines;default:return FileIcon}},Dt=t?.join(",");return jsxs("div",{ref:ht,id:Q,className:b(Ne({size:f}),Y),"data-testid":Qe??"file-field",...Et,children:[jsx("label",{id:Je,className:Ce({size:f,isRequired:g}),children:r}),jsxs("div",{role:"group","data-testid":`${Qe??"file-field"}-dropzone`,className:b("drop-zone",ye({size:f,isDragOver:rt,isInvalid:_t,isDisabled:s})),onDragEnter:Pt,onDragOver:Rt,onDragLeave:Ot,onDrop:At,"aria-labelledby":Je,"aria-describedby":Tt,"aria-disabled":s||void 0,children:[jsx(FileTrigger,{acceptedFileTypes:t,allowsMultiple:a,onSelect:Vt,children:jsxs(D,{variant:"outline",isDisabled:s,buttonVisualClassName:Pe({size:f}),children:[jsx(Upload,{className:"h-4 w-4","aria-hidden":"true"}),rt?"Drop files here":c??(a?"Choose files":"Choose file")]})}),I&&jsx("input",{type:"file",name:I,accept:Dt,multiple:a,disabled:s,className:"sr-only",tabIndex:-1,"aria-hidden":"true"})]}),d&&jsx("p",{id:et,className:we({size:f}),children:d}),v.length>0&&jsxs("div",{className:Re({size:f}),children:[v.length>=2&&jsxs("div",{className:mt({size:f}),children:[jsxs("span",{className:"text-[var(--menu-muted)]",children:[v.length," files selected"]}),jsx(D,{variant:"link",visualSize:"sm",onPress:yt,buttonVisualClassName:b("text-[var(--menu-muted)] hover:text-[var(--destructive-background)]","underline-offset-4 hover:underline"),"aria-label":"Clear all files",children:"Clear all"})]}),jsx("ul",{className:"space-y-2",children:v.map((n,x)=>{let F=Lt(n),S=f==="sm"?Math.min(U,40):f==="lg"?Math.min(U,80):Math.min(U,48),E=Xe?.[x],G=M?.[x]??0,ee=qe?.get(x),it=ce&&E!==void 0;return jsx("li",{className:it?"p-3":Oe({size:f}),children:it?jsx(le,{file:n,progress:G,status:E,error:ee,onRetry:R?()=>R(x):void 0,size:f}):jsxs(Fragment,{children:[jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[ue?jsx(Ge,{file:n,size:S,maxBytes:X$1,renderPreview:q,className:"flex-shrink-0"}):jsx(F,{className:"h-4 w-4 flex-shrink-0 text-[var(--menu-muted)]","aria-hidden":"true"}),jsx("span",{className:"truncate",title:n.name,children:$(n.name,30)}),jsx("span",{className:"text-[var(--menu-muted)] flex-shrink-0",children:se(n.size)})]}),jsx(D,{variant:"ghost",visualSize:"icon",onPress:()=>Nt(n),buttonVisualClassName:Ae({size:f}),"aria-label":`Remove ${n.name}`,isDisabled:s,children:jsx(X,{className:"h-4 w-4","aria-hidden":"true"})})]})},`${n.name}-${x}`)})})]}),H&&jsx("p",{id:tt,role:"alert",className:Le({size:f}),children:H}),!H&&V&&u&&jsx("p",{className:De({size:f}),children:u})]})});bt.displayName="FileField";var St=z.object({className:z.string().optional(),children:z.any().optional(),id:z.string().optional(),"aria-label":z.string().optional(),"aria-labelledby":z.string().optional(),"aria-describedby":z.string().optional(),"aria-live":z.enum(["off","polite","assertive"]).optional(),"aria-hidden":z.boolean().optional(),"data-testid":z.string().optional()});var vr=St.extend({label:z.string(),acceptedFileTypes:z.array(z.string()).optional(),allowsMultiple:z.boolean().default(false),maxFileSize:z.number().optional(),maxFiles:z.number().optional(),description:z.string().optional(),errorMessage:z.string().optional(),successMessage:z.string().optional(),triggerText:z.string().optional(),isRequired:z.boolean().optional(),isDisabled:z.boolean().optional(),isInvalid:z.boolean().optional(),isValid:z.boolean().optional(),size:z.enum(["sm","default","lg"]).default("default"),name:z.string().optional(),showPreviews:z.boolean().default(false),previewSize:z.number().min(16).max(256).default(64),maxPreviewBytes:z.number().default(10*1024*1024),showProgress:z.boolean().default(false),uploadProgress:z.array(z.number().min(0).max(100)).optional(),uploadStatus:z.array(z.enum(["pending","uploading","complete","error"])).optional()}).refine(e=>!(e.successMessage&&e.errorMessage),{message:"Cannot provide both successMessage and errorMessage. Use one based on validation state.",path:["successMessage"]}).refine(e=>(typeof process<"u"&&process.env.NODE_ENV==="development"&&e.isValid&&e.isInvalid&&console.error("[FileField] Both isValid and isInvalid are true. isInvalid takes precedence."),true));export{bt as FileField,vr as FileFieldPropsSchema,Ge as FilePreview,le as FileProgress,gt as RESIZE_THRESHOLD,vt as createResizedPreview,W as deduplicateFiles,Ne as fileFieldContainerVariants,we as fileFieldDescriptionVariants,ye as fileFieldDropZoneVariants,Le as fileFieldErrorVariants,Oe as fileFieldItemVariants,Ce as fileFieldLabelVariants,Re as fileFieldListVariants,Ae as fileFieldRemoveButtonVariants,De as fileFieldSuccessVariants,Pe as fileFieldTriggerVariants,je as fileProgressBarVariants,Ze as fileProgressErrorVariants,We as fileProgressHeaderVariants,Ye as fileProgressRetryVariants,$e as fileProgressTrackVariants,ke as fileProgressVariants,Zt as formatAcceptedTypes,se as formatFileSize,Me as generatePreview,j as getFileIcon,Be as isFileTypeAccepted,Ue as isImageFile,$ as truncateFileName,ze as useFilePreview};//# sourceMappingURL=index.mjs.map
3
3
  //# sourceMappingURL=index.mjs.map