bynana-ui 2.0.0 → 2.1.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.
package/README.md CHANGED
@@ -1,23 +1,59 @@
1
1
  # Bynana UI
2
2
 
3
- > 200+ Beautiful React UI components built with Tailwind CSS and Framer Motion
3
+ > 180+ Beautiful React UI components built with Tailwind CSS and Framer Motion
4
4
 
5
5
  [![npm version](https://badge.fury.io/js/bynana-ui.svg)](https://www.npmjs.com/package/bynana-ui)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
7
 
8
8
  ## Installation
9
9
 
10
+ ### npm
10
11
  ```bash
11
- npm install bynana-ui framer-motion
12
- # or
13
- yarn add bynana-ui framer-motion
14
- # or
15
- pnpm add bynana-ui framer-motion
12
+ npm install bynana-ui
13
+ ```
14
+
15
+ ### yarn
16
+ ```bash
17
+ yarn add bynana-ui
18
+ ```
19
+
20
+ ### pnpm
21
+ ```bash
22
+ pnpm add bynana-ui
23
+ ```
24
+
25
+ ### bun
26
+ ```bash
27
+ bun add bynana-ui
28
+ ```
29
+
30
+ ## Peer Dependencies
31
+
32
+ Most components require these peer dependencies:
33
+
34
+ ### npm
35
+ ```bash
36
+ npm install framer-motion lucide-react clsx tailwind-merge
37
+ ```
38
+
39
+ ### yarn
40
+ ```bash
41
+ yarn add framer-motion lucide-react clsx tailwind-merge
42
+ ```
43
+
44
+ ### pnpm
45
+ ```bash
46
+ pnpm add framer-motion lucide-react clsx tailwind-merge
47
+ ```
48
+
49
+ ### bun
50
+ ```bash
51
+ bun add framer-motion lucide-react clsx tailwind-merge
16
52
  ```
17
53
 
18
54
  ## Quick Start
19
55
 
20
- Import all components from the main package:
56
+ Import components from the main package:
21
57
 
22
58
  ```tsx
23
59
  import { ShineButton, GradientText, GlassCard } from "bynana-ui";
@@ -31,88 +67,173 @@ import { GradientText } from "bynana-ui/gradient-text";
31
67
  import { GlassCard } from "bynana-ui/glass-card";
32
68
  ```
33
69
 
34
- ## Components
70
+ ## Components with Additional Dependencies
35
71
 
36
- ### Buttons
72
+ Some components require additional packages. Install them as needed:
37
73
 
38
- | Component | Import |
39
- |-----------|--------|
40
- | ShineButton | `bynana-ui/shine-button` |
41
- | RippleButton | `bynana-ui/ripple-button` |
42
- | MagneticButton | `bynana-ui/magnetic-button` |
43
- | BounceButton | `bynana-ui/bounce-button` |
44
- | GlowButton | `bynana-ui/glow-button` |
45
- | PulseButton | `bynana-ui/pulse-button` |
74
+ ### PixelTransition (GSAP)
46
75
 
47
- ### Text Effects
76
+ #### npm
77
+ ```bash
78
+ npm install gsap
79
+ ```
48
80
 
49
- | Component | Import |
50
- |-----------|--------|
51
- | GradientText | `bynana-ui/gradient-text` |
52
- | ShimmerText | `bynana-ui/shimmer-text` |
53
- | GlitchText | `bynana-ui/glitch-text` |
54
- | BounceText | `bynana-ui/bounce-text` |
55
- | BlurText | `bynana-ui/blur-text` |
56
- | Typewriter | `bynana-ui/typewriter` |
57
- | WaveText | `bynana-ui/wave-text` |
58
- | FlipText | `bynana-ui/flip-text` |
81
+ #### yarn
82
+ ```bash
83
+ yarn add gsap
84
+ ```
59
85
 
60
- ### Cards
86
+ #### pnpm
87
+ ```bash
88
+ pnpm add gsap
89
+ ```
61
90
 
62
- | Component | Import |
63
- |-----------|--------|
64
- | GlassCard | `bynana-ui/glass-card` |
65
- | HoverCard | `bynana-ui/hover-card` |
66
- | CardFlip | `bynana-ui/card-flip` |
91
+ #### bun
92
+ ```bash
93
+ bun add gsap
94
+ ```
67
95
 
68
- ### Loaders
96
+ ### Components NOT in npm package (require manual copy)
97
+
98
+ These components have heavy dependencies and are only available via copy/paste from [bynanaui.com](https://bynanaui.com):
99
+
100
+ | Component | Required Dependencies |
101
+ |-----------|----------------------|
102
+ | Dither | `three`, `postprocessing` |
103
+ | DotGrid | `ogl` |
104
+ | Masonry | `ogl` |
105
+ | Orb | `ogl` |
106
+ | Silk | `ogl` |
107
+ | Beams | `three` |
108
+ | PixelBlast | `three`, `postprocessing` |
109
+ | PixelTrail | `three`, `@react-three/fiber`, `@react-three/drei` |
110
+ | PrismaticBurst | `ogl` |
111
+ | GridDistortion | `three` |
112
+ | CircularGallery | `ogl` |
113
+ | GradientBlinds | `ogl` |
114
+ | Iridescence | `ogl` |
115
+ | LightRays | `ogl` |
116
+ | LiquidChrome | `ogl` |
117
+ | ShapeBlur | `ogl` |
118
+
119
+ To use these components, install the required dependencies:
120
+
121
+ #### For Three.js components:
122
+ ```bash
123
+ # npm
124
+ npm install three @types/three postprocessing
69
125
 
70
- | Component | Import |
71
- |-----------|--------|
72
- | LoadingDots | `bynana-ui/loading-dots` |
73
- | LoadingSpinner | `bynana-ui/loading-spinner` |
126
+ # yarn
127
+ yarn add three @types/three postprocessing
74
128
 
75
- ### Lists
129
+ # pnpm
130
+ pnpm add three @types/three postprocessing
76
131
 
77
- | Component | Import |
78
- |-----------|--------|
79
- | AnimatedList | `bynana-ui/animated-list` |
132
+ # bun
133
+ bun add three @types/three postprocessing
134
+ ```
80
135
 
81
- ## Usage Examples
136
+ #### For OGL components:
137
+ ```bash
138
+ # npm
139
+ npm install ogl
82
140
 
83
- ### ShineButton
141
+ # yarn
142
+ yarn add ogl
84
143
 
85
- ```tsx
86
- import { ShineButton } from "bynana-ui/shine-button";
144
+ # pnpm
145
+ pnpm add ogl
87
146
 
88
- <ShineButton>Click Me</ShineButton>
147
+ # bun
148
+ bun add ogl
89
149
  ```
90
150
 
91
- ### GradientText
151
+ #### For React Three Fiber components:
152
+ ```bash
153
+ # npm
154
+ npm install three @react-three/fiber @react-three/drei
92
155
 
93
- ```tsx
94
- import { GradientText } from "bynana-ui/gradient-text";
156
+ # yarn
157
+ yarn add three @react-three/fiber @react-three/drei
95
158
 
96
- <GradientText colors={["#ff6b6b", "#feca57", "#48dbfb"]}>
97
- Hello World
98
- </GradientText>
159
+ # pnpm
160
+ pnpm add three @react-three/fiber @react-three/drei
161
+
162
+ # bun
163
+ bun add three @react-three/fiber @react-three/drei
99
164
  ```
100
165
 
101
- ### AnimatedList
166
+ ## All Available Components
102
167
 
103
- ```tsx
104
- import { AnimatedList } from "bynana-ui/animated-list";
168
+ ### Buttons (16)
169
+ - ShineButton, RippleButton, MagneticButton, BounceButton, GlowButton, PulseButton
170
+ - NeonButton, LiquidButton, SlideButton, GradientButton, HoldButton, ThreeDButton
171
+ - CopyButton, ParticleButton, AttractButton, CommandButton
105
172
 
106
- <AnimatedList delay={1000}>
107
- <div>Item 1</div>
108
- <div>Item 2</div>
109
- <div>Item 3</div>
110
- </AnimatedList>
111
- ```
173
+ ### Text Effects (29)
174
+ - GradientText, ShimmerText, GlitchText, BounceText, BlurText, Typewriter
175
+ - WaveText, FlipText, ShinyText, FuzzyText, MatrixText, LiquidText
176
+ - SwooshText, ScrambledText, MagneticText, DynamicText, RotatingText
177
+ - StaggerText, RainbowText, CountUp, RevealText, SplitText, MorphText
178
+ - PerspectiveText, ElasticText, CircularText, GlowingText, SlicedText, DecryptedText
179
+
180
+ ### Cards (10)
181
+ - GlassCard, HoverCard, CardFlip, Card, PixelCard, TiltedCard
182
+ - DecayCard, LiquidGlassCard, CardStack, AppleActivityCard
183
+
184
+ ### Loaders (12)
185
+ - LoadingDots, LoadingSpinner, LoadingBar, LoadingPulse, LoadingBounce
186
+ - LoadingFlower, LoadingGeometric, LoadingMorph, LoadingRings, LoadingText
187
+ - LoadingWords, LoadingInvert
188
+
189
+ ### UI Components (20)
190
+ - Skeleton, Tooltip, TooltipMinimal, TooltipAnimated, Badge, Avatar
191
+ - Progress, Switch, Accordion, Tabs, Modal, Drawer, Alert, Terminal
192
+ - Stepper, FileTree, Counter, Toolbar, Dock, TrueFocus
193
+
194
+ ### Form Components (6)
195
+ - Input, Textarea, Checkbox, RadioGroup, Select, InputOTP
196
+
197
+ ### Hamburger Menus (8)
198
+ - HamburgerBasic, HamburgerSpin, HamburgerMorph, HamburgerSpring
199
+ - HamburgerWave, HamburgerStagger, Hamburger3D, HamburgerElastic
200
+
201
+ ### Navigation (5)
202
+ - FlowingMenu, GooeyNav, PillNav, SmoothDrawer, SmoothTab
203
+
204
+ ### Effects (5)
205
+ - ClickSpark, SmoothCursor, FloatEffect, GlowEffect, BlurFade
206
+
207
+ ### Backgrounds (4)
208
+ - Aurora, Threads, Squares, Waves
209
+
210
+ ### Sections (15)
211
+ - HeroGrid, HeroShowcase, TestimonialsSimple, TestimonialsGrid
212
+ - PricingModern, FooterSimple, FooterComplex, LogoCloud
213
+ - FaqsAccordion, FaqsGrid, TeamCarousel, JobListing, StatsCards
214
+ - StatsGrid, BentoGrid
215
+
216
+ ### AI Components (4)
217
+ - AILoading, AIPrompt, AIBar, AIVoice
218
+
219
+ ### Scroll Effects (6)
220
+ - ScrollVelocity, ScrollReveal, ScrollFloat, ScrollStack, ScrollText, InfiniteScroll
221
+
222
+ ### Cursors (3)
223
+ - TextCursor, TargetCursor, Crosshair
224
+
225
+ ### Other (20+)
226
+ - AnimatedList, ContributionGraph, ElasticSlider, SocialButton, V0Button
227
+ - AnimatedThemeToggler, ShimmerEffect, Loader, AnimatedCircularProgressBar
228
+ - MultiStepLoader, ASCIIText, FallingText, Magnet, TextType, Folder
229
+ - TestimonialsStars, LogoLoop, FloatingPaths, BackgroundPaths, TeamSelector
230
+ - AITextLoading, TooltipInteractive, TooltipMagnetic, TooltipRich
231
+ - MagnetLines, GlareHover, TweetCard, PixelTransition, BlurFadeEffect
232
+ - ShapeHero, FileUpload
112
233
 
113
234
  ## Tailwind CSS Setup
114
235
 
115
- Make sure you have Tailwind CSS configured in your project. Add the package to your content paths:
236
+ Add the package to your Tailwind content paths:
116
237
 
117
238
  ```js
118
239
  // tailwind.config.js
@@ -127,7 +248,7 @@ module.exports = {
127
248
 
128
249
  ## Browse All Components
129
250
 
130
- Visit [bynanaui.com](https://bynanaui.com) to see all 200+ components with live previews and copy-paste code.
251
+ Visit [bynanaui.com](https://bynanaui.com) to see all components with live previews and copy-paste code.
131
252
 
132
253
  ## License
133
254
 
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var h=require('framer-motion'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var h__namespace=/*#__PURE__*/_interopNamespace(h);var m=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var l=(e,t,i,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of f(t))!d.call(e,n)&&n!==i&&m(e,n,{get:()=>t[n],enumerable:!(o=p(t,n))||o.enumerable});return e},c=(e,t,i)=>(l(e,t,"default"),i);var a={};c(a,h__namespace);function s(...e){return tailwindMerge.twMerge(clsx.clsx(e))}function y({children:e,className:t,delay:i=0}){return jsxRuntime.jsx("div",{className:s("w-full min-h-[500px] flex items-center justify-center bg-white dark:bg-zinc-900 rounded-xl border border-zinc-200 dark:border-zinc-800",t),children:jsxRuntime.jsx(a.motion.div,{className:"text-center px-8",initial:{opacity:0,filter:"blur(30px)",scale:.85},animate:{opacity:1,filter:"blur(0px)",scale:1},transition:{duration:1.2,delay:i,ease:[.25,.1,.25,1]},children:e||jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx(a.motion.h2,{className:"text-8xl font-bold mb-6 text-zinc-900 dark:text-zinc-100",initial:{opacity:0},animate:{opacity:1},transition:{delay:i+.3,duration:.8},style:{fontFamily:"system-ui, -apple-system, sans-serif",letterSpacing:"-0.03em",fontWeight:700,lineHeight:.9},children:"BLUR TO FOCUS"}),jsxRuntime.jsx(a.motion.p,{className:"text-2xl text-zinc-500 font-light",initial:{opacity:0,y:10},animate:{opacity:1,y:0},transition:{delay:i+.6,duration:.8},style:{letterSpacing:"0.05em",fontWeight:300},children:"Cinematic Entrance Animation"})]})})})}var C=y;exports.BlurFadeEffect=y;exports.default=C;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../node_modules/motion/dist/es/react.mjs","../../src/utils/cn.ts","../../src/blur-fade-effect/index.tsx"],"names":["react_exports","__reExport","framer_motion_star","cn","inputs","twMerge","clsx","BlurFadeEffect","children","className","delay","jsx","jsxs","blur_fade_effect_default"],"mappings":"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","file":"index.js","sourcesContent":["export * from 'framer-motion';\n","import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\"\r\n\r\nimport { motion } from \"motion/react\"\r\nimport { cn } from \"../utils/cn\"\r\n\r\ninterface BlurFadeEffectProps {\r\n children?: React.ReactNode\r\n className?: string\r\n delay?: number\r\n}\r\n\r\nfunction BlurFadeEffect({\r\n children,\r\n className,\r\n delay = 0,\r\n}: BlurFadeEffectProps) {\r\n return (\r\n <div className={cn(\"w-full min-h-[500px] flex items-center justify-center bg-white dark:bg-zinc-900 rounded-xl border border-zinc-200 dark:border-zinc-800\", className)}>\r\n <motion.div\r\n className=\"text-center px-8\"\r\n initial={{ opacity: 0, filter: \"blur(30px)\", scale: 0.85 }}\r\n animate={{ opacity: 1, filter: \"blur(0px)\", scale: 1 }}\r\n transition={{ duration: 1.2, delay, ease: [0.25, 0.1, 0.25, 1] }}\r\n >\r\n {children || (\r\n <div>\r\n <motion.h2\r\n className=\"text-8xl font-bold mb-6 text-zinc-900 dark:text-zinc-100\"\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n transition={{ delay: delay + 0.3, duration: 0.8 }}\r\n style={{\r\n fontFamily: \"system-ui, -apple-system, sans-serif\",\r\n letterSpacing: \"-0.03em\",\r\n fontWeight: 700,\r\n lineHeight: 0.9\r\n }}\r\n >\r\n BLUR TO FOCUS\r\n </motion.h2>\r\n <motion.p\r\n className=\"text-2xl text-zinc-500 font-light\"\r\n initial={{ opacity: 0, y: 10 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n transition={{ delay: delay + 0.6, duration: 0.8 }}\r\n style={{\r\n letterSpacing: \"0.05em\",\r\n fontWeight: 300\r\n }}\r\n >\r\n Cinematic Entrance Animation\r\n </motion.p>\r\n </div>\r\n )}\r\n </motion.div>\r\n </div>\r\n )\r\n}\r\n\r\nexport { BlurFadeEffect };\r\nexport default BlurFadeEffect;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import*as h from'framer-motion';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs}from'react/jsx-runtime';var m=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var l=(e,t,i,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of f(t))!d.call(e,n)&&n!==i&&m(e,n,{get:()=>t[n],enumerable:!(o=p(t,n))||o.enumerable});return e},c=(e,t,i)=>(l(e,t,"default"),i);var a={};c(a,h);function s(...e){return twMerge(clsx(e))}function y({children:e,className:t,delay:i=0}){return jsx("div",{className:s("w-full min-h-[500px] flex items-center justify-center bg-white dark:bg-zinc-900 rounded-xl border border-zinc-200 dark:border-zinc-800",t),children:jsx(a.motion.div,{className:"text-center px-8",initial:{opacity:0,filter:"blur(30px)",scale:.85},animate:{opacity:1,filter:"blur(0px)",scale:1},transition:{duration:1.2,delay:i,ease:[.25,.1,.25,1]},children:e||jsxs("div",{children:[jsx(a.motion.h2,{className:"text-8xl font-bold mb-6 text-zinc-900 dark:text-zinc-100",initial:{opacity:0},animate:{opacity:1},transition:{delay:i+.3,duration:.8},style:{fontFamily:"system-ui, -apple-system, sans-serif",letterSpacing:"-0.03em",fontWeight:700,lineHeight:.9},children:"BLUR TO FOCUS"}),jsx(a.motion.p,{className:"text-2xl text-zinc-500 font-light",initial:{opacity:0,y:10},animate:{opacity:1,y:0},transition:{delay:i+.6,duration:.8},style:{letterSpacing:"0.05em",fontWeight:300},children:"Cinematic Entrance Animation"})]})})})}var C=y;export{y as BlurFadeEffect,C as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../node_modules/motion/dist/es/react.mjs","../../src/utils/cn.ts","../../src/blur-fade-effect/index.tsx"],"names":["react_exports","__reExport","framer_motion_star","cn","inputs","twMerge","clsx","BlurFadeEffect","children","className","delay","jsx","jsxs","blur_fade_effect_default"],"mappings":"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","file":"index.mjs","sourcesContent":["export * from 'framer-motion';\n","import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\"\r\n\r\nimport { motion } from \"motion/react\"\r\nimport { cn } from \"../utils/cn\"\r\n\r\ninterface BlurFadeEffectProps {\r\n children?: React.ReactNode\r\n className?: string\r\n delay?: number\r\n}\r\n\r\nfunction BlurFadeEffect({\r\n children,\r\n className,\r\n delay = 0,\r\n}: BlurFadeEffectProps) {\r\n return (\r\n <div className={cn(\"w-full min-h-[500px] flex items-center justify-center bg-white dark:bg-zinc-900 rounded-xl border border-zinc-200 dark:border-zinc-800\", className)}>\r\n <motion.div\r\n className=\"text-center px-8\"\r\n initial={{ opacity: 0, filter: \"blur(30px)\", scale: 0.85 }}\r\n animate={{ opacity: 1, filter: \"blur(0px)\", scale: 1 }}\r\n transition={{ duration: 1.2, delay, ease: [0.25, 0.1, 0.25, 1] }}\r\n >\r\n {children || (\r\n <div>\r\n <motion.h2\r\n className=\"text-8xl font-bold mb-6 text-zinc-900 dark:text-zinc-100\"\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n transition={{ delay: delay + 0.3, duration: 0.8 }}\r\n style={{\r\n fontFamily: \"system-ui, -apple-system, sans-serif\",\r\n letterSpacing: \"-0.03em\",\r\n fontWeight: 700,\r\n lineHeight: 0.9\r\n }}\r\n >\r\n BLUR TO FOCUS\r\n </motion.h2>\r\n <motion.p\r\n className=\"text-2xl text-zinc-500 font-light\"\r\n initial={{ opacity: 0, y: 10 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n transition={{ delay: delay + 0.6, duration: 0.8 }}\r\n style={{\r\n letterSpacing: \"0.05em\",\r\n fontWeight: 300\r\n }}\r\n >\r\n Cinematic Entrance Animation\r\n </motion.p>\r\n </div>\r\n )}\r\n </motion.div>\r\n </div>\r\n )\r\n}\r\n\r\nexport { BlurFadeEffect };\r\nexport default BlurFadeEffect;\r\n"]}
@@ -0,0 +1,16 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),Ca=require('framer-motion'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Ca__namespace=/*#__PURE__*/_interopNamespace(Ca);var ea=Object.defineProperty;var ta=Object.getOwnPropertyDescriptor;var ua=Object.getOwnPropertyNames;var oa=Object.prototype.hasOwnProperty;var G=(a,e,o,d)=>{if(e&&typeof e=="object"||typeof e=="function")for(let f of ua(e))!oa.call(a,f)&&f!==o&&ea(a,f,{get:()=>e[f],enumerable:!(d=ta(e,f))||d.enumerable});return a},E=(a,e,o)=>(G(a,e,"default"),o);var i={};E(i,Ca__namespace);var W=a=>a.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),da=a=>a.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,o,d)=>d?d.toUpperCase():o.toLowerCase()),M=a=>{let e=da(a);return e.charAt(0).toUpperCase()+e.slice(1)},P=(...a)=>a.filter((e,o,d)=>!!e&&e.trim()!==""&&d.indexOf(e)===o).join(" ").trim(),V=a=>{for(let e in a)if(e.startsWith("aria-")||e==="role"||e==="title")return true};var z={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var N=react.forwardRef(({color:a="currentColor",size:e=24,strokeWidth:o=2,absoluteStrokeWidth:d,className:f="",children:s,iconNode:g,...x},B)=>react.createElement("svg",{ref:B,...z,width:e,height:e,stroke:a,strokeWidth:d?Number(o)*24/Number(e):o,className:P("lucide",f),...!s&&!V(x)&&{"aria-hidden":"true"},...x},[...g.map(([S,C])=>react.createElement(S,C)),...Array.isArray(s)?s:[s]]));var K=(a,e)=>{let o=react.forwardRef(({className:d,...f},s)=>react.createElement(N,{ref:s,iconNode:e,className:P(`lucide-${W(M(a))}`,`lucide-${a}`,d),...f}));return o.displayName=M(a),o};var sa=[["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"}]],L=K("cloud-upload",sa);function R(...a){return tailwindMerge.twMerge(clsx.clsx(a))}var pa=5*1024*1024,Q=5,T=["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"],y=(a,e=2)=>{if(!+a)return "0 Bytes";let o=1024,d=e<0?0:e,f=Math.floor(Math.log(a)/Math.log(o)),s=T[f]||T[T.length-1];return `${Number.parseFloat((a/o**f).toFixed(d))} ${s}`},ma=()=>jsxRuntime.jsx("div",{className:"relative w-16 h-16",children:jsxRuntime.jsxs("svg",{viewBox:"0 0 100 100",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"w-full h-full",children:[jsxRuntime.jsx("circle",{cx:"50",cy:"50",r:"45",className:"stroke-gray-200 dark:stroke-gray-700",strokeWidth:"2",strokeDasharray:"4 4",children:jsxRuntime.jsx("animateTransform",{attributeName:"transform",type:"rotate",from:"0 50 50",to:"360 50 50",dur:"60s",repeatCount:"indefinite"})}),jsxRuntime.jsx("path",{d:"M30 35H70C75 35 75 40 75 40V65C75 70 70 70 70 70H30C25 70 25 65 25 65V40C25 35 30 35 30 35Z",className:"fill-blue-100 dark:fill-blue-900/30 stroke-blue-500 dark:stroke-blue-400",strokeWidth:"2"}),jsxRuntime.jsxs("g",{className:"transform translate-y-2",children:[jsxRuntime.jsx("line",{x1:"50",y1:"45",x2:"50",y2:"60",className:"stroke-blue-500 dark:stroke-blue-400",strokeWidth:"2",strokeLinecap:"round"}),jsxRuntime.jsx("polyline",{points:"42,52 50,45 58,52",className:"stroke-blue-500 dark:stroke-blue-400",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",fill:"none"})]})]})}),La=({progress:a})=>jsxRuntime.jsxs("div",{className:"relative w-16 h-16",children:[jsxRuntime.jsxs("svg",{viewBox:"0 0 100 100",className:"w-full h-full",children:[jsxRuntime.jsx("circle",{cx:"50",cy:"50",r:"40",className:"stroke-gray-200 dark:stroke-gray-700",strokeWidth:"8",fill:"none"}),jsxRuntime.jsx("circle",{cx:"50",cy:"50",r:"40",className:"stroke-blue-500",strokeWidth:"8",fill:"none",strokeLinecap:"round",strokeDasharray:`${a/100*251.2} 251.2`,transform:"rotate(-90 50 50)"})]}),jsxRuntime.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:jsxRuntime.jsxs("span",{className:"text-sm font-medium text-blue-500",children:[Math.round(a),"%"]})})]});function Ia({onUploadSuccess:a=()=>{},onUploadError:e=()=>{},acceptedFileTypes:o=[],maxFileSize:d=pa,currentFile:f=null,onFileRemove:s=()=>{},uploadDelay:g=2e3,validateFile:x=()=>null,className:B}){let[S,C]=react.useState(f),[n,p]=react.useState("idle"),[q,h]=react.useState(0),[D,F]=react.useState(null),b=react.useRef(null),m=react.useRef(null);react.useEffect(()=>()=>{m.current&&clearInterval(m.current);},[]);let U=react.useCallback(t=>t.size>d?{message:`File size exceeds ${y(d)}`,code:"FILE_TOO_LARGE"}:null,[d]),v=react.useCallback(t=>{if(!o?.length)return null;let l=t.type.toLowerCase();return o.some(I=>l.match(I.toLowerCase()))?null:{message:`File type must be ${o.join(", ")}`,code:"INVALID_FILE_TYPE"}},[o]),k=react.useCallback(t=>{F(t),p("error"),e?.(t),setTimeout(()=>{F(null),p("idle");},3e3);},[e]),H=react.useCallback(t=>{let l=0;m.current&&clearInterval(m.current),m.current=setInterval(()=>{l+=Q,l>=100?(m.current&&clearInterval(m.current),h(0),p("idle"),C(null),a?.(t)):p(I=>I==="uploading"?(h(l),"uploading"):(m.current&&clearInterval(m.current),I));},g/(100/Q));},[a,g]),w=react.useCallback(t=>{if(!t)return;F(null);let l=U(t);if(l){k(l);return}let I=v(t);if(I){k(I);return}let O=x?.(t);if(O){k(O);return}C(t),p("uploading"),h(0),H(t);},[H,U,v,x,k]),J=react.useCallback(t=>{t.preventDefault(),t.stopPropagation(),p(l=>l!=="uploading"?"dragging":l);},[]),j=react.useCallback(t=>{t.preventDefault(),t.stopPropagation(),p(l=>l==="dragging"?"idle":l);},[]),Y=react.useCallback(t=>{if(t.preventDefault(),t.stopPropagation(),n==="uploading")return;p("idle");let l=t.dataTransfer.files?.[0];l&&w(l);},[n,w]),_=react.useCallback(t=>{let l=t.target.files?.[0];w(l||null),t.target&&(t.target.value="");},[w]),$=react.useCallback(()=>{n!=="uploading"&&b.current?.click();},[n]),aa=react.useCallback(()=>{C(null),p("idle"),h(0),s&&s();},[s]);return jsxRuntime.jsx("div",{className:R("relative w-full max-w-sm mx-auto",B),children:jsxRuntime.jsx("div",{className:"group relative w-full rounded-xl bg-gray-900 dark:bg-black ring-1 ring-gray-200 dark:ring-white/10 p-0.5",children:jsxRuntime.jsx("div",{className:"relative w-full rounded-[10px] bg-gray-50/50 dark:bg-white/[0.02] p-1.5",children:jsxRuntime.jsxs("div",{className:R("relative mx-auto w-full overflow-hidden rounded-lg border border-gray-100 dark:border-white/[0.08] bg-gray-900 dark:bg-black/50",D?"border-red-500/50":""),children:[jsxRuntime.jsx("div",{className:"relative h-[240px]",children:jsxRuntime.jsx(i.AnimatePresence,{mode:"wait",children:n==="idle"||n==="dragging"?jsxRuntime.jsxs(i.motion.div,{initial:{opacity:0,y:10},animate:{opacity:n==="dragging"?.8:1,y:0,scale:n==="dragging"?.98:1},exit:{opacity:0,y:-10},transition:{duration:.2},className:"absolute inset-0 flex flex-col items-center justify-center p-6",onDragOver:J,onDragLeave:j,onDrop:Y,children:[jsxRuntime.jsx("div",{className:"mb-4",children:jsxRuntime.jsx(ma,{})}),jsxRuntime.jsxs("div",{className:"text-center space-y-1.5 mb-4",children:[jsxRuntime.jsx("h3",{className:"text-lg font-semibold text-white dark:text-white tracking-tight",children:"Drag and drop or"}),jsxRuntime.jsxs("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:[o?.length?`${o.map(t=>t.split("/")[1]).join(", ").toUpperCase()}`:"SVG, PNG, JPG or GIF"," ",d&&`up to ${y(d)}`]})]}),jsxRuntime.jsxs("button",{type:"button",onClick:$,className:"w-4/5 flex items-center justify-center gap-2 rounded-lg bg-gray-800 dark:bg-white/10 px-4 py-2.5 text-sm font-semibold text-white dark:text-white transition-all duration-200 hover:bg-gray-700 dark:hover:bg-white/20 group",children:[jsxRuntime.jsx("span",{children:"Upload File"}),jsxRuntime.jsx(L,{className:"w-4 h-4 group-hover:scale-110 transition-transform duration-200"})]}),jsxRuntime.jsx("p",{className:"mt-3 text-xs text-gray-500 dark:text-gray-400",children:"or drag and drop your file here"}),jsxRuntime.jsx("input",{ref:b,type:"file",className:"sr-only",onChange:_,accept:o?.join(",")})]},"dropzone"):n==="uploading"?jsxRuntime.jsxs(i.motion.div,{initial:{opacity:0,scale:.95},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.95},className:"absolute inset-0 flex flex-col items-center justify-center p-6",children:[jsxRuntime.jsx("div",{className:"mb-4",children:jsxRuntime.jsx(La,{progress:q})}),jsxRuntime.jsxs("div",{className:"text-center space-y-1.5 mb-4",children:[jsxRuntime.jsx("h3",{className:"text-sm font-semibold text-gray-900 dark:text-white truncate",children:S?.name}),jsxRuntime.jsxs("div",{className:"flex items-center justify-center gap-2 text-xs",children:[jsxRuntime.jsx("span",{className:"text-gray-500 dark:text-gray-400",children:y(S?.size||0)}),jsxRuntime.jsxs("span",{className:"font-medium text-blue-500",children:[Math.round(q),"%"]})]})]}),jsxRuntime.jsx("button",{onClick:aa,type:"button",className:"w-4/5 flex items-center justify-center gap-2 rounded-lg bg-gray-100 dark:bg-white/10 px-4 py-2.5 text-sm font-semibold text-gray-900 dark:text-white transition-all duration-200 hover:bg-gray-200 dark:hover:bg-white/20",children:"Cancel"})]},"uploading"):null})}),jsxRuntime.jsx(i.AnimatePresence,{children:D&&jsxRuntime.jsx(i.motion.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},className:"absolute bottom-4 left-1/2 transform -translate-x-1/2 px-4 py-2 bg-red-500/10 border border-red-500/20 rounded-lg",children:jsxRuntime.jsx("p",{className:"text-sm text-red-500 dark:text-red-400",children:D.message})})})]})})})})}var Ea=Ia;/*! Bundled license information:
2
+
3
+ lucide-react/dist/esm/shared/src/utils.js:
4
+ lucide-react/dist/esm/defaultAttributes.js:
5
+ lucide-react/dist/esm/Icon.js:
6
+ lucide-react/dist/esm/createLucideIcon.js:
7
+ lucide-react/dist/esm/icons/cloud-upload.js:
8
+ lucide-react/dist/esm/lucide-react.js:
9
+ (**
10
+ * @license lucide-react v0.545.0 - ISC
11
+ *
12
+ * This source code is licensed under the ISC license.
13
+ * See the LICENSE file in the root directory of this source tree.
14
+ *)
15
+ */exports.FileUpload=Ia;exports.default=Ea;//# sourceMappingURL=index.js.map
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/file-upload/index.tsx","../../../../node_modules/motion/dist/es/react.mjs","../../../../node_modules/shared/src/utils.ts","../../../../node_modules/lucide-react/src/defaultAttributes.ts","../../../../node_modules/lucide-react/src/Icon.ts","../../../../node_modules/lucide-react/src/createLucideIcon.ts","../../../../node_modules/lucide-react/src/icons/cloud-upload.ts","../../src/utils/cn.ts"],"names":["react_exports","__reExport","framer_motion_star","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","props","prop","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","CloudUpload","cn","inputs","twMerge","clsx","DEFAULT_MAX_FILE_SIZE","UPLOAD_STEP_SIZE","FILE_SIZES","formatBytes","bytes","decimals","k","dm","i","unit","UploadIllustration","jsx","jsxs","UploadingAnimation","progress","FileUpload","onUploadSuccess","onUploadError","acceptedFileTypes","maxFileSize","initialFile","onFileRemove","uploadDelay","validateFile","file","setFile","useState","status","setStatus","setProgress","error","setError","fileInputRef","useRef","uploadIntervalRef","useEffect","validateFileSize","useCallback","validateFileType","fileType","type","handleError","simulateUpload","uploadingFile","currentProgress","prevStatus","handleFileSelect","selectedFile","sizeError","typeError","customError","handleDragOver","e","prev","handleDragLeave","handleDrop","droppedFile","handleFileInputChange","triggerFileInput","resetState","file_upload_default"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\r\n\r\nimport {\r\n useState,\r\n useRef,\r\n useCallback,\r\n type DragEvent,\r\n useEffect,\r\n} from \"react\";\r\nimport { motion, AnimatePresence } from \"motion/react\";\r\nimport { UploadCloud } from \"lucide-react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ntype FileStatus = \"idle\" | \"dragging\" | \"uploading\" | \"error\";\r\n\r\ninterface FileError {\r\n message: string;\r\n code: string;\r\n}\r\n\r\ninterface FileUploadProps {\r\n onUploadSuccess?: (file: File) => void;\r\n onUploadError?: (error: FileError) => void;\r\n acceptedFileTypes?: string[];\r\n maxFileSize?: number;\r\n currentFile?: File | null;\r\n onFileRemove?: () => void;\r\n uploadDelay?: number;\r\n validateFile?: (file: File) => FileError | null;\r\n className?: string;\r\n}\r\n\r\nconst DEFAULT_MAX_FILE_SIZE = 5 * 1024 * 1024;\r\nconst UPLOAD_STEP_SIZE = 5;\r\nconst FILE_SIZES = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"] as const;\r\n\r\nconst formatBytes = (bytes: number, decimals = 2): string => {\r\n if (!+bytes) return \"0 Bytes\";\r\n const k = 1024;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n const unit = FILE_SIZES[i] || FILE_SIZES[FILE_SIZES.length - 1];\r\n return `${Number.parseFloat((bytes / k ** i).toFixed(dm))} ${unit}`;\r\n};\r\n\r\nconst UploadIllustration = () => (\r\n <div className=\"relative w-16 h-16\">\r\n <svg viewBox=\"0 0 100 100\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" className=\"w-full h-full\">\r\n <circle cx=\"50\" cy=\"50\" r=\"45\" className=\"stroke-gray-200 dark:stroke-gray-700\" strokeWidth=\"2\" strokeDasharray=\"4 4\">\r\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 50 50\" to=\"360 50 50\" dur=\"60s\" repeatCount=\"indefinite\" />\r\n </circle>\r\n <path d=\"M30 35H70C75 35 75 40 75 40V65C75 70 70 70 70 70H30C25 70 25 65 25 65V40C25 35 30 35 30 35Z\" className=\"fill-blue-100 dark:fill-blue-900/30 stroke-blue-500 dark:stroke-blue-400\" strokeWidth=\"2\" />\r\n <g className=\"transform translate-y-2\">\r\n <line x1=\"50\" y1=\"45\" x2=\"50\" y2=\"60\" className=\"stroke-blue-500 dark:stroke-blue-400\" strokeWidth=\"2\" strokeLinecap=\"round\" />\r\n <polyline points=\"42,52 50,45 58,52\" className=\"stroke-blue-500 dark:stroke-blue-400\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" />\r\n </g>\r\n </svg>\r\n </div>\r\n);\r\n\r\nconst UploadingAnimation = ({ progress }: { progress: number }) => (\r\n <div className=\"relative w-16 h-16\">\r\n <svg viewBox=\"0 0 100 100\" className=\"w-full h-full\">\r\n <circle cx=\"50\" cy=\"50\" r=\"40\" className=\"stroke-gray-200 dark:stroke-gray-700\" strokeWidth=\"8\" fill=\"none\" />\r\n <circle cx=\"50\" cy=\"50\" r=\"40\" className=\"stroke-blue-500\" strokeWidth=\"8\" fill=\"none\" strokeLinecap=\"round\" strokeDasharray={`${(progress / 100) * 251.2} 251.2`} transform=\"rotate(-90 50 50)\" />\r\n </svg>\r\n <div className=\"absolute inset-0 flex items-center justify-center\">\r\n <span className=\"text-sm font-medium text-blue-500\">{Math.round(progress)}%</span>\r\n </div>\r\n </div>\r\n);\r\n\r\nfunction FileUpload({\r\n onUploadSuccess = () => {},\r\n onUploadError = () => {},\r\n acceptedFileTypes = [],\r\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\r\n currentFile: initialFile = null,\r\n onFileRemove = () => {},\r\n uploadDelay = 2000,\r\n validateFile = () => null,\r\n className,\r\n}: FileUploadProps) {\r\n const [file, setFile] = useState<File | null>(initialFile);\r\n const [status, setStatus] = useState<FileStatus>(\"idle\");\r\n const [progress, setProgress] = useState(0);\r\n const [error, setError] = useState<FileError | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const uploadIntervalRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (uploadIntervalRef.current) clearInterval(uploadIntervalRef.current);\r\n };\r\n }, []);\r\n\r\n const validateFileSize = useCallback((file: File): FileError | null => {\r\n if (file.size > maxFileSize) {\r\n return { message: `File size exceeds ${formatBytes(maxFileSize)}`, code: \"FILE_TOO_LARGE\" };\r\n }\r\n return null;\r\n }, [maxFileSize]);\r\n\r\n const validateFileType = useCallback((file: File): FileError | null => {\r\n if (!acceptedFileTypes?.length) return null;\r\n const fileType = file.type.toLowerCase();\r\n if (!acceptedFileTypes.some((type) => fileType.match(type.toLowerCase()))) {\r\n return { message: `File type must be ${acceptedFileTypes.join(\", \")}`, code: \"INVALID_FILE_TYPE\" };\r\n }\r\n return null;\r\n }, [acceptedFileTypes]);\r\n\r\n const handleError = useCallback((error: FileError) => {\r\n setError(error);\r\n setStatus(\"error\");\r\n onUploadError?.(error);\r\n setTimeout(() => { setError(null); setStatus(\"idle\"); }, 3000);\r\n }, [onUploadError]);\r\n\r\n const simulateUpload = useCallback((uploadingFile: File) => {\r\n let currentProgress = 0;\r\n if (uploadIntervalRef.current) clearInterval(uploadIntervalRef.current);\r\n uploadIntervalRef.current = setInterval(() => {\r\n currentProgress += UPLOAD_STEP_SIZE;\r\n if (currentProgress >= 100) {\r\n if (uploadIntervalRef.current) clearInterval(uploadIntervalRef.current);\r\n setProgress(0);\r\n setStatus(\"idle\");\r\n setFile(null);\r\n onUploadSuccess?.(uploadingFile);\r\n } else {\r\n setStatus((prevStatus) => {\r\n if (prevStatus === \"uploading\") { setProgress(currentProgress); return \"uploading\"; }\r\n if (uploadIntervalRef.current) clearInterval(uploadIntervalRef.current);\r\n return prevStatus;\r\n });\r\n }\r\n }, uploadDelay / (100 / UPLOAD_STEP_SIZE));\r\n }, [onUploadSuccess, uploadDelay]);\r\n\r\n const handleFileSelect = useCallback((selectedFile: File | null) => {\r\n if (!selectedFile) return;\r\n setError(null);\r\n const sizeError = validateFileSize(selectedFile);\r\n if (sizeError) { handleError(sizeError); return; }\r\n const typeError = validateFileType(selectedFile);\r\n if (typeError) { handleError(typeError); return; }\r\n const customError = validateFile?.(selectedFile);\r\n if (customError) { handleError(customError); return; }\r\n setFile(selectedFile);\r\n setStatus(\"uploading\");\r\n setProgress(0);\r\n simulateUpload(selectedFile);\r\n }, [simulateUpload, validateFileSize, validateFileType, validateFile, handleError]);\r\n\r\n const handleDragOver = useCallback((e: DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setStatus((prev) => (prev !== \"uploading\" ? \"dragging\" : prev));\r\n }, []);\r\n\r\n const handleDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setStatus((prev) => (prev === \"dragging\" ? \"idle\" : prev));\r\n }, []);\r\n\r\n const handleDrop = useCallback((e: DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (status === \"uploading\") return;\r\n setStatus(\"idle\");\r\n const droppedFile = e.dataTransfer.files?.[0];\r\n if (droppedFile) handleFileSelect(droppedFile);\r\n }, [status, handleFileSelect]);\r\n\r\n const handleFileInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const selectedFile = e.target.files?.[0];\r\n handleFileSelect(selectedFile || null);\r\n if (e.target) e.target.value = \"\";\r\n }, [handleFileSelect]);\r\n\r\n const triggerFileInput = useCallback(() => {\r\n if (status === \"uploading\") return;\r\n fileInputRef.current?.click();\r\n }, [status]);\r\n\r\n const resetState = useCallback(() => {\r\n setFile(null);\r\n setStatus(\"idle\");\r\n setProgress(0);\r\n if (onFileRemove) onFileRemove();\r\n }, [onFileRemove]);\r\n\r\n return (\r\n <div className={cn(\"relative w-full max-w-sm mx-auto\", className)}>\r\n <div className=\"group relative w-full rounded-xl bg-gray-900 dark:bg-black ring-1 ring-gray-200 dark:ring-white/10 p-0.5\">\r\n <div className=\"relative w-full rounded-[10px] bg-gray-50/50 dark:bg-white/[0.02] p-1.5\">\r\n <div className={cn(\"relative mx-auto w-full overflow-hidden rounded-lg border border-gray-100 dark:border-white/[0.08] bg-gray-900 dark:bg-black/50\", error ? \"border-red-500/50\" : \"\")}>\r\n <div className=\"relative h-[240px]\">\r\n <AnimatePresence mode=\"wait\">\r\n {status === \"idle\" || status === \"dragging\" ? (\r\n <motion.div key=\"dropzone\" initial={{ opacity: 0, y: 10 }} animate={{ opacity: status === \"dragging\" ? 0.8 : 1, y: 0, scale: status === \"dragging\" ? 0.98 : 1 }} exit={{ opacity: 0, y: -10 }} transition={{ duration: 0.2 }} className=\"absolute inset-0 flex flex-col items-center justify-center p-6\" onDragOver={handleDragOver} onDragLeave={handleDragLeave} onDrop={handleDrop}>\r\n <div className=\"mb-4\"><UploadIllustration /></div>\r\n <div className=\"text-center space-y-1.5 mb-4\">\r\n <h3 className=\"text-lg font-semibold text-white dark:text-white tracking-tight\">Drag and drop or</h3>\r\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{acceptedFileTypes?.length ? `${acceptedFileTypes.map((t) => t.split(\"/\")[1]).join(\", \").toUpperCase()}` : \"SVG, PNG, JPG or GIF\"} {maxFileSize && `up to ${formatBytes(maxFileSize)}`}</p>\r\n </div>\r\n <button type=\"button\" onClick={triggerFileInput} className=\"w-4/5 flex items-center justify-center gap-2 rounded-lg bg-gray-800 dark:bg-white/10 px-4 py-2.5 text-sm font-semibold text-white dark:text-white transition-all duration-200 hover:bg-gray-700 dark:hover:bg-white/20 group\">\r\n <span>Upload File</span>\r\n <UploadCloud className=\"w-4 h-4 group-hover:scale-110 transition-transform duration-200\" />\r\n </button>\r\n <p className=\"mt-3 text-xs text-gray-500 dark:text-gray-400\">or drag and drop your file here</p>\r\n <input ref={fileInputRef} type=\"file\" className=\"sr-only\" onChange={handleFileInputChange} accept={acceptedFileTypes?.join(\",\")} />\r\n </motion.div>\r\n ) : status === \"uploading\" ? (\r\n <motion.div key=\"uploading\" initial={{ opacity: 0, scale: 0.95 }} animate={{ opacity: 1, scale: 1 }} exit={{ opacity: 0, scale: 0.95 }} className=\"absolute inset-0 flex flex-col items-center justify-center p-6\">\r\n <div className=\"mb-4\"><UploadingAnimation progress={progress} /></div>\r\n <div className=\"text-center space-y-1.5 mb-4\">\r\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white truncate\">{file?.name}</h3>\r\n <div className=\"flex items-center justify-center gap-2 text-xs\">\r\n <span className=\"text-gray-500 dark:text-gray-400\">{formatBytes(file?.size || 0)}</span>\r\n <span className=\"font-medium text-blue-500\">{Math.round(progress)}%</span>\r\n </div>\r\n </div>\r\n <button onClick={resetState} type=\"button\" className=\"w-4/5 flex items-center justify-center gap-2 rounded-lg bg-gray-100 dark:bg-white/10 px-4 py-2.5 text-sm font-semibold text-gray-900 dark:text-white transition-all duration-200 hover:bg-gray-200 dark:hover:bg-white/20\">Cancel</button>\r\n </motion.div>\r\n ) : null}\r\n </AnimatePresence>\r\n </div>\r\n <AnimatePresence>\r\n {error && (\r\n <motion.div initial={{ opacity: 0, y: 10 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -10 }} className=\"absolute bottom-4 left-1/2 transform -translate-x-1/2 px-4 py-2 bg-red-500/10 border border-red-500/20 rounded-lg\">\r\n <p className=\"text-sm text-red-500 dark:text-red-400\">{error.message}</p>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport { FileUpload };\r\nexport default FileUpload;\r\n","export * from 'framer-motion';\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 13v8', key: '1l5pq0' }],\n ['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' }],\n ['path', { d: 'm8 17 4-4 4 4', key: '1quai1' }],\n];\n\n/**\n * @component @name CloudUpload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMTN2OCIgLz4KICA8cGF0aCBkPSJNNCAxNC44OTlBNyA3IDAgMSAxIDE1LjcxIDhoMS43OWE0LjUgNC41IDAgMCAxIDIuNSA4LjI0MiIgLz4KICA8cGF0aCBkPSJtOCAxNyA0LTQgNCA0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/cloud-upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CloudUpload = createLucideIcon('cloud-upload', __iconNode);\n\nexport default CloudUpload;\n","import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n"]}
@@ -0,0 +1,16 @@
1
+ import {forwardRef,createElement,useState,useRef,useEffect,useCallback}from'react';import*as Ca from'framer-motion';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs}from'react/jsx-runtime';var ea=Object.defineProperty;var ta=Object.getOwnPropertyDescriptor;var ua=Object.getOwnPropertyNames;var oa=Object.prototype.hasOwnProperty;var G=(a,e,o,d)=>{if(e&&typeof e=="object"||typeof e=="function")for(let f of ua(e))!oa.call(a,f)&&f!==o&&ea(a,f,{get:()=>e[f],enumerable:!(d=ta(e,f))||d.enumerable});return a},E=(a,e,o)=>(G(a,e,"default"),o);var i={};E(i,Ca);var W=a=>a.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),da=a=>a.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,o,d)=>d?d.toUpperCase():o.toLowerCase()),M=a=>{let e=da(a);return e.charAt(0).toUpperCase()+e.slice(1)},P=(...a)=>a.filter((e,o,d)=>!!e&&e.trim()!==""&&d.indexOf(e)===o).join(" ").trim(),V=a=>{for(let e in a)if(e.startsWith("aria-")||e==="role"||e==="title")return true};var z={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var N=forwardRef(({color:a="currentColor",size:e=24,strokeWidth:o=2,absoluteStrokeWidth:d,className:f="",children:s,iconNode:g,...x},B)=>createElement("svg",{ref:B,...z,width:e,height:e,stroke:a,strokeWidth:d?Number(o)*24/Number(e):o,className:P("lucide",f),...!s&&!V(x)&&{"aria-hidden":"true"},...x},[...g.map(([S,C])=>createElement(S,C)),...Array.isArray(s)?s:[s]]));var K=(a,e)=>{let o=forwardRef(({className:d,...f},s)=>createElement(N,{ref:s,iconNode:e,className:P(`lucide-${W(M(a))}`,`lucide-${a}`,d),...f}));return o.displayName=M(a),o};var sa=[["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"}]],L=K("cloud-upload",sa);function R(...a){return twMerge(clsx(a))}var pa=5*1024*1024,Q=5,T=["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"],y=(a,e=2)=>{if(!+a)return "0 Bytes";let o=1024,d=e<0?0:e,f=Math.floor(Math.log(a)/Math.log(o)),s=T[f]||T[T.length-1];return `${Number.parseFloat((a/o**f).toFixed(d))} ${s}`},ma=()=>jsx("div",{className:"relative w-16 h-16",children:jsxs("svg",{viewBox:"0 0 100 100",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"w-full h-full",children:[jsx("circle",{cx:"50",cy:"50",r:"45",className:"stroke-gray-200 dark:stroke-gray-700",strokeWidth:"2",strokeDasharray:"4 4",children:jsx("animateTransform",{attributeName:"transform",type:"rotate",from:"0 50 50",to:"360 50 50",dur:"60s",repeatCount:"indefinite"})}),jsx("path",{d:"M30 35H70C75 35 75 40 75 40V65C75 70 70 70 70 70H30C25 70 25 65 25 65V40C25 35 30 35 30 35Z",className:"fill-blue-100 dark:fill-blue-900/30 stroke-blue-500 dark:stroke-blue-400",strokeWidth:"2"}),jsxs("g",{className:"transform translate-y-2",children:[jsx("line",{x1:"50",y1:"45",x2:"50",y2:"60",className:"stroke-blue-500 dark:stroke-blue-400",strokeWidth:"2",strokeLinecap:"round"}),jsx("polyline",{points:"42,52 50,45 58,52",className:"stroke-blue-500 dark:stroke-blue-400",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",fill:"none"})]})]})}),La=({progress:a})=>jsxs("div",{className:"relative w-16 h-16",children:[jsxs("svg",{viewBox:"0 0 100 100",className:"w-full h-full",children:[jsx("circle",{cx:"50",cy:"50",r:"40",className:"stroke-gray-200 dark:stroke-gray-700",strokeWidth:"8",fill:"none"}),jsx("circle",{cx:"50",cy:"50",r:"40",className:"stroke-blue-500",strokeWidth:"8",fill:"none",strokeLinecap:"round",strokeDasharray:`${a/100*251.2} 251.2`,transform:"rotate(-90 50 50)"})]}),jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:jsxs("span",{className:"text-sm font-medium text-blue-500",children:[Math.round(a),"%"]})})]});function Ia({onUploadSuccess:a=()=>{},onUploadError:e=()=>{},acceptedFileTypes:o=[],maxFileSize:d=pa,currentFile:f=null,onFileRemove:s=()=>{},uploadDelay:g=2e3,validateFile:x=()=>null,className:B}){let[S,C]=useState(f),[n,p]=useState("idle"),[q,h]=useState(0),[D,F]=useState(null),b=useRef(null),m=useRef(null);useEffect(()=>()=>{m.current&&clearInterval(m.current);},[]);let U=useCallback(t=>t.size>d?{message:`File size exceeds ${y(d)}`,code:"FILE_TOO_LARGE"}:null,[d]),v=useCallback(t=>{if(!o?.length)return null;let l=t.type.toLowerCase();return o.some(I=>l.match(I.toLowerCase()))?null:{message:`File type must be ${o.join(", ")}`,code:"INVALID_FILE_TYPE"}},[o]),k=useCallback(t=>{F(t),p("error"),e?.(t),setTimeout(()=>{F(null),p("idle");},3e3);},[e]),H=useCallback(t=>{let l=0;m.current&&clearInterval(m.current),m.current=setInterval(()=>{l+=Q,l>=100?(m.current&&clearInterval(m.current),h(0),p("idle"),C(null),a?.(t)):p(I=>I==="uploading"?(h(l),"uploading"):(m.current&&clearInterval(m.current),I));},g/(100/Q));},[a,g]),w=useCallback(t=>{if(!t)return;F(null);let l=U(t);if(l){k(l);return}let I=v(t);if(I){k(I);return}let O=x?.(t);if(O){k(O);return}C(t),p("uploading"),h(0),H(t);},[H,U,v,x,k]),J=useCallback(t=>{t.preventDefault(),t.stopPropagation(),p(l=>l!=="uploading"?"dragging":l);},[]),j=useCallback(t=>{t.preventDefault(),t.stopPropagation(),p(l=>l==="dragging"?"idle":l);},[]),Y=useCallback(t=>{if(t.preventDefault(),t.stopPropagation(),n==="uploading")return;p("idle");let l=t.dataTransfer.files?.[0];l&&w(l);},[n,w]),_=useCallback(t=>{let l=t.target.files?.[0];w(l||null),t.target&&(t.target.value="");},[w]),$=useCallback(()=>{n!=="uploading"&&b.current?.click();},[n]),aa=useCallback(()=>{C(null),p("idle"),h(0),s&&s();},[s]);return jsx("div",{className:R("relative w-full max-w-sm mx-auto",B),children:jsx("div",{className:"group relative w-full rounded-xl bg-gray-900 dark:bg-black ring-1 ring-gray-200 dark:ring-white/10 p-0.5",children:jsx("div",{className:"relative w-full rounded-[10px] bg-gray-50/50 dark:bg-white/[0.02] p-1.5",children:jsxs("div",{className:R("relative mx-auto w-full overflow-hidden rounded-lg border border-gray-100 dark:border-white/[0.08] bg-gray-900 dark:bg-black/50",D?"border-red-500/50":""),children:[jsx("div",{className:"relative h-[240px]",children:jsx(i.AnimatePresence,{mode:"wait",children:n==="idle"||n==="dragging"?jsxs(i.motion.div,{initial:{opacity:0,y:10},animate:{opacity:n==="dragging"?.8:1,y:0,scale:n==="dragging"?.98:1},exit:{opacity:0,y:-10},transition:{duration:.2},className:"absolute inset-0 flex flex-col items-center justify-center p-6",onDragOver:J,onDragLeave:j,onDrop:Y,children:[jsx("div",{className:"mb-4",children:jsx(ma,{})}),jsxs("div",{className:"text-center space-y-1.5 mb-4",children:[jsx("h3",{className:"text-lg font-semibold text-white dark:text-white tracking-tight",children:"Drag and drop or"}),jsxs("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:[o?.length?`${o.map(t=>t.split("/")[1]).join(", ").toUpperCase()}`:"SVG, PNG, JPG or GIF"," ",d&&`up to ${y(d)}`]})]}),jsxs("button",{type:"button",onClick:$,className:"w-4/5 flex items-center justify-center gap-2 rounded-lg bg-gray-800 dark:bg-white/10 px-4 py-2.5 text-sm font-semibold text-white dark:text-white transition-all duration-200 hover:bg-gray-700 dark:hover:bg-white/20 group",children:[jsx("span",{children:"Upload File"}),jsx(L,{className:"w-4 h-4 group-hover:scale-110 transition-transform duration-200"})]}),jsx("p",{className:"mt-3 text-xs text-gray-500 dark:text-gray-400",children:"or drag and drop your file here"}),jsx("input",{ref:b,type:"file",className:"sr-only",onChange:_,accept:o?.join(",")})]},"dropzone"):n==="uploading"?jsxs(i.motion.div,{initial:{opacity:0,scale:.95},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.95},className:"absolute inset-0 flex flex-col items-center justify-center p-6",children:[jsx("div",{className:"mb-4",children:jsx(La,{progress:q})}),jsxs("div",{className:"text-center space-y-1.5 mb-4",children:[jsx("h3",{className:"text-sm font-semibold text-gray-900 dark:text-white truncate",children:S?.name}),jsxs("div",{className:"flex items-center justify-center gap-2 text-xs",children:[jsx("span",{className:"text-gray-500 dark:text-gray-400",children:y(S?.size||0)}),jsxs("span",{className:"font-medium text-blue-500",children:[Math.round(q),"%"]})]})]}),jsx("button",{onClick:aa,type:"button",className:"w-4/5 flex items-center justify-center gap-2 rounded-lg bg-gray-100 dark:bg-white/10 px-4 py-2.5 text-sm font-semibold text-gray-900 dark:text-white transition-all duration-200 hover:bg-gray-200 dark:hover:bg-white/20",children:"Cancel"})]},"uploading"):null})}),jsx(i.AnimatePresence,{children:D&&jsx(i.motion.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},className:"absolute bottom-4 left-1/2 transform -translate-x-1/2 px-4 py-2 bg-red-500/10 border border-red-500/20 rounded-lg",children:jsx("p",{className:"text-sm text-red-500 dark:text-red-400",children:D.message})})})]})})})})}var Ea=Ia;/*! Bundled license information:
2
+
3
+ lucide-react/dist/esm/shared/src/utils.js:
4
+ lucide-react/dist/esm/defaultAttributes.js:
5
+ lucide-react/dist/esm/Icon.js:
6
+ lucide-react/dist/esm/createLucideIcon.js:
7
+ lucide-react/dist/esm/icons/cloud-upload.js:
8
+ lucide-react/dist/esm/lucide-react.js:
9
+ (**
10
+ * @license lucide-react v0.545.0 - ISC
11
+ *
12
+ * This source code is licensed under the ISC license.
13
+ * See the LICENSE file in the root directory of this source tree.
14
+ *)
15
+ */export{Ia as FileUpload,Ea as default};//# sourceMappingURL=index.mjs.map
16
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/file-upload/index.tsx","../../../../node_modules/motion/dist/es/react.mjs","../../../../node_modules/shared/src/utils.ts","../../../../node_modules/lucide-react/src/defaultAttributes.ts","../../../../node_modules/lucide-react/src/Icon.ts","../../../../node_modules/lucide-react/src/createLucideIcon.ts","../../../../node_modules/lucide-react/src/icons/cloud-upload.ts","../../src/utils/cn.ts"],"names":["react_exports","__reExport","framer_motion_star","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","props","prop","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","CloudUpload","cn","inputs","twMerge","clsx","DEFAULT_MAX_FILE_SIZE","UPLOAD_STEP_SIZE","FILE_SIZES","formatBytes","bytes","decimals","k","dm","i","unit","UploadIllustration","jsx","jsxs","UploadingAnimation","progress","FileUpload","onUploadSuccess","onUploadError","acceptedFileTypes","maxFileSize","initialFile","onFileRemove","uploadDelay","validateFile","file","setFile","useState","status","setStatus","setProgress","error","setError","fileInputRef","useRef","uploadIntervalRef","useEffect","validateFileSize","useCallback","validateFileType","fileType","type","handleError","simulateUpload","uploadingFile","currentProgress","prevStatus","handleFileSelect","selectedFile","sizeError","typeError","customError","handleDragOver","e","prev","handleDragLeave","handleDrop","droppedFile","handleFileInputChange","triggerFileInput","resetState","file_upload_default"],"mappings":"0NAEA,IAAA,EAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,CAAA,MAAA,CAAA,wBAAA,CAAA,IAAA,EAAA,CAAA,MAAA,CAAA,mBAAA,CAAA,IAAA,EAAA,CAAA,MAAA,CAAA,SAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,CAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,UAAA,CAAA,IAAA,IAAA,CAAA,IAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,GAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CCFA,IAAAA,EAAA,EAAA,CAAAC,CAAAA,CAAAD,EAAAE,EAAAA,CAAAA,CCQO,IAAMC,CAAAA,CAAeC,GAC1BA,CAAAA,CAAO,OAAA,CAAQ,qBAAsB,OAAO,CAAA,CAAE,aAAA,CAQnCC,EAAAA,CAAiCD,CAAAA,EAC5CA,CAAAA,CAAO,QAAQ,uBAAA,CAAyB,CAACE,EAAOC,CAAAA,CAAIC,CAAAA,GAClDA,EAAKA,CAAAA,CAAG,WAAA,EAAA,CAAgBD,CAAAA,CAAG,aAC7B,CAAA,CAQWE,CAAAA,CAAkCL,CAAAA,EAAgC,CAC7E,IAAMM,CAAAA,CAAYL,EAAAA,CAAYD,CAAM,EAEpC,OAAQM,CAAAA,CAAU,OAAO,CAAC,CAAA,CAAE,aAAA,CAAgBA,CAAAA,CAAU,KAAA,CAAM,CAAC,CAC/D,CAAA,CAQaC,CAAAA,CAAe,IAA2CC,CAAAA,GACrEA,CAAAA,CACG,OAAO,CAACC,CAAAA,CAAWC,CAAAA,CAAOC,CAAAA,GAEvB,EAAQF,CAAAA,EACPA,CAAAA,CAAqB,MAAA,GAAW,EAAA,EACjCE,EAAM,OAAA,CAAQF,CAAS,CAAA,GAAMC,CAEhC,EACA,IAAA,CAAK,GAAG,CAAA,CACR,IAAA,GAgBQE,CAAAA,CAAeC,CAAAA,EAA+B,CACzD,IAAA,IAAWC,KAAQD,CAAAA,CACjB,GAAIC,EAAK,UAAA,CAAW,OAAO,GAAKA,CAAAA,GAAS,MAAA,EAAUA,CAAAA,GAAS,OAAA,CAC1D,OAAO,KAGb,CAAA,CCxEA,IAAAC,CAAAA,CAAe,CACb,KAAA,CAAO,4BAAA,CACP,KAAA,CAAO,EAAA,CACP,OAAQ,EAAA,CACR,OAAA,CAAS,YACT,IAAA,CAAM,MAAA,CACN,OAAQ,cAAA,CACR,WAAA,CAAa,CAAA,CACb,aAAA,CAAe,QACf,cAAA,CAAgB,OAClB,ECcA,IAAMC,CAAAA,CAAOC,WACX,CACE,CACE,KAAA,CAAAC,CAAAA,CAAQ,eACR,IAAA,CAAAC,CAAAA,CAAO,GACP,WAAA,CAAAC,CAAAA,CAAc,EACd,mBAAA,CAAAC,CAAAA,CACA,SAAA,CAAAZ,CAAAA,CAAY,GACZ,QAAA,CAAAa,CAAAA,CACA,SAAAC,CAAAA,CACA,GAAGC,CAAA,CAAA,CAELC,CAAAA,GAEAC,aAAAA,CACE,KAAA,CACA,CACE,GAAA,CAAAD,CAAAA,CACA,GAAGV,CAAAA,CACH,KAAA,CAAOI,EACP,MAAA,CAAQA,CAAAA,CACR,MAAA,CAAQD,CAAAA,CACR,YAAaG,CAAAA,CAAuB,MAAA,CAAOD,CAAW,CAAA,CAAI,GAAM,MAAA,CAAOD,CAAI,CAAA,CAAIC,CAAAA,CAC/E,UAAWb,CAAAA,CAAa,QAAA,CAAUE,CAAS,CAAA,CAC3C,GAAI,CAACa,CAAAA,EAAY,CAACV,CAAAA,CAAYY,CAAI,GAAK,CAAE,aAAA,CAAe,MAAA,CAAA,CACxD,GAAGA,CAAA,CAAA,CAEL,CACE,GAAGD,CAAAA,CAAS,IAAI,CAAC,CAACI,EAAKC,CAAK,CAAA,GAAMF,cAAcC,CAAAA,CAAKC,CAAK,CAAC,CAAA,CAC3D,GAAI,KAAA,CAAM,OAAA,CAAQN,CAAQ,CAAA,CAAIA,CAAAA,CAAW,CAACA,CAAQ,CAAA,CACpD,CAEN,EC7CA,IAAMO,CAAAA,CAAmB,CAACC,CAAAA,CAAkBP,CAAAA,GAAuB,CACjE,IAAMQ,CAAAA,CAAYd,UAAAA,CAAuC,CAAC,CAAE,SAAA,CAAAR,CAAAA,CAAW,GAAGI,CAAA,CAAA,CAASY,IACjFC,aAAAA,CAAcV,CAAAA,CAAM,CAClB,GAAA,CAAAS,EACA,QAAA,CAAAF,CAAAA,CACA,UAAWhB,CAAAA,CACT,CAAA,OAAA,EAAUR,EAAYM,CAAAA,CAAayB,CAAQ,CAAC,CAAC,GAC7C,CAAA,OAAA,EAAUA,CAAQ,CAAA,CAAA,CAClBrB,CAAA,EAEF,GAAGI,CAAA,CACJ,CAAA,EAGH,OAAAkB,CAAAA,CAAU,YAAc1B,CAAAA,CAAayB,CAAQ,EAEtCC,CACT,CAAA,CCzBO,IAAMC,EAAAA,CAAuB,CAClC,CAAC,MAAA,CAAQ,CAAE,CAAA,CAAG,UAAA,CAAY,IAAK,QAAA,CAAU,CAAA,CACzC,CAAC,OAAQ,CAAE,CAAA,CAAG,2DAA4D,GAAA,CAAK,QAAA,CAAU,CAAA,CACzF,CAAC,MAAA,CAAQ,CAAE,EAAG,eAAA,CAAiB,GAAA,CAAK,QAAA,CAAU,CAChD,EAaMC,CAAAA,CAAcJ,CAAAA,CAAiB,cAAA,CAAgBG,EAAU,ECjBxD,SAASE,CAAAA,CAAAA,GAAMC,EAAsB,CAC1C,OAAOC,QAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CP2BA,IAAMG,EAAAA,CAAwB,CAAA,CAAI,KAAO,IAAA,CACnCC,CAAAA,CAAmB,CAAA,CACnBC,CAAAA,CAAa,CAAC,OAAA,CAAS,IAAA,CAAM,IAAA,CAAM,IAAA,CAAM,KAAM,IAAA,CAAM,IAAA,CAAM,IAAA,CAAM,IAAI,EAErEC,CAAAA,CAAc,CAACC,EAAeC,CAAAA,CAAW,CAAA,GAAc,CACzD,GAAI,CAAC,CAACD,CAAAA,CAAO,OAAO,SAAA,CACpB,IAAME,EAAI,IAAA,CACJC,CAAAA,CAAKF,EAAW,CAAA,CAAI,CAAA,CAAIA,CAAAA,CACxBG,CAAAA,CAAI,KAAK,KAAA,CAAM,IAAA,CAAK,IAAIJ,CAAK,CAAA,CAAI,KAAK,GAAA,CAAIE,CAAC,CAAC,CAAA,CAC5CG,EAAOP,CAAAA,CAAWM,CAAC,CAAA,EAAKN,CAAAA,CAAWA,EAAW,MAAA,CAAS,CAAC,CAAA,CAC9D,OAAO,GAAG,MAAA,CAAO,UAAA,CAAA,CAAYE,EAAQE,CAAAA,EAAKE,CAAAA,EAAG,QAAQD,CAAE,CAAC,CAAC,CAAA,CAAA,EAAIE,CAAI,CAAA,CACrE,CAAA,CAEMC,GAAqB,IACvBC,GAAAA,CAAC,OAAI,SAAA,CAAU,oBAAA,CACX,QAAA,CAAAC,IAAAA,CAAC,OAAI,OAAA,CAAQ,aAAA,CAAc,KAAK,MAAA,CAAO,KAAA,CAAM,6BAA6B,SAAA,CAAU,eAAA,CAChF,QAAA,CAAA,CAAAD,GAAAA,CAAC,UAAO,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAE,IAAA,CAAK,SAAA,CAAU,sCAAA,CAAuC,WAAA,CAAY,IAAI,eAAA,CAAgB,KAAA,CAC5G,SAAAA,GAAAA,CAAC,kBAAA,CAAA,CAAiB,cAAc,WAAA,CAAY,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,UAAU,EAAA,CAAG,WAAA,CAAY,IAAI,KAAA,CAAM,WAAA,CAAY,aAAa,CAAA,CAC/H,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,6FAAA,CAA8F,SAAA,CAAU,2EAA2E,WAAA,CAAY,GAAA,CAAI,EAC3MC,IAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,yBAAA,CACT,UAAAD,GAAAA,CAAC,MAAA,CAAA,CAAK,GAAG,IAAA,CAAK,EAAA,CAAG,KAAK,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,UAAU,sCAAA,CAAuC,WAAA,CAAY,IAAI,aAAA,CAAc,OAAA,CAAQ,EAC7HA,GAAAA,CAAC,UAAA,CAAA,CAAS,MAAA,CAAO,mBAAA,CAAoB,UAAU,sCAAA,CAAuC,WAAA,CAAY,IAAI,aAAA,CAAc,OAAA,CAAQ,eAAe,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,CACnK,GACJ,CAAA,CACJ,CAAA,CAGEE,GAAqB,CAAC,CAAE,SAAAC,CAAS,CAAA,GACnCF,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,oBAAA,CACX,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,QAAQ,aAAA,CAAc,SAAA,CAAU,eAAA,CACjC,QAAA,CAAA,CAAAD,IAAC,QAAA,CAAA,CAAO,EAAA,CAAG,KAAK,EAAA,CAAG,IAAA,CAAK,EAAE,IAAA,CAAK,SAAA,CAAU,sCAAA,CAAuC,WAAA,CAAY,IAAI,IAAA,CAAK,MAAA,CAAO,EAC5GA,GAAAA,CAAC,QAAA,CAAA,CAAO,GAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,KAAK,SAAA,CAAU,iBAAA,CAAkB,YAAY,GAAA,CAAI,IAAA,CAAK,OAAO,aAAA,CAAc,OAAA,CAAQ,eAAA,CAAiB,CAAA,EAAIG,EAAW,GAAA,CAAO,KAAK,SAAU,SAAA,CAAU,mBAAA,CAAoB,GACrM,CAAA,CACAH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oDACX,QAAA,CAAAC,IAAAA,CAAC,QAAK,SAAA,CAAU,mCAAA,CAAqC,eAAK,KAAA,CAAME,CAAQ,CAAA,CAAE,GAAA,CAAA,CAAC,EAC/E,CAAA,CAAA,CACJ,CAAA,CAGJ,SAASC,EAAAA,CAAW,CAChB,gBAAAC,CAAAA,CAAkB,IAAM,CAAC,CAAA,CACzB,cAAAC,CAAAA,CAAgB,IAAM,CAAC,CAAA,CACvB,iBAAA,CAAAC,EAAoB,EAAC,CACrB,WAAA,CAAAC,CAAAA,CAAcnB,GACd,WAAA,CAAaoB,CAAAA,CAAc,IAAA,CAC3B,YAAA,CAAAC,EAAe,IAAM,CAAC,CAAA,CACtB,WAAA,CAAAC,EAAc,GAAA,CACd,YAAA,CAAAC,EAAe,IAAM,IAAA,CACrB,UAAApD,CACJ,CAAA,CAAoB,CAChB,GAAM,CAACqD,CAAAA,CAAMC,CAAO,EAAIC,QAAAA,CAAsBN,CAAW,EACnD,CAACO,CAAAA,CAAQC,CAAS,CAAA,CAAIF,SAAqB,MAAM,CAAA,CACjD,CAACZ,CAAAA,CAAUe,CAAW,EAAIH,QAAAA,CAAS,CAAC,CAAA,CACpC,CAACI,EAAOC,CAAQ,CAAA,CAAIL,SAA2B,IAAI,CAAA,CACnDM,EAAeC,MAAAA,CAAyB,IAAI,CAAA,CAC5CC,CAAAA,CAAoBD,OAA8B,IAAI,CAAA,CAE5DE,UAAU,IACC,IAAM,CACLD,CAAAA,CAAkB,OAAA,EAAS,aAAA,CAAcA,CAAAA,CAAkB,OAAO,EAC1E,CAAA,CACD,EAAE,CAAA,CAEL,IAAME,CAAAA,CAAmBC,WAAAA,CAAab,CAAAA,EAC9BA,CAAAA,CAAK,KAAOL,CAAAA,CACL,CAAE,QAAS,CAAA,kBAAA,EAAqBhB,CAAAA,CAAYgB,CAAW,CAAC,CAAA,CAAA,CAAI,IAAA,CAAM,gBAAiB,EAEvF,IAAA,CACR,CAACA,CAAW,CAAC,EAEVmB,CAAAA,CAAmBD,WAAAA,CAAab,CAAAA,EAAiC,CACnE,GAAI,CAACN,CAAAA,EAAmB,OAAQ,OAAO,IAAA,CACvC,IAAMqB,CAAAA,CAAWf,CAAAA,CAAK,IAAA,CAAK,WAAA,GAC3B,OAAKN,CAAAA,CAAkB,KAAMsB,CAAAA,EAASD,CAAAA,CAAS,MAAMC,CAAAA,CAAK,WAAA,EAAa,CAAC,EAGjE,IAAA,CAFI,CAAE,QAAS,CAAA,kBAAA,EAAqBtB,CAAAA,CAAkB,KAAK,IAAI,CAAC,CAAA,CAAA,CAAI,IAAA,CAAM,mBAAoB,CAGzG,CAAA,CAAG,CAACA,CAAiB,CAAC,CAAA,CAEhBuB,CAAAA,CAAcJ,WAAAA,CAAaP,CAAAA,EAAqB,CAClDC,CAAAA,CAASD,CAAK,EACdF,CAAAA,CAAU,OAAO,EACjBX,CAAAA,GAAgBa,CAAK,CAAA,CACrB,UAAA,CAAW,IAAM,CAAEC,CAAAA,CAAS,IAAI,CAAA,CAAGH,CAAAA,CAAU,MAAM,EAAG,CAAA,CAAG,GAAI,EACjE,EAAG,CAACX,CAAa,CAAC,CAAA,CAEZyB,CAAAA,CAAiBL,YAAaM,CAAAA,EAAwB,CACxD,IAAIC,CAAAA,CAAkB,EAClBV,CAAAA,CAAkB,OAAA,EAAS,aAAA,CAAcA,CAAAA,CAAkB,OAAO,CAAA,CACtEA,CAAAA,CAAkB,OAAA,CAAU,WAAA,CAAY,IAAM,CAC1CU,CAAAA,EAAmB3C,EACf2C,CAAAA,EAAmB,GAAA,EACfV,EAAkB,OAAA,EAAS,aAAA,CAAcA,CAAAA,CAAkB,OAAO,EACtEL,CAAAA,CAAY,CAAC,EACbD,CAAAA,CAAU,MAAM,EAChBH,CAAAA,CAAQ,IAAI,CAAA,CACZT,CAAAA,GAAkB2B,CAAa,CAAA,EAE/Bf,CAAAA,CAAWiB,GACHA,CAAAA,GAAe,WAAA,EAAehB,EAAYe,CAAe,CAAA,CAAU,WAAA,GACnEV,CAAAA,CAAkB,SAAS,aAAA,CAAcA,CAAAA,CAAkB,OAAO,CAAA,CAC/DW,CAAAA,CACV,EAET,CAAA,CAAGvB,CAAAA,EAAe,GAAA,CAAMrB,CAAAA,CAAiB,EAC7C,CAAA,CAAG,CAACe,EAAiBM,CAAW,CAAC,EAE3BwB,CAAAA,CAAmBT,WAAAA,CAAaU,CAAAA,EAA8B,CAChE,GAAI,CAACA,CAAAA,CAAc,OACnBhB,CAAAA,CAAS,IAAI,EACb,IAAMiB,CAAAA,CAAYZ,CAAAA,CAAiBW,CAAY,EAC/C,GAAIC,CAAAA,CAAW,CAAEP,CAAAA,CAAYO,CAAS,EAAG,MAAQ,CACjD,IAAMC,CAAAA,CAAYX,EAAiBS,CAAY,CAAA,CAC/C,GAAIE,CAAAA,CAAW,CAAER,CAAAA,CAAYQ,CAAS,CAAA,CAAG,MAAQ,CACjD,IAAMC,CAAAA,CAAc3B,IAAewB,CAAY,CAAA,CAC/C,GAAIG,CAAAA,CAAa,CAAET,CAAAA,CAAYS,CAAW,EAAG,MAAQ,CACrDzB,EAAQsB,CAAY,CAAA,CACpBnB,EAAU,WAAW,CAAA,CACrBC,CAAAA,CAAY,CAAC,EACba,CAAAA,CAAeK,CAAY,EAC/B,CAAA,CAAG,CAACL,EAAgBN,CAAAA,CAAkBE,CAAAA,CAAkBf,CAAAA,CAAckB,CAAW,CAAC,CAAA,CAE5EU,CAAAA,CAAiBd,YAAae,CAAAA,EAAiC,CACjEA,EAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,eAAA,GACFxB,CAAAA,CAAWyB,CAAAA,EAAUA,IAAS,WAAA,CAAc,UAAA,CAAaA,CAAK,EAClE,CAAA,CAAG,EAAE,EAECC,CAAAA,CAAkBjB,WAAAA,CAAae,GAAiC,CAClEA,CAAAA,CAAE,gBAAe,CACjBA,CAAAA,CAAE,eAAA,EAAgB,CAClBxB,EAAWyB,CAAAA,EAAUA,CAAAA,GAAS,WAAa,MAAA,CAASA,CAAK,EAC7D,CAAA,CAAG,EAAE,CAAA,CAECE,EAAalB,WAAAA,CAAae,CAAAA,EAAiC,CAG7D,GAFAA,EAAE,cAAA,EAAe,CACjBA,CAAAA,CAAE,eAAA,GACEzB,CAAAA,GAAW,WAAA,CAAa,OAC5BC,CAAAA,CAAU,MAAM,EAChB,IAAM4B,CAAAA,CAAcJ,CAAAA,CAAE,YAAA,CAAa,QAAQ,CAAC,CAAA,CACxCI,GAAaV,CAAAA,CAAiBU,CAAW,EACjD,CAAA,CAAG,CAAC7B,CAAAA,CAAQmB,CAAgB,CAAC,CAAA,CAEvBW,CAAAA,CAAwBpB,YAAae,CAAAA,EAA2C,CAClF,IAAML,CAAAA,CAAeK,CAAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,CACvCN,CAAAA,CAAiBC,GAAgB,IAAI,CAAA,CACjCK,EAAE,MAAA,GAAQA,CAAAA,CAAE,MAAA,CAAO,KAAA,CAAQ,IACnC,CAAA,CAAG,CAACN,CAAgB,CAAC,CAAA,CAEfY,EAAmBrB,WAAAA,CAAY,IAAM,CACnCV,CAAAA,GAAW,aACfK,CAAAA,CAAa,OAAA,EAAS,QAC1B,CAAA,CAAG,CAACL,CAAM,CAAC,CAAA,CAELgC,EAAAA,CAAatB,YAAY,IAAM,CACjCZ,EAAQ,IAAI,CAAA,CACZG,EAAU,MAAM,CAAA,CAChBC,CAAAA,CAAY,CAAC,EACTR,CAAAA,EAAcA,CAAAA,GACtB,CAAA,CAAG,CAACA,CAAY,CAAC,CAAA,CAEjB,OACIV,IAAC,KAAA,CAAA,CAAI,SAAA,CAAWf,EAAG,kCAAA,CAAoCzB,CAAS,EAC5D,QAAA,CAAAwC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2GACX,QAAA,CAAAA,GAAAA,CAAC,OAAI,SAAA,CAAU,yEAAA,CACX,SAAAC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWhB,CAAAA,CAAG,kIAAmIkC,CAAAA,CAAQ,mBAAA,CAAsB,EAAE,CAAA,CAClL,QAAA,CAAA,CAAAnB,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oBAAA,CACX,QAAA,CAAAA,IAAC,CAAA,CAAA,eAAA,CAAA,CAAgB,IAAA,CAAK,OACjB,QAAA,CAAAgB,CAAAA,GAAW,QAAUA,CAAAA,GAAW,UAAA,CAC7Bf,IAAAA,CAAC,CAAA,CAAA,MAAA,CAAO,IAAP,CAA0B,OAAA,CAAS,CAAE,OAAA,CAAS,CAAA,CAAG,EAAG,EAAG,CAAA,CAAG,OAAA,CAAS,CAAE,QAASe,CAAAA,GAAW,UAAA,CAAa,GAAM,CAAA,CAAG,CAAA,CAAG,EAAG,KAAA,CAAOA,CAAAA,GAAW,UAAA,CAAa,GAAA,CAAO,CAAE,CAAA,CAAG,IAAA,CAAM,CAAE,OAAA,CAAS,CAAA,CAAG,EAAG,GAAI,CAAA,CAAG,UAAA,CAAY,CAAE,SAAU,EAAI,CAAA,CAAG,SAAA,CAAU,gEAAA,CAAiE,WAAYwB,CAAAA,CAAgB,WAAA,CAAaG,CAAAA,CAAiB,MAAA,CAAQC,EACvW,QAAA,CAAA,CAAA5C,GAAAA,CAAC,OAAI,SAAA,CAAU,MAAA,CAAO,SAAAA,GAAAA,CAACD,EAAAA,CAAA,EAAmB,CAAA,CAAE,EAC5CE,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,8BAAA,CACX,QAAA,CAAA,CAAAD,IAAC,IAAA,CAAA,CAAG,SAAA,CAAU,iEAAA,CAAkE,QAAA,CAAA,kBAAA,CAAgB,EAChGC,IAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,0CAAA,CAA4C,QAAA,CAAA,CAAAM,GAAmB,MAAA,CAAS,CAAA,EAAGA,CAAAA,CAAkB,GAAA,CAAK,GAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,aAAa,CAAA,CAAA,CAAK,uBAAuB,GAAA,CAAEC,CAAAA,EAAe,SAAShB,CAAAA,CAAYgB,CAAW,CAAC,CAAA,CAAA,CAAA,CAAG,GACnP,CAAA,CACAP,IAAAA,CAAC,UAAO,IAAA,CAAK,QAAA,CAAS,QAAS8C,CAAAA,CAAkB,SAAA,CAAU,8NAAA,CACvD,QAAA,CAAA,CAAA/C,IAAC,MAAA,CAAA,CAAK,QAAA,CAAA,aAAA,CAAW,EACjBA,GAAAA,CAAChB,CAAAA,CAAA,CAAY,SAAA,CAAU,iEAAA,CAAkE,CAAA,CAAA,CAC7F,CAAA,CACAgB,IAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+CAAA,CAAgD,QAAA,CAAA,iCAAA,CAA+B,EAC5FA,GAAAA,CAAC,OAAA,CAAA,CAAM,GAAA,CAAKqB,CAAAA,CAAc,KAAK,MAAA,CAAO,SAAA,CAAU,UAAU,QAAA,CAAUyB,CAAAA,CAAuB,OAAQvC,CAAAA,EAAmB,IAAA,CAAK,GAAG,CAAA,CAAG,IAXrH,UAYhB,CAAA,CACAS,IAAW,WAAA,CACXf,IAAAA,CAAC,SAAO,GAAA,CAAP,CAA2B,OAAA,CAAS,CAAE,QAAS,CAAA,CAAG,KAAA,CAAO,GAAK,CAAA,CAAG,OAAA,CAAS,CAAE,OAAA,CAAS,CAAA,CAAG,KAAA,CAAO,CAAE,EAAG,IAAA,CAAM,CAAE,QAAS,CAAA,CAAG,KAAA,CAAO,GAAK,CAAA,CAAG,SAAA,CAAU,gEAAA,CAC9I,QAAA,CAAA,CAAAD,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,OAAO,QAAA,CAAAA,GAAAA,CAACE,GAAA,CAAmB,QAAA,CAAUC,CAAAA,CAAU,CAAA,CAAE,EAChEF,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,8BAAA,CACX,QAAA,CAAA,CAAAD,IAAC,IAAA,CAAA,CAAG,SAAA,CAAU,8DAAA,CAAgE,QAAA,CAAAa,GAAM,IAAA,CAAK,CAAA,CACzFZ,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iDACX,QAAA,CAAA,CAAAD,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mCAAoC,QAAA,CAAAR,CAAAA,CAAYqB,CAAAA,EAAM,IAAA,EAAQ,CAAC,CAAA,CAAE,CAAA,CACjFZ,IAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,2BAAA,CAA6B,QAAA,CAAA,CAAA,IAAA,CAAK,MAAME,CAAQ,CAAA,CAAE,KAAC,CAAA,CAAA,CACvE,CAAA,CAAA,CACJ,CAAA,CACAH,GAAAA,CAAC,UAAO,OAAA,CAASgD,EAAAA,CAAY,KAAK,QAAA,CAAS,SAAA,CAAU,4NAA4N,QAAA,CAAA,QAAA,CAAM,CAAA,CAAA,CAAA,CAT3Q,WAUhB,CAAA,CACA,KACR,CAAA,CACJ,CAAA,CACAhD,IAAC,CAAA,CAAA,eAAA,CAAA,CACI,QAAA,CAAAmB,GACGnB,GAAAA,CAAC,CAAA,CAAA,MAAA,CAAO,GAAA,CAAP,CAAW,QAAS,CAAE,OAAA,CAAS,EAAG,CAAA,CAAG,EAAG,EAAG,OAAA,CAAS,CAAE,OAAA,CAAS,CAAA,CAAG,EAAG,CAAE,CAAA,CAAG,KAAM,CAAE,OAAA,CAAS,EAAG,CAAA,CAAG,GAAI,CAAA,CAAG,SAAA,CAAU,oHAC/G,QAAA,CAAAA,GAAAA,CAAC,KAAE,SAAA,CAAU,wCAAA,CAA0C,SAAAmB,CAAAA,CAAM,OAAA,CAAQ,CAAA,CACzE,CAAA,CAER,GACJ,CAAA,CACJ,CAAA,CACJ,EACJ,CAER,KAGO8B,EAAAA,CAAQ7C","file":"index.mjs","sourcesContent":["\"use client\";\r\n\r\nimport {\r\n useState,\r\n useRef,\r\n useCallback,\r\n type DragEvent,\r\n useEffect,\r\n} from \"react\";\r\nimport { motion, AnimatePresence } from \"motion/react\";\r\nimport { UploadCloud } from \"lucide-react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ntype FileStatus = \"idle\" | \"dragging\" | \"uploading\" | \"error\";\r\n\r\ninterface FileError {\r\n message: string;\r\n code: string;\r\n}\r\n\r\ninterface FileUploadProps {\r\n onUploadSuccess?: (file: File) => void;\r\n onUploadError?: (error: FileError) => void;\r\n acceptedFileTypes?: string[];\r\n maxFileSize?: number;\r\n currentFile?: File | null;\r\n onFileRemove?: () => void;\r\n uploadDelay?: number;\r\n validateFile?: (file: File) => FileError | null;\r\n className?: string;\r\n}\r\n\r\nconst DEFAULT_MAX_FILE_SIZE = 5 * 1024 * 1024;\r\nconst UPLOAD_STEP_SIZE = 5;\r\nconst FILE_SIZES = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"] as const;\r\n\r\nconst formatBytes = (bytes: number, decimals = 2): string => {\r\n if (!+bytes) return \"0 Bytes\";\r\n const k = 1024;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n const unit = FILE_SIZES[i] || FILE_SIZES[FILE_SIZES.length - 1];\r\n return `${Number.parseFloat((bytes / k ** i).toFixed(dm))} ${unit}`;\r\n};\r\n\r\nconst UploadIllustration = () => (\r\n <div className=\"relative w-16 h-16\">\r\n <svg viewBox=\"0 0 100 100\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" className=\"w-full h-full\">\r\n <circle cx=\"50\" cy=\"50\" r=\"45\" className=\"stroke-gray-200 dark:stroke-gray-700\" strokeWidth=\"2\" strokeDasharray=\"4 4\">\r\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 50 50\" to=\"360 50 50\" dur=\"60s\" repeatCount=\"indefinite\" />\r\n </circle>\r\n <path d=\"M30 35H70C75 35 75 40 75 40V65C75 70 70 70 70 70H30C25 70 25 65 25 65V40C25 35 30 35 30 35Z\" className=\"fill-blue-100 dark:fill-blue-900/30 stroke-blue-500 dark:stroke-blue-400\" strokeWidth=\"2\" />\r\n <g className=\"transform translate-y-2\">\r\n <line x1=\"50\" y1=\"45\" x2=\"50\" y2=\"60\" className=\"stroke-blue-500 dark:stroke-blue-400\" strokeWidth=\"2\" strokeLinecap=\"round\" />\r\n <polyline points=\"42,52 50,45 58,52\" className=\"stroke-blue-500 dark:stroke-blue-400\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" />\r\n </g>\r\n </svg>\r\n </div>\r\n);\r\n\r\nconst UploadingAnimation = ({ progress }: { progress: number }) => (\r\n <div className=\"relative w-16 h-16\">\r\n <svg viewBox=\"0 0 100 100\" className=\"w-full h-full\">\r\n <circle cx=\"50\" cy=\"50\" r=\"40\" className=\"stroke-gray-200 dark:stroke-gray-700\" strokeWidth=\"8\" fill=\"none\" />\r\n <circle cx=\"50\" cy=\"50\" r=\"40\" className=\"stroke-blue-500\" strokeWidth=\"8\" fill=\"none\" strokeLinecap=\"round\" strokeDasharray={`${(progress / 100) * 251.2} 251.2`} transform=\"rotate(-90 50 50)\" />\r\n </svg>\r\n <div className=\"absolute inset-0 flex items-center justify-center\">\r\n <span className=\"text-sm font-medium text-blue-500\">{Math.round(progress)}%</span>\r\n </div>\r\n </div>\r\n);\r\n\r\nfunction FileUpload({\r\n onUploadSuccess = () => {},\r\n onUploadError = () => {},\r\n acceptedFileTypes = [],\r\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\r\n currentFile: initialFile = null,\r\n onFileRemove = () => {},\r\n uploadDelay = 2000,\r\n validateFile = () => null,\r\n className,\r\n}: FileUploadProps) {\r\n const [file, setFile] = useState<File | null>(initialFile);\r\n const [status, setStatus] = useState<FileStatus>(\"idle\");\r\n const [progress, setProgress] = useState(0);\r\n const [error, setError] = useState<FileError | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const uploadIntervalRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (uploadIntervalRef.current) clearInterval(uploadIntervalRef.current);\r\n };\r\n }, []);\r\n\r\n const validateFileSize = useCallback((file: File): FileError | null => {\r\n if (file.size > maxFileSize) {\r\n return { message: `File size exceeds ${formatBytes(maxFileSize)}`, code: \"FILE_TOO_LARGE\" };\r\n }\r\n return null;\r\n }, [maxFileSize]);\r\n\r\n const validateFileType = useCallback((file: File): FileError | null => {\r\n if (!acceptedFileTypes?.length) return null;\r\n const fileType = file.type.toLowerCase();\r\n if (!acceptedFileTypes.some((type) => fileType.match(type.toLowerCase()))) {\r\n return { message: `File type must be ${acceptedFileTypes.join(\", \")}`, code: \"INVALID_FILE_TYPE\" };\r\n }\r\n return null;\r\n }, [acceptedFileTypes]);\r\n\r\n const handleError = useCallback((error: FileError) => {\r\n setError(error);\r\n setStatus(\"error\");\r\n onUploadError?.(error);\r\n setTimeout(() => { setError(null); setStatus(\"idle\"); }, 3000);\r\n }, [onUploadError]);\r\n\r\n const simulateUpload = useCallback((uploadingFile: File) => {\r\n let currentProgress = 0;\r\n if (uploadIntervalRef.current) clearInterval(uploadIntervalRef.current);\r\n uploadIntervalRef.current = setInterval(() => {\r\n currentProgress += UPLOAD_STEP_SIZE;\r\n if (currentProgress >= 100) {\r\n if (uploadIntervalRef.current) clearInterval(uploadIntervalRef.current);\r\n setProgress(0);\r\n setStatus(\"idle\");\r\n setFile(null);\r\n onUploadSuccess?.(uploadingFile);\r\n } else {\r\n setStatus((prevStatus) => {\r\n if (prevStatus === \"uploading\") { setProgress(currentProgress); return \"uploading\"; }\r\n if (uploadIntervalRef.current) clearInterval(uploadIntervalRef.current);\r\n return prevStatus;\r\n });\r\n }\r\n }, uploadDelay / (100 / UPLOAD_STEP_SIZE));\r\n }, [onUploadSuccess, uploadDelay]);\r\n\r\n const handleFileSelect = useCallback((selectedFile: File | null) => {\r\n if (!selectedFile) return;\r\n setError(null);\r\n const sizeError = validateFileSize(selectedFile);\r\n if (sizeError) { handleError(sizeError); return; }\r\n const typeError = validateFileType(selectedFile);\r\n if (typeError) { handleError(typeError); return; }\r\n const customError = validateFile?.(selectedFile);\r\n if (customError) { handleError(customError); return; }\r\n setFile(selectedFile);\r\n setStatus(\"uploading\");\r\n setProgress(0);\r\n simulateUpload(selectedFile);\r\n }, [simulateUpload, validateFileSize, validateFileType, validateFile, handleError]);\r\n\r\n const handleDragOver = useCallback((e: DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setStatus((prev) => (prev !== \"uploading\" ? \"dragging\" : prev));\r\n }, []);\r\n\r\n const handleDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setStatus((prev) => (prev === \"dragging\" ? \"idle\" : prev));\r\n }, []);\r\n\r\n const handleDrop = useCallback((e: DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (status === \"uploading\") return;\r\n setStatus(\"idle\");\r\n const droppedFile = e.dataTransfer.files?.[0];\r\n if (droppedFile) handleFileSelect(droppedFile);\r\n }, [status, handleFileSelect]);\r\n\r\n const handleFileInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const selectedFile = e.target.files?.[0];\r\n handleFileSelect(selectedFile || null);\r\n if (e.target) e.target.value = \"\";\r\n }, [handleFileSelect]);\r\n\r\n const triggerFileInput = useCallback(() => {\r\n if (status === \"uploading\") return;\r\n fileInputRef.current?.click();\r\n }, [status]);\r\n\r\n const resetState = useCallback(() => {\r\n setFile(null);\r\n setStatus(\"idle\");\r\n setProgress(0);\r\n if (onFileRemove) onFileRemove();\r\n }, [onFileRemove]);\r\n\r\n return (\r\n <div className={cn(\"relative w-full max-w-sm mx-auto\", className)}>\r\n <div className=\"group relative w-full rounded-xl bg-gray-900 dark:bg-black ring-1 ring-gray-200 dark:ring-white/10 p-0.5\">\r\n <div className=\"relative w-full rounded-[10px] bg-gray-50/50 dark:bg-white/[0.02] p-1.5\">\r\n <div className={cn(\"relative mx-auto w-full overflow-hidden rounded-lg border border-gray-100 dark:border-white/[0.08] bg-gray-900 dark:bg-black/50\", error ? \"border-red-500/50\" : \"\")}>\r\n <div className=\"relative h-[240px]\">\r\n <AnimatePresence mode=\"wait\">\r\n {status === \"idle\" || status === \"dragging\" ? (\r\n <motion.div key=\"dropzone\" initial={{ opacity: 0, y: 10 }} animate={{ opacity: status === \"dragging\" ? 0.8 : 1, y: 0, scale: status === \"dragging\" ? 0.98 : 1 }} exit={{ opacity: 0, y: -10 }} transition={{ duration: 0.2 }} className=\"absolute inset-0 flex flex-col items-center justify-center p-6\" onDragOver={handleDragOver} onDragLeave={handleDragLeave} onDrop={handleDrop}>\r\n <div className=\"mb-4\"><UploadIllustration /></div>\r\n <div className=\"text-center space-y-1.5 mb-4\">\r\n <h3 className=\"text-lg font-semibold text-white dark:text-white tracking-tight\">Drag and drop or</h3>\r\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{acceptedFileTypes?.length ? `${acceptedFileTypes.map((t) => t.split(\"/\")[1]).join(\", \").toUpperCase()}` : \"SVG, PNG, JPG or GIF\"} {maxFileSize && `up to ${formatBytes(maxFileSize)}`}</p>\r\n </div>\r\n <button type=\"button\" onClick={triggerFileInput} className=\"w-4/5 flex items-center justify-center gap-2 rounded-lg bg-gray-800 dark:bg-white/10 px-4 py-2.5 text-sm font-semibold text-white dark:text-white transition-all duration-200 hover:bg-gray-700 dark:hover:bg-white/20 group\">\r\n <span>Upload File</span>\r\n <UploadCloud className=\"w-4 h-4 group-hover:scale-110 transition-transform duration-200\" />\r\n </button>\r\n <p className=\"mt-3 text-xs text-gray-500 dark:text-gray-400\">or drag and drop your file here</p>\r\n <input ref={fileInputRef} type=\"file\" className=\"sr-only\" onChange={handleFileInputChange} accept={acceptedFileTypes?.join(\",\")} />\r\n </motion.div>\r\n ) : status === \"uploading\" ? (\r\n <motion.div key=\"uploading\" initial={{ opacity: 0, scale: 0.95 }} animate={{ opacity: 1, scale: 1 }} exit={{ opacity: 0, scale: 0.95 }} className=\"absolute inset-0 flex flex-col items-center justify-center p-6\">\r\n <div className=\"mb-4\"><UploadingAnimation progress={progress} /></div>\r\n <div className=\"text-center space-y-1.5 mb-4\">\r\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white truncate\">{file?.name}</h3>\r\n <div className=\"flex items-center justify-center gap-2 text-xs\">\r\n <span className=\"text-gray-500 dark:text-gray-400\">{formatBytes(file?.size || 0)}</span>\r\n <span className=\"font-medium text-blue-500\">{Math.round(progress)}%</span>\r\n </div>\r\n </div>\r\n <button onClick={resetState} type=\"button\" className=\"w-4/5 flex items-center justify-center gap-2 rounded-lg bg-gray-100 dark:bg-white/10 px-4 py-2.5 text-sm font-semibold text-gray-900 dark:text-white transition-all duration-200 hover:bg-gray-200 dark:hover:bg-white/20\">Cancel</button>\r\n </motion.div>\r\n ) : null}\r\n </AnimatePresence>\r\n </div>\r\n <AnimatePresence>\r\n {error && (\r\n <motion.div initial={{ opacity: 0, y: 10 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -10 }} className=\"absolute bottom-4 left-1/2 transform -translate-x-1/2 px-4 py-2 bg-red-500/10 border border-red-500/20 rounded-lg\">\r\n <p className=\"text-sm text-red-500 dark:text-red-400\">{error.message}</p>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport { FileUpload };\r\nexport default FileUpload;\r\n","export * from 'framer-motion';\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 13v8', key: '1l5pq0' }],\n ['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' }],\n ['path', { d: 'm8 17 4-4 4 4', key: '1quai1' }],\n];\n\n/**\n * @component @name CloudUpload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMTN2OCIgLz4KICA8cGF0aCBkPSJNNCAxNC44OTlBNyA3IDAgMSAxIDE1LjcxIDhoMS43OWE0LjUgNC41IDAgMCAxIDIuNSA4LjI0MiIgLz4KICA8cGF0aCBkPSJtOCAxNyA0LTQgNCA0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/cloud-upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CloudUpload = createLucideIcon('cloud-upload', __iconNode);\n\nexport default CloudUpload;\n","import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n"]}