@facter/ds-core 1.0.0 → 1.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,28 +1,205 @@
1
1
  # @facter/ds-core
2
2
 
3
- Core components for Facter Design System.
3
+ Core UI components for Facter Design System built with React, TypeScript, and Tailwind CSS.
4
4
 
5
5
  ## Installation
6
6
 
7
7
  ```bash
8
+ npm install @facter/ds-core
9
+ # or
8
10
  pnpm add @facter/ds-core
9
11
  ```
10
12
 
11
- ## Usage
13
+ ### Peer Dependencies
14
+
15
+ ```bash
16
+ npm install react react-dom framer-motion
17
+ ```
18
+
19
+ ### Optional (for icons)
20
+
21
+ ```bash
22
+ npm install lucide-react
23
+ # or
24
+ npm install react-icons
25
+ ```
26
+
27
+ ## Setup
28
+
29
+ ### 1. Configure Tailwind CSS
30
+
31
+ Add the design system to your `tailwind.config.js`:
32
+
33
+ ```js
34
+ module.exports = {
35
+ content: [
36
+ './src/**/*.{js,ts,jsx,tsx}',
37
+ './node_modules/@facter/ds-core/dist/**/*.{js,mjs}',
38
+ ],
39
+ theme: {
40
+ extend: {
41
+ colors: {
42
+ border: 'hsl(var(--border))',
43
+ background: 'hsl(var(--background))',
44
+ foreground: 'hsl(var(--foreground))',
45
+ primary: {
46
+ DEFAULT: 'hsl(var(--primary))',
47
+ foreground: 'hsl(var(--primary-foreground))',
48
+ },
49
+ // ... add more as needed
50
+ },
51
+ },
52
+ },
53
+ }
54
+ ```
55
+
56
+ ### 2. Configure CSS Variables
57
+
58
+ Create or update your `globals.css`:
59
+
60
+ ```css
61
+ @tailwind base;
62
+ @tailwind components;
63
+ @tailwind utilities;
64
+
65
+ @layer base {
66
+ :root {
67
+ --background: 0 0% 100%;
68
+ --foreground: 0 0% 3.9%;
69
+ --border: 0 0% 89.8%;
70
+ --primary: 24 100% 50%;
71
+ --primary-foreground: 0 0% 98%;
72
+ --muted: 0 0% 96.1%;
73
+ --muted-foreground: 0 0% 45.1%;
74
+ }
75
+
76
+ /* Optional: Custom font */
77
+ * {
78
+ font-family: 'Your Custom Font', sans-serif;
79
+ }
80
+ }
81
+ ```
82
+
83
+ **See `theme.example.css` for complete theme configuration.**
84
+
85
+ ### 3. Import Global Styles
86
+
87
+ In your app entry point:
88
+
89
+ ```tsx
90
+ import './globals.css'
91
+ ```
92
+
93
+ ## Components
94
+
95
+ ### Button
96
+
97
+ 5 variants, 4 sizes, icon support.
12
98
 
13
99
  ```tsx
14
100
  import { Button } from '@facter/ds-core'
15
101
 
102
+ <Button variant="default" size="md">Click me</Button>
103
+ <Button variant="destructive" size="lg">Delete</Button>
104
+ ```
105
+
106
+ ### Input
107
+
108
+ Floating label, icon support, password toggle.
109
+
110
+ ```tsx
111
+ import { Input } from '@facter/ds-core'
112
+ import { Mail, Lock } from 'lucide-react'
113
+
114
+ <Input label="Email" icon={Mail} type="email" />
115
+ <Input label="Password" icon={Lock} type="password" required />
116
+ ```
117
+
118
+ **Icon Support:** Works with any icon library (lucide-react, react-icons, heroicons, custom SVG).
119
+
120
+ ### Badge
121
+
122
+ 7 color variants.
123
+
124
+ ```tsx
125
+ import { Badge } from '@facter/ds-core'
126
+
127
+ <Badge variant="success">Active</Badge>
128
+ <Badge variant="error">Failed</Badge>
129
+ ```
130
+
131
+ ### Loader
132
+
133
+ 5 animated variants with Provider, Hook, and helper function.
134
+
135
+ ```tsx
136
+ import { LoaderProvider, useLoader, Loader } from '@facter/ds-core'
137
+
138
+ // Option 1: With Provider + Hook
16
139
  function App() {
17
- return <Button variant="default">Click me</Button>
140
+ return (
141
+ <LoaderProvider>
142
+ <MyComponent />
143
+ </LoaderProvider>
144
+ )
145
+ }
146
+
147
+ function MyComponent() {
148
+ const loader = useLoader()
149
+
150
+ const handleClick = async () => {
151
+ loader.show({ variant: 'pulse', message: 'Processing...' })
152
+ await fetchData()
153
+ loader.hide()
154
+ }
155
+
156
+ return <button onClick={handleClick}>Load</button>
18
157
  }
158
+
159
+ // Option 2: Direct component
160
+ <Loader variant="spinner" show={true} message="Loading..." />
19
161
  ```
20
162
 
21
- ## Components
163
+ ## Customization
164
+
165
+ ### Theme Colors
166
+
167
+ Each project can define its own brand colors in CSS variables:
168
+
169
+ ```css
170
+ :root {
171
+ --primary: 24 100% 50%; /* Orange for Facter */
172
+ /* or */
173
+ --primary: 220 91% 50%; /* Blue for another project */
174
+ }
175
+ ```
176
+
177
+ ### Custom Fonts
178
+
179
+ ```css
180
+ @layer base {
181
+ * {
182
+ font-family: 'Neue Haas Grotesk Display Pro', sans-serif;
183
+ }
184
+ }
185
+ ```
186
+
187
+ Or in `tailwind.config.js`:
188
+
189
+ ```js
190
+ theme: {
191
+ extend: {
192
+ fontFamily: {
193
+ sans: ['Neue Haas Grotesk Display Pro', 'sans-serif'],
194
+ },
195
+ },
196
+ }
197
+ ```
198
+
199
+ ## Documentation
22
200
 
23
- - Button
24
- - (More to come...)
201
+ Full documentation and interactive examples available in Storybook.
25
202
 
26
- ## Utils
203
+ ## License
27
204
 
28
- - `cn()` - Merge Tailwind classes
205
+ MIT
package/dist/index.d.mts CHANGED
@@ -18,7 +18,11 @@ declare const inputVariants: (props?: ({
18
18
  inputSize?: "default" | "sm" | "lg" | null | undefined;
19
19
  } & class_variance_authority_types.ClassProp) | undefined) => string;
20
20
  interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>, VariantProps<typeof inputVariants> {
21
+ label?: string;
21
22
  error?: boolean;
23
+ icon?: React.ComponentType<any>;
24
+ containerClassName?: string;
25
+ labelClassName?: string;
22
26
  }
23
27
  declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
24
28
 
@@ -33,15 +37,6 @@ declare namespace Badge {
33
37
  var displayName: string;
34
38
  }
35
39
 
36
- declare const spinnerVariants: (props?: ({
37
- size?: "default" | "sm" | "lg" | "xl" | null | undefined;
38
- variant?: "secondary" | "primary" | "white" | "muted" | null | undefined;
39
- } & class_variance_authority_types.ClassProp) | undefined) => string;
40
- interface SpinnerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>, VariantProps<typeof spinnerVariants> {
41
- label?: string;
42
- }
43
- declare const Spinner: React.ForwardRefExoticComponent<SpinnerProps & React.RefAttributes<HTMLDivElement>>;
44
-
45
40
  declare const loaderVariants: (props?: ({
46
41
  variant?: "default" | "spinner" | "dots" | "pulse" | "bars" | null | undefined;
47
42
  scope?: "global" | "local" | null | undefined;
@@ -83,4 +78,4 @@ declare function GlobalLoaderController(): null;
83
78
  */
84
79
  declare function cn(...inputs: ClassValue[]): string;
85
80
 
86
- export { Badge, type BadgeProps, Button, type ButtonProps, GlobalLoaderController, Input, type InputProps, Loader, type LoaderProps, LoaderProvider, Spinner, type SpinnerProps, cn, loader, useLoader };
81
+ export { Badge, type BadgeProps, Button, type ButtonProps, GlobalLoaderController, Input, type InputProps, Loader, type LoaderProps, LoaderProvider, cn, loader, useLoader };
package/dist/index.d.ts CHANGED
@@ -18,7 +18,11 @@ declare const inputVariants: (props?: ({
18
18
  inputSize?: "default" | "sm" | "lg" | null | undefined;
19
19
  } & class_variance_authority_types.ClassProp) | undefined) => string;
20
20
  interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>, VariantProps<typeof inputVariants> {
21
+ label?: string;
21
22
  error?: boolean;
23
+ icon?: React.ComponentType<any>;
24
+ containerClassName?: string;
25
+ labelClassName?: string;
22
26
  }
23
27
  declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
24
28
 
@@ -33,15 +37,6 @@ declare namespace Badge {
33
37
  var displayName: string;
34
38
  }
35
39
 
36
- declare const spinnerVariants: (props?: ({
37
- size?: "default" | "sm" | "lg" | "xl" | null | undefined;
38
- variant?: "secondary" | "primary" | "white" | "muted" | null | undefined;
39
- } & class_variance_authority_types.ClassProp) | undefined) => string;
40
- interface SpinnerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>, VariantProps<typeof spinnerVariants> {
41
- label?: string;
42
- }
43
- declare const Spinner: React.ForwardRefExoticComponent<SpinnerProps & React.RefAttributes<HTMLDivElement>>;
44
-
45
40
  declare const loaderVariants: (props?: ({
46
41
  variant?: "default" | "spinner" | "dots" | "pulse" | "bars" | null | undefined;
47
42
  scope?: "global" | "local" | null | undefined;
@@ -83,4 +78,4 @@ declare function GlobalLoaderController(): null;
83
78
  */
84
79
  declare function cn(...inputs: ClassValue[]): string;
85
80
 
86
- export { Badge, type BadgeProps, Button, type ButtonProps, GlobalLoaderController, Input, type InputProps, Loader, type LoaderProps, LoaderProvider, Spinner, type SpinnerProps, cn, loader, useLoader };
81
+ export { Badge, type BadgeProps, Button, type ButtonProps, GlobalLoaderController, Input, type InputProps, Loader, type LoaderProps, LoaderProvider, cn, loader, useLoader };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var React5 = require('react');
3
+ var React4 = require('react');
4
4
  var classVarianceAuthority = require('class-variance-authority');
5
5
  var clsx = require('clsx');
6
6
  var tailwindMerge = require('tailwind-merge');
@@ -25,7 +25,7 @@ function _interopNamespace(e) {
25
25
  return Object.freeze(n);
26
26
  }
27
27
 
28
- var React5__namespace = /*#__PURE__*/_interopNamespace(React5);
28
+ var React4__namespace = /*#__PURE__*/_interopNamespace(React4);
29
29
 
30
30
  // src/components/Button/Button.tsx
31
31
  function cn(...inputs) {
@@ -55,7 +55,7 @@ var buttonVariants = classVarianceAuthority.cva(
55
55
  }
56
56
  }
57
57
  );
58
- var Button = React5__namespace.forwardRef(
58
+ var Button = React4__namespace.forwardRef(
59
59
  ({ className, variant, size, ...props }, ref) => {
60
60
  return /* @__PURE__ */ jsxRuntime.jsx(
61
61
  "button",
@@ -69,17 +69,17 @@ var Button = React5__namespace.forwardRef(
69
69
  );
70
70
  Button.displayName = "Button";
71
71
  var inputVariants = classVarianceAuthority.cva(
72
- "flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-colors",
72
+ "w-full h-12 px-3 pt-4 pb-2 text-sm bg-background rounded-md border-2 transition-colors focus:outline-none focus:ring-0 disabled:cursor-not-allowed disabled:opacity-50",
73
73
  {
74
74
  variants: {
75
75
  variant: {
76
- default: "border-gray-300 focus-visible:ring-primary",
77
- error: "border-red-500 focus-visible:ring-red-500"
76
+ default: "border-border focus:border-primary",
77
+ error: "border-red-500 focus:border-red-600"
78
78
  },
79
79
  inputSize: {
80
- default: "h-10",
81
- sm: "h-9 text-xs",
82
- lg: "h-11"
80
+ default: "h-12",
81
+ sm: "h-10 pt-3 pb-1",
82
+ lg: "h-14 pt-5 pb-2"
83
83
  }
84
84
  },
85
85
  defaultVariants: {
@@ -88,23 +88,127 @@ var inputVariants = classVarianceAuthority.cva(
88
88
  }
89
89
  }
90
90
  );
91
- var Input = React5__namespace.forwardRef(
92
- ({ className, variant, inputSize, error, type = "text", ...props }, ref) => {
93
- return /* @__PURE__ */ jsxRuntime.jsx(
94
- "input",
95
- {
96
- type,
97
- className: cn(
98
- inputVariants({
99
- variant: error ? "error" : variant,
100
- inputSize,
91
+ var Input = React4__namespace.forwardRef(
92
+ ({
93
+ className,
94
+ variant,
95
+ inputSize,
96
+ error,
97
+ type = "text",
98
+ label,
99
+ icon: Icon,
100
+ required,
101
+ containerClassName,
102
+ labelClassName,
103
+ ...props
104
+ }, ref) => {
105
+ const inputRef = React4__namespace.useRef(null);
106
+ const [showPassword, setShowPassword] = React4__namespace.useState(false);
107
+ React4__namespace.useImperativeHandle(ref, () => inputRef.current, []);
108
+ const focusInput = React4__namespace.useCallback(() => {
109
+ inputRef.current?.focus();
110
+ }, []);
111
+ const togglePasswordVisibility = React4__namespace.useCallback(() => {
112
+ setShowPassword((prev) => !prev);
113
+ }, []);
114
+ const inputType = type === "password" ? showPassword ? "text" : "password" : type;
115
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", containerClassName), children: [
116
+ Icon && /* @__PURE__ */ jsxRuntime.jsx(
117
+ Icon,
118
+ {
119
+ className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground h-4 w-4 cursor-pointer z-10",
120
+ onClick: focusInput
121
+ }
122
+ ),
123
+ /* @__PURE__ */ jsxRuntime.jsx(
124
+ "input",
125
+ {
126
+ type: inputType,
127
+ className: cn(
128
+ inputVariants({
129
+ variant: error ? "error" : variant,
130
+ inputSize
131
+ }),
132
+ Icon && "pl-10",
133
+ type === "password" && "pr-11",
101
134
  className
102
- })
103
- ),
104
- ref,
105
- ...props
106
- }
107
- );
135
+ ),
136
+ ref: inputRef,
137
+ ...props
138
+ }
139
+ ),
140
+ label && /* @__PURE__ */ jsxRuntime.jsxs(
141
+ "label",
142
+ {
143
+ className: cn(
144
+ "absolute left-3 top-[-6px] text-xs font-medium bg-background px-1 cursor-pointer",
145
+ error ? "text-red-500" : "text-foreground",
146
+ Icon && "left-10",
147
+ labelClassName
148
+ ),
149
+ onClick: focusInput,
150
+ children: [
151
+ label,
152
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-red-500 ml-0.5", children: "*" })
153
+ ]
154
+ }
155
+ ),
156
+ type === "password" && /* @__PURE__ */ jsxRuntime.jsx(
157
+ "button",
158
+ {
159
+ type: "button",
160
+ onClick: togglePasswordVisibility,
161
+ className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors z-10",
162
+ "aria-label": showPassword ? "Ocultar senha" : "Mostrar senha",
163
+ children: showPassword ? /* @__PURE__ */ jsxRuntime.jsxs(
164
+ "svg",
165
+ {
166
+ className: "h-5 w-5",
167
+ fill: "none",
168
+ viewBox: "0 0 24 24",
169
+ stroke: "currentColor",
170
+ children: [
171
+ /* @__PURE__ */ jsxRuntime.jsx(
172
+ "path",
173
+ {
174
+ strokeLinecap: "round",
175
+ strokeLinejoin: "round",
176
+ strokeWidth: 2,
177
+ d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z"
178
+ }
179
+ ),
180
+ /* @__PURE__ */ jsxRuntime.jsx(
181
+ "path",
182
+ {
183
+ strokeLinecap: "round",
184
+ strokeLinejoin: "round",
185
+ strokeWidth: 2,
186
+ d: "M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
187
+ }
188
+ )
189
+ ]
190
+ }
191
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
192
+ "svg",
193
+ {
194
+ className: "h-5 w-5",
195
+ fill: "none",
196
+ viewBox: "0 0 24 24",
197
+ stroke: "currentColor",
198
+ children: /* @__PURE__ */ jsxRuntime.jsx(
199
+ "path",
200
+ {
201
+ strokeLinecap: "round",
202
+ strokeLinejoin: "round",
203
+ strokeWidth: 2,
204
+ d: "M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"
205
+ }
206
+ )
207
+ }
208
+ )
209
+ }
210
+ )
211
+ ] });
108
212
  }
109
213
  );
110
214
  Input.displayName = "Input";
@@ -137,42 +241,6 @@ function Badge({ className, variant, size, ...props }) {
137
241
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(badgeVariants({ variant, size }), className), ...props });
138
242
  }
139
243
  Badge.displayName = "Badge";
140
- var spinnerVariants = classVarianceAuthority.cva("animate-spin rounded-full border-2 border-current border-t-transparent", {
141
- variants: {
142
- size: {
143
- sm: "h-4 w-4",
144
- default: "h-6 w-6",
145
- lg: "h-8 w-8",
146
- xl: "h-12 w-12"
147
- },
148
- variant: {
149
- primary: "text-primary",
150
- secondary: "text-secondary",
151
- white: "text-white",
152
- muted: "text-muted-foreground"
153
- }
154
- },
155
- defaultVariants: {
156
- size: "default",
157
- variant: "primary"
158
- }
159
- });
160
- var Spinner = React5__namespace.forwardRef(
161
- ({ className, size, variant, label = "Loading...", ...props }, ref) => {
162
- return /* @__PURE__ */ jsxRuntime.jsx(
163
- "div",
164
- {
165
- ref,
166
- role: "status",
167
- "aria-label": label,
168
- className: cn(spinnerVariants({ size, variant }), className),
169
- ...props,
170
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: label })
171
- }
172
- );
173
- }
174
- );
175
- Spinner.displayName = "Spinner";
176
244
  var loaderVariants = classVarianceAuthority.cva("flex items-center justify-center backdrop-blur-sm", {
177
245
  variants: {
178
246
  variant: {
@@ -270,7 +338,7 @@ function BarsLoader() {
270
338
  i
271
339
  )) });
272
340
  }
273
- var Loader = React5__namespace.forwardRef(
341
+ var Loader = React4__namespace.forwardRef(
274
342
  ({
275
343
  variant = "default",
276
344
  message,
@@ -320,21 +388,21 @@ var Loader = React5__namespace.forwardRef(
320
388
  }
321
389
  );
322
390
  Loader.displayName = "Loader";
323
- var LoaderContext = React5__namespace.createContext(
391
+ var LoaderContext = React4__namespace.createContext(
324
392
  void 0
325
393
  );
326
394
  function LoaderProvider({ children }) {
327
- const [isLoading, setIsLoading] = React5__namespace.useState(false);
328
- const [loaderOptions, setLoaderOptions] = React5__namespace.useState({});
329
- const show = React5__namespace.useCallback((options = {}) => {
395
+ const [isLoading, setIsLoading] = React4__namespace.useState(false);
396
+ const [loaderOptions, setLoaderOptions] = React4__namespace.useState({});
397
+ const show = React4__namespace.useCallback((options = {}) => {
330
398
  setLoaderOptions(options);
331
399
  setIsLoading(true);
332
400
  }, []);
333
- const hide = React5__namespace.useCallback(() => {
401
+ const hide = React4__namespace.useCallback(() => {
334
402
  setIsLoading(false);
335
403
  setTimeout(() => setLoaderOptions({}), 300);
336
404
  }, []);
337
- const value = React5__namespace.useMemo(
405
+ const value = React4__namespace.useMemo(
338
406
  () => ({ show, hide, isLoading }),
339
407
  [show, hide, isLoading]
340
408
  );
@@ -353,7 +421,7 @@ function LoaderProvider({ children }) {
353
421
  ] });
354
422
  }
355
423
  function useLoader() {
356
- const context = React5__namespace.useContext(LoaderContext);
424
+ const context = React4__namespace.useContext(LoaderContext);
357
425
  if (context === void 0) {
358
426
  throw new Error("useLoader must be used within a LoaderProvider");
359
427
  }
@@ -385,7 +453,7 @@ var loader = {
385
453
  };
386
454
  function GlobalLoaderController() {
387
455
  const loaderController = useLoader();
388
- React5__namespace.useEffect(() => {
456
+ React4__namespace.useEffect(() => {
389
457
  setGlobalLoader(loaderController);
390
458
  return () => {
391
459
  setGlobalLoader(null);
@@ -400,7 +468,6 @@ exports.GlobalLoaderController = GlobalLoaderController;
400
468
  exports.Input = Input;
401
469
  exports.Loader = Loader;
402
470
  exports.LoaderProvider = LoaderProvider;
403
- exports.Spinner = Spinner;
404
471
  exports.cn = cn;
405
472
  exports.loader = loader;
406
473
  exports.useLoader = useLoader;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/cn.ts","../src/components/Button/Button.tsx","../src/components/Input/Input.tsx","../src/components/Badge/Badge.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Loader/Loader.tsx","../src/components/Loader/LoaderContext.tsx"],"names":["twMerge","clsx","cva","React","jsx","React2","React3","motion","React4","AnimatePresence","jsxs","React5"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\n/**\r\n * Merge Tailwind CSS classes\r\n * Combines clsx (conditional classes) with tailwind-merge (deduplicates classes)\r\n *\r\n * @example\r\n * cn('px-4 py-2', isActive && 'bg-primary', className)\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst buttonVariants = cva(\r\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-white hover:bg-primary/90',\r\n destructive: 'bg-red-600 text-white hover:bg-red-700',\r\n outline: 'border border-input hover:bg-accent hover:text-accent-foreground',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-10 px-4 py-2',\r\n sm: 'h-9 px-3',\r\n lg: 'h-11 px-8',\r\n icon: 'h-10 w-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean\r\n}\r\n\r\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, ...props }, ref) => {\r\n return (\r\n <button\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\n\r\nButton.displayName = 'Button'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst inputVariants = cva(\r\n 'flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-colors',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'border-gray-300 focus-visible:ring-primary',\r\n error: 'border-red-500 focus-visible:ring-red-500',\r\n },\r\n inputSize: {\r\n default: 'h-10',\r\n sm: 'h-9 text-xs',\r\n lg: 'h-11',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n inputSize: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface InputProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\r\n VariantProps<typeof inputVariants> {\r\n error?: boolean\r\n}\r\n\r\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n ({ className, variant, inputSize, error, type = 'text', ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(\r\n inputVariants({\r\n variant: error ? 'error' : variant,\r\n inputSize,\r\n className,\r\n })\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\n\r\nInput.displayName = 'Input'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst badgeVariants = cva(\r\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\r\n secondary:\r\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n success:\r\n 'border-transparent bg-green-500 text-white hover:bg-green-600',\r\n warning:\r\n 'border-transparent bg-yellow-500 text-white hover:bg-yellow-600',\r\n error: 'border-transparent bg-red-500 text-white hover:bg-red-600',\r\n info: 'border-transparent bg-blue-500 text-white hover:bg-blue-600',\r\n outline: 'border-gray-300 text-foreground hover:bg-gray-100',\r\n },\r\n size: {\r\n default: 'px-2.5 py-0.5 text-xs',\r\n sm: 'px-2 py-0.5 text-[10px]',\r\n lg: 'px-3 py-1 text-sm',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface BadgeProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof badgeVariants> {}\r\n\r\nexport function Badge({ className, variant, size, ...props }: BadgeProps) {\r\n return (\r\n <div className={cn(badgeVariants({ variant, size }), className)} {...props} />\r\n )\r\n}\r\n\r\nBadge.displayName = 'Badge'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst spinnerVariants = cva('animate-spin rounded-full border-2 border-current border-t-transparent', {\r\n variants: {\r\n size: {\r\n sm: 'h-4 w-4',\r\n default: 'h-6 w-6',\r\n lg: 'h-8 w-8',\r\n xl: 'h-12 w-12',\r\n },\r\n variant: {\r\n primary: 'text-primary',\r\n secondary: 'text-secondary',\r\n white: 'text-white',\r\n muted: 'text-muted-foreground',\r\n },\r\n },\r\n defaultVariants: {\r\n size: 'default',\r\n variant: 'primary',\r\n },\r\n})\r\n\r\nexport interface SpinnerProps\r\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>,\r\n VariantProps<typeof spinnerVariants> {\r\n label?: string\r\n}\r\n\r\nexport const Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\r\n ({ className, size, variant, label = 'Loading...', ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n role=\"status\"\r\n aria-label={label}\r\n className={cn(spinnerVariants({ size, variant }), className)}\r\n {...props}\r\n >\r\n <span className=\"sr-only\">{label}</span>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nSpinner.displayName = 'Spinner'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { motion, AnimatePresence } from 'framer-motion'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst loaderVariants = cva('flex items-center justify-center backdrop-blur-sm', {\r\n variants: {\r\n variant: {\r\n default: '',\r\n spinner: '',\r\n dots: '',\r\n pulse: '',\r\n bars: '',\r\n },\r\n scope: {\r\n global: 'fixed inset-0 z-[9999]',\r\n local: 'absolute inset-0 z-50',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n scope: 'global',\r\n },\r\n})\r\n\r\nexport interface LoaderProps extends VariantProps<typeof loaderVariants> {\r\n message?: string\r\n isTransparentBg?: boolean\r\n show?: boolean\r\n}\r\n\r\nconst containerVariants = {\r\n initial: { opacity: 0, scale: 0.9 },\r\n animate: { opacity: 1, scale: 1 },\r\n exit: { opacity: 0, scale: 0.9 },\r\n}\r\n\r\nfunction SpinnerLoader() {\r\n return (\r\n <motion.div\r\n className=\"h-12 w-12 rounded-full border-4 border-primary border-t-transparent\"\r\n animate={{ rotate: 360 }}\r\n transition={{ duration: 1, repeat: Infinity, ease: 'linear' }}\r\n />\r\n )\r\n}\r\n\r\nfunction DotsLoader() {\r\n return (\r\n <div className=\"flex space-x-2\">\r\n {[0, 1, 2].map((i) => (\r\n <motion.div\r\n key={i}\r\n className=\"h-3 w-3 rounded-full bg-primary\"\r\n initial={{ scale: 0 }}\r\n animate={{ scale: [0, 1, 0] }}\r\n transition={{\r\n duration: 1,\r\n repeat: Infinity,\r\n delay: i * 0.2,\r\n ease: 'easeInOut',\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nfunction PulseLoader() {\r\n return (\r\n <motion.div\r\n className=\"h-12 w-12 rounded-full bg-primary/20\"\r\n initial={{ scale: 0.8 }}\r\n animate={{ scale: 1, opacity: [1, 0.5, 1] }}\r\n transition={{\r\n duration: 1.5,\r\n repeat: Infinity,\r\n ease: 'easeInOut',\r\n }}\r\n >\r\n <motion.div\r\n className=\"h-full w-full rounded-full bg-primary/40\"\r\n initial={{ scale: 0.8 }}\r\n animate={{ scale: 1, opacity: [1, 0, 1] }}\r\n transition={{\r\n duration: 1.5,\r\n repeat: Infinity,\r\n ease: 'easeInOut',\r\n delay: 0.2,\r\n }}\r\n />\r\n </motion.div>\r\n )\r\n}\r\n\r\nfunction BarsLoader() {\r\n return (\r\n <div className=\"flex items-center space-x-1\">\r\n {[0, 1, 2, 3].map((i) => (\r\n <motion.div\r\n key={i}\r\n className=\"h-8 w-1 rounded-full bg-primary\"\r\n initial={{ scaleY: 0.3 }}\r\n animate={{ scaleY: [0.3, 1, 0.3] }}\r\n transition={{\r\n duration: 0.8,\r\n repeat: Infinity,\r\n delay: i * 0.1,\r\n ease: 'easeInOut',\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport const Loader = React.forwardRef<HTMLDivElement, LoaderProps>(\r\n (\r\n {\r\n variant = 'default',\r\n message,\r\n scope = 'global',\r\n isTransparentBg = true,\r\n show = true,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const loaderComponents = {\r\n default: <SpinnerLoader />,\r\n spinner: <SpinnerLoader />,\r\n dots: <DotsLoader />,\r\n pulse: <PulseLoader />,\r\n bars: <BarsLoader />,\r\n }\r\n\r\n if (!show) return null\r\n\r\n return (\r\n <AnimatePresence>\r\n <motion.div\r\n ref={ref}\r\n className={cn(\r\n loaderVariants({ variant, scope }),\r\n isTransparentBg ? 'bg-background/90' : 'bg-background'\r\n )}\r\n initial=\"initial\"\r\n animate=\"animate\"\r\n exit=\"exit\"\r\n variants={containerVariants}\r\n transition={{ duration: 0.2 }}\r\n {...props}\r\n >\r\n <div className=\"flex flex-col items-center gap-4\">\r\n {loaderComponents[variant || 'default']}\r\n {message && (\r\n <motion.p\r\n className=\"text-lg text-muted-foreground\"\r\n initial={{ opacity: 0, y: 10 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -10 }}\r\n transition={{ delay: 0.1 }}\r\n >\r\n {message}\r\n </motion.p>\r\n )}\r\n </div>\r\n </motion.div>\r\n </AnimatePresence>\r\n )\r\n }\r\n)\r\n\r\nLoader.displayName = 'Loader'\r\n","import * as React from 'react'\r\nimport { Loader, type LoaderProps } from './Loader'\r\n\r\ninterface LoaderContextValue {\r\n show: (options?: LoaderOptions) => void\r\n hide: () => void\r\n isLoading: boolean\r\n}\r\n\r\ninterface LoaderOptions {\r\n message?: string\r\n variant?: LoaderProps['variant']\r\n scope?: LoaderProps['scope']\r\n isTransparentBg?: boolean\r\n}\r\n\r\nconst LoaderContext = React.createContext<LoaderContextValue | undefined>(\r\n undefined\r\n)\r\n\r\nexport function LoaderProvider({ children }: { children: React.ReactNode }) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [loaderOptions, setLoaderOptions] = React.useState<LoaderOptions>({})\r\n\r\n const show = React.useCallback((options: LoaderOptions = {}) => {\r\n setLoaderOptions(options)\r\n setIsLoading(true)\r\n }, [])\r\n\r\n const hide = React.useCallback(() => {\r\n setIsLoading(false)\r\n // Limpar opções após animação de saída\r\n setTimeout(() => setLoaderOptions({}), 300)\r\n }, [])\r\n\r\n const value = React.useMemo(\r\n () => ({ show, hide, isLoading }),\r\n [show, hide, isLoading]\r\n )\r\n\r\n return (\r\n <LoaderContext.Provider value={value}>\r\n {children}\r\n {isLoading && (\r\n <Loader\r\n variant={loaderOptions.variant}\r\n message={loaderOptions.message}\r\n scope={loaderOptions.scope}\r\n isTransparentBg={loaderOptions.isTransparentBg}\r\n show={isLoading}\r\n />\r\n )}\r\n </LoaderContext.Provider>\r\n )\r\n}\r\n\r\nexport function useLoader() {\r\n const context = React.useContext(LoaderContext)\r\n if (context === undefined) {\r\n throw new Error('useLoader must be used within a LoaderProvider')\r\n }\r\n return context\r\n}\r\n\r\n// Helper function para usar fora de componentes\r\nlet globalLoaderController: LoaderContextValue | null = null\r\n\r\nexport function setGlobalLoader(controller: LoaderContextValue) {\r\n globalLoaderController = controller\r\n}\r\n\r\nexport const loader = {\r\n show: (options?: LoaderOptions) => {\r\n if (globalLoaderController) {\r\n globalLoaderController.show(options)\r\n } else {\r\n console.warn(\r\n 'Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider.'\r\n )\r\n }\r\n },\r\n hide: () => {\r\n if (globalLoaderController) {\r\n globalLoaderController.hide()\r\n } else {\r\n console.warn(\r\n 'Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider.'\r\n )\r\n }\r\n },\r\n}\r\n\r\n// Component que registra o controller global\r\nexport function GlobalLoaderController() {\r\n const loaderController = useLoader()\r\n\r\n React.useEffect(() => {\r\n setGlobalLoader(loaderController)\r\n return () => {\r\n setGlobalLoader(null as any)\r\n }\r\n }, [loaderController])\r\n\r\n return null\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/utils/cn.ts","../src/components/Button/Button.tsx","../src/components/Input/Input.tsx","../src/components/Badge/Badge.tsx","../src/components/Loader/Loader.tsx","../src/components/Loader/LoaderContext.tsx"],"names":["twMerge","clsx","cva","React","jsx","React2","jsxs","motion","React3","AnimatePresence","React4"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\n/**\r\n * Merge Tailwind CSS classes\r\n * Combines clsx (conditional classes) with tailwind-merge (deduplicates classes)\r\n *\r\n * @example\r\n * cn('px-4 py-2', isActive && 'bg-primary', className)\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst buttonVariants = cva(\r\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-white hover:bg-primary/90',\r\n destructive: 'bg-red-600 text-white hover:bg-red-700',\r\n outline: 'border border-input hover:bg-accent hover:text-accent-foreground',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-10 px-4 py-2',\r\n sm: 'h-9 px-3',\r\n lg: 'h-11 px-8',\r\n icon: 'h-10 w-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean\r\n}\r\n\r\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, ...props }, ref) => {\r\n return (\r\n <button\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\n\r\nButton.displayName = 'Button'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst inputVariants = cva(\r\n 'w-full h-12 px-3 pt-4 pb-2 text-sm bg-background rounded-md border-2 transition-colors focus:outline-none focus:ring-0 disabled:cursor-not-allowed disabled:opacity-50',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'border-border focus:border-primary',\r\n error: 'border-red-500 focus:border-red-600',\r\n },\r\n inputSize: {\r\n default: 'h-12',\r\n sm: 'h-10 pt-3 pb-1',\r\n lg: 'h-14 pt-5 pb-2',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n inputSize: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface InputProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\r\n VariantProps<typeof inputVariants> {\r\n label?: string\r\n error?: boolean\r\n icon?: React.ComponentType<any>\r\n containerClassName?: string\r\n labelClassName?: string\r\n}\r\n\r\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n className,\r\n variant,\r\n inputSize,\r\n error,\r\n type = 'text',\r\n label,\r\n icon: Icon,\r\n required,\r\n containerClassName,\r\n labelClassName,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const inputRef = React.useRef<HTMLInputElement | null>(null)\r\n const [showPassword, setShowPassword] = React.useState(false)\r\n\r\n React.useImperativeHandle(ref, () => inputRef.current!, [])\r\n\r\n const focusInput = React.useCallback(() => {\r\n inputRef.current?.focus()\r\n }, [])\r\n\r\n const togglePasswordVisibility = React.useCallback(() => {\r\n setShowPassword((prev) => !prev)\r\n }, [])\r\n\r\n const inputType = type === 'password' ? (showPassword ? 'text' : 'password') : type\r\n\r\n return (\r\n <div className={cn('relative', containerClassName)}>\r\n {/* Icon */}\r\n {Icon && (\r\n <Icon\r\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground h-4 w-4 cursor-pointer z-10\"\r\n onClick={focusInput}\r\n />\r\n )}\r\n\r\n {/* Input */}\r\n <input\r\n type={inputType}\r\n className={cn(\r\n inputVariants({\r\n variant: error ? 'error' : variant,\r\n inputSize,\r\n }),\r\n Icon && 'pl-10',\r\n type === 'password' && 'pr-11',\r\n className\r\n )}\r\n ref={inputRef}\r\n {...props}\r\n />\r\n\r\n {/* Floating Label */}\r\n {label && (\r\n <label\r\n className={cn(\r\n 'absolute left-3 top-[-6px] text-xs font-medium bg-background px-1 cursor-pointer',\r\n error ? 'text-red-500' : 'text-foreground',\r\n Icon && 'left-10',\r\n labelClassName\r\n )}\r\n onClick={focusInput}\r\n >\r\n {label}\r\n {required && <span className=\"text-red-500 ml-0.5\">*</span>}\r\n </label>\r\n )}\r\n\r\n {/* Password Toggle */}\r\n {type === 'password' && (\r\n <button\r\n type=\"button\"\r\n onClick={togglePasswordVisibility}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors z-10\"\r\n aria-label={showPassword ? 'Ocultar senha' : 'Mostrar senha'}\r\n >\r\n {showPassword ? (\r\n <svg\r\n className=\"h-5 w-5\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\r\n />\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\"\r\n />\r\n </svg>\r\n ) : (\r\n <svg\r\n className=\"h-5 w-5\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\"\r\n />\r\n </svg>\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nInput.displayName = 'Input'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst badgeVariants = cva(\r\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\r\n secondary:\r\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n success:\r\n 'border-transparent bg-green-500 text-white hover:bg-green-600',\r\n warning:\r\n 'border-transparent bg-yellow-500 text-white hover:bg-yellow-600',\r\n error: 'border-transparent bg-red-500 text-white hover:bg-red-600',\r\n info: 'border-transparent bg-blue-500 text-white hover:bg-blue-600',\r\n outline: 'border-gray-300 text-foreground hover:bg-gray-100',\r\n },\r\n size: {\r\n default: 'px-2.5 py-0.5 text-xs',\r\n sm: 'px-2 py-0.5 text-[10px]',\r\n lg: 'px-3 py-1 text-sm',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface BadgeProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof badgeVariants> {}\r\n\r\nexport function Badge({ className, variant, size, ...props }: BadgeProps) {\r\n return (\r\n <div className={cn(badgeVariants({ variant, size }), className)} {...props} />\r\n )\r\n}\r\n\r\nBadge.displayName = 'Badge'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { motion, AnimatePresence } from 'framer-motion'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst loaderVariants = cva('flex items-center justify-center backdrop-blur-sm', {\r\n variants: {\r\n variant: {\r\n default: '',\r\n spinner: '',\r\n dots: '',\r\n pulse: '',\r\n bars: '',\r\n },\r\n scope: {\r\n global: 'fixed inset-0 z-[9999]',\r\n local: 'absolute inset-0 z-50',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n scope: 'global',\r\n },\r\n})\r\n\r\nexport interface LoaderProps extends VariantProps<typeof loaderVariants> {\r\n message?: string\r\n isTransparentBg?: boolean\r\n show?: boolean\r\n}\r\n\r\nconst containerVariants = {\r\n initial: { opacity: 0, scale: 0.9 },\r\n animate: { opacity: 1, scale: 1 },\r\n exit: { opacity: 0, scale: 0.9 },\r\n}\r\n\r\nfunction SpinnerLoader() {\r\n return (\r\n <motion.div\r\n className=\"h-12 w-12 rounded-full border-4 border-primary border-t-transparent\"\r\n animate={{ rotate: 360 }}\r\n transition={{ duration: 1, repeat: Infinity, ease: 'linear' }}\r\n />\r\n )\r\n}\r\n\r\nfunction DotsLoader() {\r\n return (\r\n <div className=\"flex space-x-2\">\r\n {[0, 1, 2].map((i) => (\r\n <motion.div\r\n key={i}\r\n className=\"h-3 w-3 rounded-full bg-primary\"\r\n initial={{ scale: 0 }}\r\n animate={{ scale: [0, 1, 0] }}\r\n transition={{\r\n duration: 1,\r\n repeat: Infinity,\r\n delay: i * 0.2,\r\n ease: 'easeInOut',\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nfunction PulseLoader() {\r\n return (\r\n <motion.div\r\n className=\"h-12 w-12 rounded-full bg-primary/20\"\r\n initial={{ scale: 0.8 }}\r\n animate={{ scale: 1, opacity: [1, 0.5, 1] }}\r\n transition={{\r\n duration: 1.5,\r\n repeat: Infinity,\r\n ease: 'easeInOut',\r\n }}\r\n >\r\n <motion.div\r\n className=\"h-full w-full rounded-full bg-primary/40\"\r\n initial={{ scale: 0.8 }}\r\n animate={{ scale: 1, opacity: [1, 0, 1] }}\r\n transition={{\r\n duration: 1.5,\r\n repeat: Infinity,\r\n ease: 'easeInOut',\r\n delay: 0.2,\r\n }}\r\n />\r\n </motion.div>\r\n )\r\n}\r\n\r\nfunction BarsLoader() {\r\n return (\r\n <div className=\"flex items-center space-x-1\">\r\n {[0, 1, 2, 3].map((i) => (\r\n <motion.div\r\n key={i}\r\n className=\"h-8 w-1 rounded-full bg-primary\"\r\n initial={{ scaleY: 0.3 }}\r\n animate={{ scaleY: [0.3, 1, 0.3] }}\r\n transition={{\r\n duration: 0.8,\r\n repeat: Infinity,\r\n delay: i * 0.1,\r\n ease: 'easeInOut',\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport const Loader = React.forwardRef<HTMLDivElement, LoaderProps>(\r\n (\r\n {\r\n variant = 'default',\r\n message,\r\n scope = 'global',\r\n isTransparentBg = true,\r\n show = true,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const loaderComponents = {\r\n default: <SpinnerLoader />,\r\n spinner: <SpinnerLoader />,\r\n dots: <DotsLoader />,\r\n pulse: <PulseLoader />,\r\n bars: <BarsLoader />,\r\n }\r\n\r\n if (!show) return null\r\n\r\n return (\r\n <AnimatePresence>\r\n <motion.div\r\n ref={ref}\r\n className={cn(\r\n loaderVariants({ variant, scope }),\r\n isTransparentBg ? 'bg-background/90' : 'bg-background'\r\n )}\r\n initial=\"initial\"\r\n animate=\"animate\"\r\n exit=\"exit\"\r\n variants={containerVariants}\r\n transition={{ duration: 0.2 }}\r\n {...props}\r\n >\r\n <div className=\"flex flex-col items-center gap-4\">\r\n {loaderComponents[variant || 'default']}\r\n {message && (\r\n <motion.p\r\n className=\"text-lg text-muted-foreground\"\r\n initial={{ opacity: 0, y: 10 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -10 }}\r\n transition={{ delay: 0.1 }}\r\n >\r\n {message}\r\n </motion.p>\r\n )}\r\n </div>\r\n </motion.div>\r\n </AnimatePresence>\r\n )\r\n }\r\n)\r\n\r\nLoader.displayName = 'Loader'\r\n","import * as React from 'react'\r\nimport { Loader, type LoaderProps } from './Loader'\r\n\r\ninterface LoaderContextValue {\r\n show: (options?: LoaderOptions) => void\r\n hide: () => void\r\n isLoading: boolean\r\n}\r\n\r\ninterface LoaderOptions {\r\n message?: string\r\n variant?: LoaderProps['variant']\r\n scope?: LoaderProps['scope']\r\n isTransparentBg?: boolean\r\n}\r\n\r\nconst LoaderContext = React.createContext<LoaderContextValue | undefined>(\r\n undefined\r\n)\r\n\r\nexport function LoaderProvider({ children }: { children: React.ReactNode }) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [loaderOptions, setLoaderOptions] = React.useState<LoaderOptions>({})\r\n\r\n const show = React.useCallback((options: LoaderOptions = {}) => {\r\n setLoaderOptions(options)\r\n setIsLoading(true)\r\n }, [])\r\n\r\n const hide = React.useCallback(() => {\r\n setIsLoading(false)\r\n // Limpar opções após animação de saída\r\n setTimeout(() => setLoaderOptions({}), 300)\r\n }, [])\r\n\r\n const value = React.useMemo(\r\n () => ({ show, hide, isLoading }),\r\n [show, hide, isLoading]\r\n )\r\n\r\n return (\r\n <LoaderContext.Provider value={value}>\r\n {children}\r\n {isLoading && (\r\n <Loader\r\n variant={loaderOptions.variant}\r\n message={loaderOptions.message}\r\n scope={loaderOptions.scope}\r\n isTransparentBg={loaderOptions.isTransparentBg}\r\n show={isLoading}\r\n />\r\n )}\r\n </LoaderContext.Provider>\r\n )\r\n}\r\n\r\nexport function useLoader() {\r\n const context = React.useContext(LoaderContext)\r\n if (context === undefined) {\r\n throw new Error('useLoader must be used within a LoaderProvider')\r\n }\r\n return context\r\n}\r\n\r\n// Helper function para usar fora de componentes\r\nlet globalLoaderController: LoaderContextValue | null = null\r\n\r\nexport function setGlobalLoader(controller: LoaderContextValue) {\r\n globalLoaderController = controller\r\n}\r\n\r\nexport const loader = {\r\n show: (options?: LoaderOptions) => {\r\n if (globalLoaderController) {\r\n globalLoaderController.show(options)\r\n } else {\r\n console.warn(\r\n 'Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider.'\r\n )\r\n }\r\n },\r\n hide: () => {\r\n if (globalLoaderController) {\r\n globalLoaderController.hide()\r\n } else {\r\n console.warn(\r\n 'Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider.'\r\n )\r\n }\r\n },\r\n}\r\n\r\n// Component que registra o controller global\r\nexport function GlobalLoaderController() {\r\n const loaderController = useLoader()\r\n\r\n React.useEffect(() => {\r\n setGlobalLoader(loaderController)\r\n return () => {\r\n setGlobalLoader(null as any)\r\n }\r\n }, [loaderController])\r\n\r\n return null\r\n}\r\n"]}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import * as React5 from 'react';
1
+ import * as React4 from 'react';
2
2
  import { cva } from 'class-variance-authority';
3
3
  import { clsx } from 'clsx';
4
4
  import { twMerge } from 'tailwind-merge';
@@ -33,7 +33,7 @@ var buttonVariants = cva(
33
33
  }
34
34
  }
35
35
  );
36
- var Button = React5.forwardRef(
36
+ var Button = React4.forwardRef(
37
37
  ({ className, variant, size, ...props }, ref) => {
38
38
  return /* @__PURE__ */ jsx(
39
39
  "button",
@@ -47,17 +47,17 @@ var Button = React5.forwardRef(
47
47
  );
48
48
  Button.displayName = "Button";
49
49
  var inputVariants = cva(
50
- "flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-colors",
50
+ "w-full h-12 px-3 pt-4 pb-2 text-sm bg-background rounded-md border-2 transition-colors focus:outline-none focus:ring-0 disabled:cursor-not-allowed disabled:opacity-50",
51
51
  {
52
52
  variants: {
53
53
  variant: {
54
- default: "border-gray-300 focus-visible:ring-primary",
55
- error: "border-red-500 focus-visible:ring-red-500"
54
+ default: "border-border focus:border-primary",
55
+ error: "border-red-500 focus:border-red-600"
56
56
  },
57
57
  inputSize: {
58
- default: "h-10",
59
- sm: "h-9 text-xs",
60
- lg: "h-11"
58
+ default: "h-12",
59
+ sm: "h-10 pt-3 pb-1",
60
+ lg: "h-14 pt-5 pb-2"
61
61
  }
62
62
  },
63
63
  defaultVariants: {
@@ -66,23 +66,127 @@ var inputVariants = cva(
66
66
  }
67
67
  }
68
68
  );
69
- var Input = React5.forwardRef(
70
- ({ className, variant, inputSize, error, type = "text", ...props }, ref) => {
71
- return /* @__PURE__ */ jsx(
72
- "input",
73
- {
74
- type,
75
- className: cn(
76
- inputVariants({
77
- variant: error ? "error" : variant,
78
- inputSize,
69
+ var Input = React4.forwardRef(
70
+ ({
71
+ className,
72
+ variant,
73
+ inputSize,
74
+ error,
75
+ type = "text",
76
+ label,
77
+ icon: Icon,
78
+ required,
79
+ containerClassName,
80
+ labelClassName,
81
+ ...props
82
+ }, ref) => {
83
+ const inputRef = React4.useRef(null);
84
+ const [showPassword, setShowPassword] = React4.useState(false);
85
+ React4.useImperativeHandle(ref, () => inputRef.current, []);
86
+ const focusInput = React4.useCallback(() => {
87
+ inputRef.current?.focus();
88
+ }, []);
89
+ const togglePasswordVisibility = React4.useCallback(() => {
90
+ setShowPassword((prev) => !prev);
91
+ }, []);
92
+ const inputType = type === "password" ? showPassword ? "text" : "password" : type;
93
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative", containerClassName), children: [
94
+ Icon && /* @__PURE__ */ jsx(
95
+ Icon,
96
+ {
97
+ className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground h-4 w-4 cursor-pointer z-10",
98
+ onClick: focusInput
99
+ }
100
+ ),
101
+ /* @__PURE__ */ jsx(
102
+ "input",
103
+ {
104
+ type: inputType,
105
+ className: cn(
106
+ inputVariants({
107
+ variant: error ? "error" : variant,
108
+ inputSize
109
+ }),
110
+ Icon && "pl-10",
111
+ type === "password" && "pr-11",
79
112
  className
80
- })
81
- ),
82
- ref,
83
- ...props
84
- }
85
- );
113
+ ),
114
+ ref: inputRef,
115
+ ...props
116
+ }
117
+ ),
118
+ label && /* @__PURE__ */ jsxs(
119
+ "label",
120
+ {
121
+ className: cn(
122
+ "absolute left-3 top-[-6px] text-xs font-medium bg-background px-1 cursor-pointer",
123
+ error ? "text-red-500" : "text-foreground",
124
+ Icon && "left-10",
125
+ labelClassName
126
+ ),
127
+ onClick: focusInput,
128
+ children: [
129
+ label,
130
+ required && /* @__PURE__ */ jsx("span", { className: "text-red-500 ml-0.5", children: "*" })
131
+ ]
132
+ }
133
+ ),
134
+ type === "password" && /* @__PURE__ */ jsx(
135
+ "button",
136
+ {
137
+ type: "button",
138
+ onClick: togglePasswordVisibility,
139
+ className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors z-10",
140
+ "aria-label": showPassword ? "Ocultar senha" : "Mostrar senha",
141
+ children: showPassword ? /* @__PURE__ */ jsxs(
142
+ "svg",
143
+ {
144
+ className: "h-5 w-5",
145
+ fill: "none",
146
+ viewBox: "0 0 24 24",
147
+ stroke: "currentColor",
148
+ children: [
149
+ /* @__PURE__ */ jsx(
150
+ "path",
151
+ {
152
+ strokeLinecap: "round",
153
+ strokeLinejoin: "round",
154
+ strokeWidth: 2,
155
+ d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z"
156
+ }
157
+ ),
158
+ /* @__PURE__ */ jsx(
159
+ "path",
160
+ {
161
+ strokeLinecap: "round",
162
+ strokeLinejoin: "round",
163
+ strokeWidth: 2,
164
+ d: "M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
165
+ }
166
+ )
167
+ ]
168
+ }
169
+ ) : /* @__PURE__ */ jsx(
170
+ "svg",
171
+ {
172
+ className: "h-5 w-5",
173
+ fill: "none",
174
+ viewBox: "0 0 24 24",
175
+ stroke: "currentColor",
176
+ children: /* @__PURE__ */ jsx(
177
+ "path",
178
+ {
179
+ strokeLinecap: "round",
180
+ strokeLinejoin: "round",
181
+ strokeWidth: 2,
182
+ d: "M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"
183
+ }
184
+ )
185
+ }
186
+ )
187
+ }
188
+ )
189
+ ] });
86
190
  }
87
191
  );
88
192
  Input.displayName = "Input";
@@ -115,42 +219,6 @@ function Badge({ className, variant, size, ...props }) {
115
219
  return /* @__PURE__ */ jsx("div", { className: cn(badgeVariants({ variant, size }), className), ...props });
116
220
  }
117
221
  Badge.displayName = "Badge";
118
- var spinnerVariants = cva("animate-spin rounded-full border-2 border-current border-t-transparent", {
119
- variants: {
120
- size: {
121
- sm: "h-4 w-4",
122
- default: "h-6 w-6",
123
- lg: "h-8 w-8",
124
- xl: "h-12 w-12"
125
- },
126
- variant: {
127
- primary: "text-primary",
128
- secondary: "text-secondary",
129
- white: "text-white",
130
- muted: "text-muted-foreground"
131
- }
132
- },
133
- defaultVariants: {
134
- size: "default",
135
- variant: "primary"
136
- }
137
- });
138
- var Spinner = React5.forwardRef(
139
- ({ className, size, variant, label = "Loading...", ...props }, ref) => {
140
- return /* @__PURE__ */ jsx(
141
- "div",
142
- {
143
- ref,
144
- role: "status",
145
- "aria-label": label,
146
- className: cn(spinnerVariants({ size, variant }), className),
147
- ...props,
148
- children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: label })
149
- }
150
- );
151
- }
152
- );
153
- Spinner.displayName = "Spinner";
154
222
  var loaderVariants = cva("flex items-center justify-center backdrop-blur-sm", {
155
223
  variants: {
156
224
  variant: {
@@ -248,7 +316,7 @@ function BarsLoader() {
248
316
  i
249
317
  )) });
250
318
  }
251
- var Loader = React5.forwardRef(
319
+ var Loader = React4.forwardRef(
252
320
  ({
253
321
  variant = "default",
254
322
  message,
@@ -298,21 +366,21 @@ var Loader = React5.forwardRef(
298
366
  }
299
367
  );
300
368
  Loader.displayName = "Loader";
301
- var LoaderContext = React5.createContext(
369
+ var LoaderContext = React4.createContext(
302
370
  void 0
303
371
  );
304
372
  function LoaderProvider({ children }) {
305
- const [isLoading, setIsLoading] = React5.useState(false);
306
- const [loaderOptions, setLoaderOptions] = React5.useState({});
307
- const show = React5.useCallback((options = {}) => {
373
+ const [isLoading, setIsLoading] = React4.useState(false);
374
+ const [loaderOptions, setLoaderOptions] = React4.useState({});
375
+ const show = React4.useCallback((options = {}) => {
308
376
  setLoaderOptions(options);
309
377
  setIsLoading(true);
310
378
  }, []);
311
- const hide = React5.useCallback(() => {
379
+ const hide = React4.useCallback(() => {
312
380
  setIsLoading(false);
313
381
  setTimeout(() => setLoaderOptions({}), 300);
314
382
  }, []);
315
- const value = React5.useMemo(
383
+ const value = React4.useMemo(
316
384
  () => ({ show, hide, isLoading }),
317
385
  [show, hide, isLoading]
318
386
  );
@@ -331,7 +399,7 @@ function LoaderProvider({ children }) {
331
399
  ] });
332
400
  }
333
401
  function useLoader() {
334
- const context = React5.useContext(LoaderContext);
402
+ const context = React4.useContext(LoaderContext);
335
403
  if (context === void 0) {
336
404
  throw new Error("useLoader must be used within a LoaderProvider");
337
405
  }
@@ -363,7 +431,7 @@ var loader = {
363
431
  };
364
432
  function GlobalLoaderController() {
365
433
  const loaderController = useLoader();
366
- React5.useEffect(() => {
434
+ React4.useEffect(() => {
367
435
  setGlobalLoader(loaderController);
368
436
  return () => {
369
437
  setGlobalLoader(null);
@@ -372,6 +440,6 @@ function GlobalLoaderController() {
372
440
  return null;
373
441
  }
374
442
 
375
- export { Badge, Button, GlobalLoaderController, Input, Loader, LoaderProvider, Spinner, cn, loader, useLoader };
443
+ export { Badge, Button, GlobalLoaderController, Input, Loader, LoaderProvider, cn, loader, useLoader };
376
444
  //# sourceMappingURL=index.mjs.map
377
445
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/cn.ts","../src/components/Button/Button.tsx","../src/components/Input/Input.tsx","../src/components/Badge/Badge.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Loader/Loader.tsx","../src/components/Loader/LoaderContext.tsx"],"names":["React","cva","React2","jsx","React3","React4","jsxs"],"mappings":"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","file":"index.mjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\n/**\r\n * Merge Tailwind CSS classes\r\n * Combines clsx (conditional classes) with tailwind-merge (deduplicates classes)\r\n *\r\n * @example\r\n * cn('px-4 py-2', isActive && 'bg-primary', className)\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst buttonVariants = cva(\r\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-white hover:bg-primary/90',\r\n destructive: 'bg-red-600 text-white hover:bg-red-700',\r\n outline: 'border border-input hover:bg-accent hover:text-accent-foreground',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-10 px-4 py-2',\r\n sm: 'h-9 px-3',\r\n lg: 'h-11 px-8',\r\n icon: 'h-10 w-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean\r\n}\r\n\r\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, ...props }, ref) => {\r\n return (\r\n <button\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\n\r\nButton.displayName = 'Button'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst inputVariants = cva(\r\n 'flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-colors',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'border-gray-300 focus-visible:ring-primary',\r\n error: 'border-red-500 focus-visible:ring-red-500',\r\n },\r\n inputSize: {\r\n default: 'h-10',\r\n sm: 'h-9 text-xs',\r\n lg: 'h-11',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n inputSize: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface InputProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\r\n VariantProps<typeof inputVariants> {\r\n error?: boolean\r\n}\r\n\r\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n ({ className, variant, inputSize, error, type = 'text', ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(\r\n inputVariants({\r\n variant: error ? 'error' : variant,\r\n inputSize,\r\n className,\r\n })\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\n\r\nInput.displayName = 'Input'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst badgeVariants = cva(\r\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\r\n secondary:\r\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n success:\r\n 'border-transparent bg-green-500 text-white hover:bg-green-600',\r\n warning:\r\n 'border-transparent bg-yellow-500 text-white hover:bg-yellow-600',\r\n error: 'border-transparent bg-red-500 text-white hover:bg-red-600',\r\n info: 'border-transparent bg-blue-500 text-white hover:bg-blue-600',\r\n outline: 'border-gray-300 text-foreground hover:bg-gray-100',\r\n },\r\n size: {\r\n default: 'px-2.5 py-0.5 text-xs',\r\n sm: 'px-2 py-0.5 text-[10px]',\r\n lg: 'px-3 py-1 text-sm',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface BadgeProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof badgeVariants> {}\r\n\r\nexport function Badge({ className, variant, size, ...props }: BadgeProps) {\r\n return (\r\n <div className={cn(badgeVariants({ variant, size }), className)} {...props} />\r\n )\r\n}\r\n\r\nBadge.displayName = 'Badge'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst spinnerVariants = cva('animate-spin rounded-full border-2 border-current border-t-transparent', {\r\n variants: {\r\n size: {\r\n sm: 'h-4 w-4',\r\n default: 'h-6 w-6',\r\n lg: 'h-8 w-8',\r\n xl: 'h-12 w-12',\r\n },\r\n variant: {\r\n primary: 'text-primary',\r\n secondary: 'text-secondary',\r\n white: 'text-white',\r\n muted: 'text-muted-foreground',\r\n },\r\n },\r\n defaultVariants: {\r\n size: 'default',\r\n variant: 'primary',\r\n },\r\n})\r\n\r\nexport interface SpinnerProps\r\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>,\r\n VariantProps<typeof spinnerVariants> {\r\n label?: string\r\n}\r\n\r\nexport const Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\r\n ({ className, size, variant, label = 'Loading...', ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n role=\"status\"\r\n aria-label={label}\r\n className={cn(spinnerVariants({ size, variant }), className)}\r\n {...props}\r\n >\r\n <span className=\"sr-only\">{label}</span>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nSpinner.displayName = 'Spinner'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { motion, AnimatePresence } from 'framer-motion'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst loaderVariants = cva('flex items-center justify-center backdrop-blur-sm', {\r\n variants: {\r\n variant: {\r\n default: '',\r\n spinner: '',\r\n dots: '',\r\n pulse: '',\r\n bars: '',\r\n },\r\n scope: {\r\n global: 'fixed inset-0 z-[9999]',\r\n local: 'absolute inset-0 z-50',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n scope: 'global',\r\n },\r\n})\r\n\r\nexport interface LoaderProps extends VariantProps<typeof loaderVariants> {\r\n message?: string\r\n isTransparentBg?: boolean\r\n show?: boolean\r\n}\r\n\r\nconst containerVariants = {\r\n initial: { opacity: 0, scale: 0.9 },\r\n animate: { opacity: 1, scale: 1 },\r\n exit: { opacity: 0, scale: 0.9 },\r\n}\r\n\r\nfunction SpinnerLoader() {\r\n return (\r\n <motion.div\r\n className=\"h-12 w-12 rounded-full border-4 border-primary border-t-transparent\"\r\n animate={{ rotate: 360 }}\r\n transition={{ duration: 1, repeat: Infinity, ease: 'linear' }}\r\n />\r\n )\r\n}\r\n\r\nfunction DotsLoader() {\r\n return (\r\n <div className=\"flex space-x-2\">\r\n {[0, 1, 2].map((i) => (\r\n <motion.div\r\n key={i}\r\n className=\"h-3 w-3 rounded-full bg-primary\"\r\n initial={{ scale: 0 }}\r\n animate={{ scale: [0, 1, 0] }}\r\n transition={{\r\n duration: 1,\r\n repeat: Infinity,\r\n delay: i * 0.2,\r\n ease: 'easeInOut',\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nfunction PulseLoader() {\r\n return (\r\n <motion.div\r\n className=\"h-12 w-12 rounded-full bg-primary/20\"\r\n initial={{ scale: 0.8 }}\r\n animate={{ scale: 1, opacity: [1, 0.5, 1] }}\r\n transition={{\r\n duration: 1.5,\r\n repeat: Infinity,\r\n ease: 'easeInOut',\r\n }}\r\n >\r\n <motion.div\r\n className=\"h-full w-full rounded-full bg-primary/40\"\r\n initial={{ scale: 0.8 }}\r\n animate={{ scale: 1, opacity: [1, 0, 1] }}\r\n transition={{\r\n duration: 1.5,\r\n repeat: Infinity,\r\n ease: 'easeInOut',\r\n delay: 0.2,\r\n }}\r\n />\r\n </motion.div>\r\n )\r\n}\r\n\r\nfunction BarsLoader() {\r\n return (\r\n <div className=\"flex items-center space-x-1\">\r\n {[0, 1, 2, 3].map((i) => (\r\n <motion.div\r\n key={i}\r\n className=\"h-8 w-1 rounded-full bg-primary\"\r\n initial={{ scaleY: 0.3 }}\r\n animate={{ scaleY: [0.3, 1, 0.3] }}\r\n transition={{\r\n duration: 0.8,\r\n repeat: Infinity,\r\n delay: i * 0.1,\r\n ease: 'easeInOut',\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport const Loader = React.forwardRef<HTMLDivElement, LoaderProps>(\r\n (\r\n {\r\n variant = 'default',\r\n message,\r\n scope = 'global',\r\n isTransparentBg = true,\r\n show = true,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const loaderComponents = {\r\n default: <SpinnerLoader />,\r\n spinner: <SpinnerLoader />,\r\n dots: <DotsLoader />,\r\n pulse: <PulseLoader />,\r\n bars: <BarsLoader />,\r\n }\r\n\r\n if (!show) return null\r\n\r\n return (\r\n <AnimatePresence>\r\n <motion.div\r\n ref={ref}\r\n className={cn(\r\n loaderVariants({ variant, scope }),\r\n isTransparentBg ? 'bg-background/90' : 'bg-background'\r\n )}\r\n initial=\"initial\"\r\n animate=\"animate\"\r\n exit=\"exit\"\r\n variants={containerVariants}\r\n transition={{ duration: 0.2 }}\r\n {...props}\r\n >\r\n <div className=\"flex flex-col items-center gap-4\">\r\n {loaderComponents[variant || 'default']}\r\n {message && (\r\n <motion.p\r\n className=\"text-lg text-muted-foreground\"\r\n initial={{ opacity: 0, y: 10 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -10 }}\r\n transition={{ delay: 0.1 }}\r\n >\r\n {message}\r\n </motion.p>\r\n )}\r\n </div>\r\n </motion.div>\r\n </AnimatePresence>\r\n )\r\n }\r\n)\r\n\r\nLoader.displayName = 'Loader'\r\n","import * as React from 'react'\r\nimport { Loader, type LoaderProps } from './Loader'\r\n\r\ninterface LoaderContextValue {\r\n show: (options?: LoaderOptions) => void\r\n hide: () => void\r\n isLoading: boolean\r\n}\r\n\r\ninterface LoaderOptions {\r\n message?: string\r\n variant?: LoaderProps['variant']\r\n scope?: LoaderProps['scope']\r\n isTransparentBg?: boolean\r\n}\r\n\r\nconst LoaderContext = React.createContext<LoaderContextValue | undefined>(\r\n undefined\r\n)\r\n\r\nexport function LoaderProvider({ children }: { children: React.ReactNode }) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [loaderOptions, setLoaderOptions] = React.useState<LoaderOptions>({})\r\n\r\n const show = React.useCallback((options: LoaderOptions = {}) => {\r\n setLoaderOptions(options)\r\n setIsLoading(true)\r\n }, [])\r\n\r\n const hide = React.useCallback(() => {\r\n setIsLoading(false)\r\n // Limpar opções após animação de saída\r\n setTimeout(() => setLoaderOptions({}), 300)\r\n }, [])\r\n\r\n const value = React.useMemo(\r\n () => ({ show, hide, isLoading }),\r\n [show, hide, isLoading]\r\n )\r\n\r\n return (\r\n <LoaderContext.Provider value={value}>\r\n {children}\r\n {isLoading && (\r\n <Loader\r\n variant={loaderOptions.variant}\r\n message={loaderOptions.message}\r\n scope={loaderOptions.scope}\r\n isTransparentBg={loaderOptions.isTransparentBg}\r\n show={isLoading}\r\n />\r\n )}\r\n </LoaderContext.Provider>\r\n )\r\n}\r\n\r\nexport function useLoader() {\r\n const context = React.useContext(LoaderContext)\r\n if (context === undefined) {\r\n throw new Error('useLoader must be used within a LoaderProvider')\r\n }\r\n return context\r\n}\r\n\r\n// Helper function para usar fora de componentes\r\nlet globalLoaderController: LoaderContextValue | null = null\r\n\r\nexport function setGlobalLoader(controller: LoaderContextValue) {\r\n globalLoaderController = controller\r\n}\r\n\r\nexport const loader = {\r\n show: (options?: LoaderOptions) => {\r\n if (globalLoaderController) {\r\n globalLoaderController.show(options)\r\n } else {\r\n console.warn(\r\n 'Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider.'\r\n )\r\n }\r\n },\r\n hide: () => {\r\n if (globalLoaderController) {\r\n globalLoaderController.hide()\r\n } else {\r\n console.warn(\r\n 'Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider.'\r\n )\r\n }\r\n },\r\n}\r\n\r\n// Component que registra o controller global\r\nexport function GlobalLoaderController() {\r\n const loaderController = useLoader()\r\n\r\n React.useEffect(() => {\r\n setGlobalLoader(loaderController)\r\n return () => {\r\n setGlobalLoader(null as any)\r\n }\r\n }, [loaderController])\r\n\r\n return null\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/utils/cn.ts","../src/components/Button/Button.tsx","../src/components/Input/Input.tsx","../src/components/Badge/Badge.tsx","../src/components/Loader/Loader.tsx","../src/components/Loader/LoaderContext.tsx"],"names":["React","cva","React2","jsx","React3","jsxs"],"mappings":"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","file":"index.mjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\n/**\r\n * Merge Tailwind CSS classes\r\n * Combines clsx (conditional classes) with tailwind-merge (deduplicates classes)\r\n *\r\n * @example\r\n * cn('px-4 py-2', isActive && 'bg-primary', className)\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst buttonVariants = cva(\r\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-white hover:bg-primary/90',\r\n destructive: 'bg-red-600 text-white hover:bg-red-700',\r\n outline: 'border border-input hover:bg-accent hover:text-accent-foreground',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-10 px-4 py-2',\r\n sm: 'h-9 px-3',\r\n lg: 'h-11 px-8',\r\n icon: 'h-10 w-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean\r\n}\r\n\r\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, ...props }, ref) => {\r\n return (\r\n <button\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\n\r\nButton.displayName = 'Button'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst inputVariants = cva(\r\n 'w-full h-12 px-3 pt-4 pb-2 text-sm bg-background rounded-md border-2 transition-colors focus:outline-none focus:ring-0 disabled:cursor-not-allowed disabled:opacity-50',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'border-border focus:border-primary',\r\n error: 'border-red-500 focus:border-red-600',\r\n },\r\n inputSize: {\r\n default: 'h-12',\r\n sm: 'h-10 pt-3 pb-1',\r\n lg: 'h-14 pt-5 pb-2',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n inputSize: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface InputProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\r\n VariantProps<typeof inputVariants> {\r\n label?: string\r\n error?: boolean\r\n icon?: React.ComponentType<any>\r\n containerClassName?: string\r\n labelClassName?: string\r\n}\r\n\r\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n className,\r\n variant,\r\n inputSize,\r\n error,\r\n type = 'text',\r\n label,\r\n icon: Icon,\r\n required,\r\n containerClassName,\r\n labelClassName,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const inputRef = React.useRef<HTMLInputElement | null>(null)\r\n const [showPassword, setShowPassword] = React.useState(false)\r\n\r\n React.useImperativeHandle(ref, () => inputRef.current!, [])\r\n\r\n const focusInput = React.useCallback(() => {\r\n inputRef.current?.focus()\r\n }, [])\r\n\r\n const togglePasswordVisibility = React.useCallback(() => {\r\n setShowPassword((prev) => !prev)\r\n }, [])\r\n\r\n const inputType = type === 'password' ? (showPassword ? 'text' : 'password') : type\r\n\r\n return (\r\n <div className={cn('relative', containerClassName)}>\r\n {/* Icon */}\r\n {Icon && (\r\n <Icon\r\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground h-4 w-4 cursor-pointer z-10\"\r\n onClick={focusInput}\r\n />\r\n )}\r\n\r\n {/* Input */}\r\n <input\r\n type={inputType}\r\n className={cn(\r\n inputVariants({\r\n variant: error ? 'error' : variant,\r\n inputSize,\r\n }),\r\n Icon && 'pl-10',\r\n type === 'password' && 'pr-11',\r\n className\r\n )}\r\n ref={inputRef}\r\n {...props}\r\n />\r\n\r\n {/* Floating Label */}\r\n {label && (\r\n <label\r\n className={cn(\r\n 'absolute left-3 top-[-6px] text-xs font-medium bg-background px-1 cursor-pointer',\r\n error ? 'text-red-500' : 'text-foreground',\r\n Icon && 'left-10',\r\n labelClassName\r\n )}\r\n onClick={focusInput}\r\n >\r\n {label}\r\n {required && <span className=\"text-red-500 ml-0.5\">*</span>}\r\n </label>\r\n )}\r\n\r\n {/* Password Toggle */}\r\n {type === 'password' && (\r\n <button\r\n type=\"button\"\r\n onClick={togglePasswordVisibility}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors z-10\"\r\n aria-label={showPassword ? 'Ocultar senha' : 'Mostrar senha'}\r\n >\r\n {showPassword ? (\r\n <svg\r\n className=\"h-5 w-5\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\r\n />\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\"\r\n />\r\n </svg>\r\n ) : (\r\n <svg\r\n className=\"h-5 w-5\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\"\r\n />\r\n </svg>\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nInput.displayName = 'Input'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst badgeVariants = cva(\r\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\r\n secondary:\r\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n success:\r\n 'border-transparent bg-green-500 text-white hover:bg-green-600',\r\n warning:\r\n 'border-transparent bg-yellow-500 text-white hover:bg-yellow-600',\r\n error: 'border-transparent bg-red-500 text-white hover:bg-red-600',\r\n info: 'border-transparent bg-blue-500 text-white hover:bg-blue-600',\r\n outline: 'border-gray-300 text-foreground hover:bg-gray-100',\r\n },\r\n size: {\r\n default: 'px-2.5 py-0.5 text-xs',\r\n sm: 'px-2 py-0.5 text-[10px]',\r\n lg: 'px-3 py-1 text-sm',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n)\r\n\r\nexport interface BadgeProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof badgeVariants> {}\r\n\r\nexport function Badge({ className, variant, size, ...props }: BadgeProps) {\r\n return (\r\n <div className={cn(badgeVariants({ variant, size }), className)} {...props} />\r\n )\r\n}\r\n\r\nBadge.displayName = 'Badge'\r\n","import * as React from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { motion, AnimatePresence } from 'framer-motion'\r\nimport { cn } from '../../utils/cn'\r\n\r\nconst loaderVariants = cva('flex items-center justify-center backdrop-blur-sm', {\r\n variants: {\r\n variant: {\r\n default: '',\r\n spinner: '',\r\n dots: '',\r\n pulse: '',\r\n bars: '',\r\n },\r\n scope: {\r\n global: 'fixed inset-0 z-[9999]',\r\n local: 'absolute inset-0 z-50',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n scope: 'global',\r\n },\r\n})\r\n\r\nexport interface LoaderProps extends VariantProps<typeof loaderVariants> {\r\n message?: string\r\n isTransparentBg?: boolean\r\n show?: boolean\r\n}\r\n\r\nconst containerVariants = {\r\n initial: { opacity: 0, scale: 0.9 },\r\n animate: { opacity: 1, scale: 1 },\r\n exit: { opacity: 0, scale: 0.9 },\r\n}\r\n\r\nfunction SpinnerLoader() {\r\n return (\r\n <motion.div\r\n className=\"h-12 w-12 rounded-full border-4 border-primary border-t-transparent\"\r\n animate={{ rotate: 360 }}\r\n transition={{ duration: 1, repeat: Infinity, ease: 'linear' }}\r\n />\r\n )\r\n}\r\n\r\nfunction DotsLoader() {\r\n return (\r\n <div className=\"flex space-x-2\">\r\n {[0, 1, 2].map((i) => (\r\n <motion.div\r\n key={i}\r\n className=\"h-3 w-3 rounded-full bg-primary\"\r\n initial={{ scale: 0 }}\r\n animate={{ scale: [0, 1, 0] }}\r\n transition={{\r\n duration: 1,\r\n repeat: Infinity,\r\n delay: i * 0.2,\r\n ease: 'easeInOut',\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nfunction PulseLoader() {\r\n return (\r\n <motion.div\r\n className=\"h-12 w-12 rounded-full bg-primary/20\"\r\n initial={{ scale: 0.8 }}\r\n animate={{ scale: 1, opacity: [1, 0.5, 1] }}\r\n transition={{\r\n duration: 1.5,\r\n repeat: Infinity,\r\n ease: 'easeInOut',\r\n }}\r\n >\r\n <motion.div\r\n className=\"h-full w-full rounded-full bg-primary/40\"\r\n initial={{ scale: 0.8 }}\r\n animate={{ scale: 1, opacity: [1, 0, 1] }}\r\n transition={{\r\n duration: 1.5,\r\n repeat: Infinity,\r\n ease: 'easeInOut',\r\n delay: 0.2,\r\n }}\r\n />\r\n </motion.div>\r\n )\r\n}\r\n\r\nfunction BarsLoader() {\r\n return (\r\n <div className=\"flex items-center space-x-1\">\r\n {[0, 1, 2, 3].map((i) => (\r\n <motion.div\r\n key={i}\r\n className=\"h-8 w-1 rounded-full bg-primary\"\r\n initial={{ scaleY: 0.3 }}\r\n animate={{ scaleY: [0.3, 1, 0.3] }}\r\n transition={{\r\n duration: 0.8,\r\n repeat: Infinity,\r\n delay: i * 0.1,\r\n ease: 'easeInOut',\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport const Loader = React.forwardRef<HTMLDivElement, LoaderProps>(\r\n (\r\n {\r\n variant = 'default',\r\n message,\r\n scope = 'global',\r\n isTransparentBg = true,\r\n show = true,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const loaderComponents = {\r\n default: <SpinnerLoader />,\r\n spinner: <SpinnerLoader />,\r\n dots: <DotsLoader />,\r\n pulse: <PulseLoader />,\r\n bars: <BarsLoader />,\r\n }\r\n\r\n if (!show) return null\r\n\r\n return (\r\n <AnimatePresence>\r\n <motion.div\r\n ref={ref}\r\n className={cn(\r\n loaderVariants({ variant, scope }),\r\n isTransparentBg ? 'bg-background/90' : 'bg-background'\r\n )}\r\n initial=\"initial\"\r\n animate=\"animate\"\r\n exit=\"exit\"\r\n variants={containerVariants}\r\n transition={{ duration: 0.2 }}\r\n {...props}\r\n >\r\n <div className=\"flex flex-col items-center gap-4\">\r\n {loaderComponents[variant || 'default']}\r\n {message && (\r\n <motion.p\r\n className=\"text-lg text-muted-foreground\"\r\n initial={{ opacity: 0, y: 10 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -10 }}\r\n transition={{ delay: 0.1 }}\r\n >\r\n {message}\r\n </motion.p>\r\n )}\r\n </div>\r\n </motion.div>\r\n </AnimatePresence>\r\n )\r\n }\r\n)\r\n\r\nLoader.displayName = 'Loader'\r\n","import * as React from 'react'\r\nimport { Loader, type LoaderProps } from './Loader'\r\n\r\ninterface LoaderContextValue {\r\n show: (options?: LoaderOptions) => void\r\n hide: () => void\r\n isLoading: boolean\r\n}\r\n\r\ninterface LoaderOptions {\r\n message?: string\r\n variant?: LoaderProps['variant']\r\n scope?: LoaderProps['scope']\r\n isTransparentBg?: boolean\r\n}\r\n\r\nconst LoaderContext = React.createContext<LoaderContextValue | undefined>(\r\n undefined\r\n)\r\n\r\nexport function LoaderProvider({ children }: { children: React.ReactNode }) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [loaderOptions, setLoaderOptions] = React.useState<LoaderOptions>({})\r\n\r\n const show = React.useCallback((options: LoaderOptions = {}) => {\r\n setLoaderOptions(options)\r\n setIsLoading(true)\r\n }, [])\r\n\r\n const hide = React.useCallback(() => {\r\n setIsLoading(false)\r\n // Limpar opções após animação de saída\r\n setTimeout(() => setLoaderOptions({}), 300)\r\n }, [])\r\n\r\n const value = React.useMemo(\r\n () => ({ show, hide, isLoading }),\r\n [show, hide, isLoading]\r\n )\r\n\r\n return (\r\n <LoaderContext.Provider value={value}>\r\n {children}\r\n {isLoading && (\r\n <Loader\r\n variant={loaderOptions.variant}\r\n message={loaderOptions.message}\r\n scope={loaderOptions.scope}\r\n isTransparentBg={loaderOptions.isTransparentBg}\r\n show={isLoading}\r\n />\r\n )}\r\n </LoaderContext.Provider>\r\n )\r\n}\r\n\r\nexport function useLoader() {\r\n const context = React.useContext(LoaderContext)\r\n if (context === undefined) {\r\n throw new Error('useLoader must be used within a LoaderProvider')\r\n }\r\n return context\r\n}\r\n\r\n// Helper function para usar fora de componentes\r\nlet globalLoaderController: LoaderContextValue | null = null\r\n\r\nexport function setGlobalLoader(controller: LoaderContextValue) {\r\n globalLoaderController = controller\r\n}\r\n\r\nexport const loader = {\r\n show: (options?: LoaderOptions) => {\r\n if (globalLoaderController) {\r\n globalLoaderController.show(options)\r\n } else {\r\n console.warn(\r\n 'Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider.'\r\n )\r\n }\r\n },\r\n hide: () => {\r\n if (globalLoaderController) {\r\n globalLoaderController.hide()\r\n } else {\r\n console.warn(\r\n 'Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider.'\r\n )\r\n }\r\n },\r\n}\r\n\r\n// Component que registra o controller global\r\nexport function GlobalLoaderController() {\r\n const loaderController = useLoader()\r\n\r\n React.useEffect(() => {\r\n setGlobalLoader(loaderController)\r\n return () => {\r\n setGlobalLoader(null as any)\r\n }\r\n }, [loaderController])\r\n\r\n return null\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@facter/ds-core",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Facter Design System - Core components (Button, Input, Badge, Spinner, Loader)",
5
5
  "author": "Facter",
6
6
  "license": "MIT",
@@ -45,8 +45,13 @@
45
45
  },
46
46
  "homepage": "https://github.com/tamicaires/facter-design-system#readme",
47
47
  "peerDependencies": {
48
- "react": "^18.0.0",
49
- "react-dom": "^18.0.0"
48
+ "react": "^18.0.0 || ^19.0.0",
49
+ "react-dom": "^18.0.0 || ^19.0.0"
50
+ },
51
+ "peerDependenciesMeta": {
52
+ "react-icons": {
53
+ "optional": true
54
+ }
50
55
  },
51
56
  "devDependencies": {
52
57
  "@testing-library/jest-dom": "^6.1.5",