@facter/ds-core 1.0.0

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 ADDED
@@ -0,0 +1,28 @@
1
+ # @facter/ds-core
2
+
3
+ Core components for Facter Design System.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @facter/ds-core
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```tsx
14
+ import { Button } from '@facter/ds-core'
15
+
16
+ function App() {
17
+ return <Button variant="default">Click me</Button>
18
+ }
19
+ ```
20
+
21
+ ## Components
22
+
23
+ - Button
24
+ - (More to come...)
25
+
26
+ ## Utils
27
+
28
+ - `cn()` - Merge Tailwind classes
@@ -0,0 +1,86 @@
1
+ import * as class_variance_authority_types from 'class-variance-authority/types';
2
+ import * as React from 'react';
3
+ import { VariantProps } from 'class-variance-authority';
4
+ import * as react_jsx_runtime from 'react/jsx-runtime';
5
+ import { ClassValue } from 'clsx';
6
+
7
+ declare const buttonVariants: (props?: ({
8
+ variant?: "default" | "destructive" | "outline" | "ghost" | "link" | null | undefined;
9
+ size?: "default" | "sm" | "lg" | "icon" | null | undefined;
10
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
11
+ interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
12
+ asChild?: boolean;
13
+ }
14
+ declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
15
+
16
+ declare const inputVariants: (props?: ({
17
+ variant?: "default" | "error" | null | undefined;
18
+ inputSize?: "default" | "sm" | "lg" | null | undefined;
19
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
20
+ interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>, VariantProps<typeof inputVariants> {
21
+ error?: boolean;
22
+ }
23
+ declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
24
+
25
+ declare const badgeVariants: (props?: ({
26
+ variant?: "default" | "outline" | "error" | "secondary" | "success" | "warning" | "info" | null | undefined;
27
+ size?: "default" | "sm" | "lg" | null | undefined;
28
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
29
+ interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
30
+ }
31
+ declare function Badge({ className, variant, size, ...props }: BadgeProps): react_jsx_runtime.JSX.Element;
32
+ declare namespace Badge {
33
+ var displayName: string;
34
+ }
35
+
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
+ declare const loaderVariants: (props?: ({
46
+ variant?: "default" | "spinner" | "dots" | "pulse" | "bars" | null | undefined;
47
+ scope?: "global" | "local" | null | undefined;
48
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
49
+ interface LoaderProps extends VariantProps<typeof loaderVariants> {
50
+ message?: string;
51
+ isTransparentBg?: boolean;
52
+ show?: boolean;
53
+ }
54
+ declare const Loader: React.ForwardRefExoticComponent<LoaderProps & React.RefAttributes<HTMLDivElement>>;
55
+
56
+ interface LoaderContextValue {
57
+ show: (options?: LoaderOptions) => void;
58
+ hide: () => void;
59
+ isLoading: boolean;
60
+ }
61
+ interface LoaderOptions {
62
+ message?: string;
63
+ variant?: LoaderProps['variant'];
64
+ scope?: LoaderProps['scope'];
65
+ isTransparentBg?: boolean;
66
+ }
67
+ declare function LoaderProvider({ children }: {
68
+ children: React.ReactNode;
69
+ }): react_jsx_runtime.JSX.Element;
70
+ declare function useLoader(): LoaderContextValue;
71
+ declare const loader: {
72
+ show: (options?: LoaderOptions) => void;
73
+ hide: () => void;
74
+ };
75
+ declare function GlobalLoaderController(): null;
76
+
77
+ /**
78
+ * Merge Tailwind CSS classes
79
+ * Combines clsx (conditional classes) with tailwind-merge (deduplicates classes)
80
+ *
81
+ * @example
82
+ * cn('px-4 py-2', isActive && 'bg-primary', className)
83
+ */
84
+ declare function cn(...inputs: ClassValue[]): string;
85
+
86
+ export { Badge, type BadgeProps, Button, type ButtonProps, GlobalLoaderController, Input, type InputProps, Loader, type LoaderProps, LoaderProvider, Spinner, type SpinnerProps, cn, loader, useLoader };
@@ -0,0 +1,86 @@
1
+ import * as class_variance_authority_types from 'class-variance-authority/types';
2
+ import * as React from 'react';
3
+ import { VariantProps } from 'class-variance-authority';
4
+ import * as react_jsx_runtime from 'react/jsx-runtime';
5
+ import { ClassValue } from 'clsx';
6
+
7
+ declare const buttonVariants: (props?: ({
8
+ variant?: "default" | "destructive" | "outline" | "ghost" | "link" | null | undefined;
9
+ size?: "default" | "sm" | "lg" | "icon" | null | undefined;
10
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
11
+ interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
12
+ asChild?: boolean;
13
+ }
14
+ declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
15
+
16
+ declare const inputVariants: (props?: ({
17
+ variant?: "default" | "error" | null | undefined;
18
+ inputSize?: "default" | "sm" | "lg" | null | undefined;
19
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
20
+ interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>, VariantProps<typeof inputVariants> {
21
+ error?: boolean;
22
+ }
23
+ declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
24
+
25
+ declare const badgeVariants: (props?: ({
26
+ variant?: "default" | "outline" | "error" | "secondary" | "success" | "warning" | "info" | null | undefined;
27
+ size?: "default" | "sm" | "lg" | null | undefined;
28
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
29
+ interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
30
+ }
31
+ declare function Badge({ className, variant, size, ...props }: BadgeProps): react_jsx_runtime.JSX.Element;
32
+ declare namespace Badge {
33
+ var displayName: string;
34
+ }
35
+
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
+ declare const loaderVariants: (props?: ({
46
+ variant?: "default" | "spinner" | "dots" | "pulse" | "bars" | null | undefined;
47
+ scope?: "global" | "local" | null | undefined;
48
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
49
+ interface LoaderProps extends VariantProps<typeof loaderVariants> {
50
+ message?: string;
51
+ isTransparentBg?: boolean;
52
+ show?: boolean;
53
+ }
54
+ declare const Loader: React.ForwardRefExoticComponent<LoaderProps & React.RefAttributes<HTMLDivElement>>;
55
+
56
+ interface LoaderContextValue {
57
+ show: (options?: LoaderOptions) => void;
58
+ hide: () => void;
59
+ isLoading: boolean;
60
+ }
61
+ interface LoaderOptions {
62
+ message?: string;
63
+ variant?: LoaderProps['variant'];
64
+ scope?: LoaderProps['scope'];
65
+ isTransparentBg?: boolean;
66
+ }
67
+ declare function LoaderProvider({ children }: {
68
+ children: React.ReactNode;
69
+ }): react_jsx_runtime.JSX.Element;
70
+ declare function useLoader(): LoaderContextValue;
71
+ declare const loader: {
72
+ show: (options?: LoaderOptions) => void;
73
+ hide: () => void;
74
+ };
75
+ declare function GlobalLoaderController(): null;
76
+
77
+ /**
78
+ * Merge Tailwind CSS classes
79
+ * Combines clsx (conditional classes) with tailwind-merge (deduplicates classes)
80
+ *
81
+ * @example
82
+ * cn('px-4 py-2', isActive && 'bg-primary', className)
83
+ */
84
+ declare function cn(...inputs: ClassValue[]): string;
85
+
86
+ export { Badge, type BadgeProps, Button, type ButtonProps, GlobalLoaderController, Input, type InputProps, Loader, type LoaderProps, LoaderProvider, Spinner, type SpinnerProps, cn, loader, useLoader };
package/dist/index.js ADDED
@@ -0,0 +1,408 @@
1
+ 'use strict';
2
+
3
+ var React5 = require('react');
4
+ var classVarianceAuthority = require('class-variance-authority');
5
+ var clsx = require('clsx');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+ var framerMotion = require('framer-motion');
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var React5__namespace = /*#__PURE__*/_interopNamespace(React5);
29
+
30
+ // src/components/Button/Button.tsx
31
+ function cn(...inputs) {
32
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
33
+ }
34
+ var buttonVariants = classVarianceAuthority.cva(
35
+ "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",
36
+ {
37
+ variants: {
38
+ variant: {
39
+ default: "bg-primary text-white hover:bg-primary/90",
40
+ destructive: "bg-red-600 text-white hover:bg-red-700",
41
+ outline: "border border-input hover:bg-accent hover:text-accent-foreground",
42
+ ghost: "hover:bg-accent hover:text-accent-foreground",
43
+ link: "text-primary underline-offset-4 hover:underline"
44
+ },
45
+ size: {
46
+ default: "h-10 px-4 py-2",
47
+ sm: "h-9 px-3",
48
+ lg: "h-11 px-8",
49
+ icon: "h-10 w-10"
50
+ }
51
+ },
52
+ defaultVariants: {
53
+ variant: "default",
54
+ size: "default"
55
+ }
56
+ }
57
+ );
58
+ var Button = React5__namespace.forwardRef(
59
+ ({ className, variant, size, ...props }, ref) => {
60
+ return /* @__PURE__ */ jsxRuntime.jsx(
61
+ "button",
62
+ {
63
+ className: cn(buttonVariants({ variant, size, className })),
64
+ ref,
65
+ ...props
66
+ }
67
+ );
68
+ }
69
+ );
70
+ Button.displayName = "Button";
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",
73
+ {
74
+ variants: {
75
+ variant: {
76
+ default: "border-gray-300 focus-visible:ring-primary",
77
+ error: "border-red-500 focus-visible:ring-red-500"
78
+ },
79
+ inputSize: {
80
+ default: "h-10",
81
+ sm: "h-9 text-xs",
82
+ lg: "h-11"
83
+ }
84
+ },
85
+ defaultVariants: {
86
+ variant: "default",
87
+ inputSize: "default"
88
+ }
89
+ }
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,
101
+ className
102
+ })
103
+ ),
104
+ ref,
105
+ ...props
106
+ }
107
+ );
108
+ }
109
+ );
110
+ Input.displayName = "Input";
111
+ var badgeVariants = classVarianceAuthority.cva(
112
+ "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",
113
+ {
114
+ variants: {
115
+ variant: {
116
+ default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
117
+ secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
118
+ success: "border-transparent bg-green-500 text-white hover:bg-green-600",
119
+ warning: "border-transparent bg-yellow-500 text-white hover:bg-yellow-600",
120
+ error: "border-transparent bg-red-500 text-white hover:bg-red-600",
121
+ info: "border-transparent bg-blue-500 text-white hover:bg-blue-600",
122
+ outline: "border-gray-300 text-foreground hover:bg-gray-100"
123
+ },
124
+ size: {
125
+ default: "px-2.5 py-0.5 text-xs",
126
+ sm: "px-2 py-0.5 text-[10px]",
127
+ lg: "px-3 py-1 text-sm"
128
+ }
129
+ },
130
+ defaultVariants: {
131
+ variant: "default",
132
+ size: "default"
133
+ }
134
+ }
135
+ );
136
+ function Badge({ className, variant, size, ...props }) {
137
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(badgeVariants({ variant, size }), className), ...props });
138
+ }
139
+ 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
+ var loaderVariants = classVarianceAuthority.cva("flex items-center justify-center backdrop-blur-sm", {
177
+ variants: {
178
+ variant: {
179
+ default: "",
180
+ spinner: "",
181
+ dots: "",
182
+ pulse: "",
183
+ bars: ""
184
+ },
185
+ scope: {
186
+ global: "fixed inset-0 z-[9999]",
187
+ local: "absolute inset-0 z-50"
188
+ }
189
+ },
190
+ defaultVariants: {
191
+ variant: "default",
192
+ scope: "global"
193
+ }
194
+ });
195
+ var containerVariants = {
196
+ initial: { opacity: 0, scale: 0.9 },
197
+ animate: { opacity: 1, scale: 1 },
198
+ exit: { opacity: 0, scale: 0.9 }
199
+ };
200
+ function SpinnerLoader() {
201
+ return /* @__PURE__ */ jsxRuntime.jsx(
202
+ framerMotion.motion.div,
203
+ {
204
+ className: "h-12 w-12 rounded-full border-4 border-primary border-t-transparent",
205
+ animate: { rotate: 360 },
206
+ transition: { duration: 1, repeat: Infinity, ease: "linear" }
207
+ }
208
+ );
209
+ }
210
+ function DotsLoader() {
211
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex space-x-2", children: [0, 1, 2].map((i) => /* @__PURE__ */ jsxRuntime.jsx(
212
+ framerMotion.motion.div,
213
+ {
214
+ className: "h-3 w-3 rounded-full bg-primary",
215
+ initial: { scale: 0 },
216
+ animate: { scale: [0, 1, 0] },
217
+ transition: {
218
+ duration: 1,
219
+ repeat: Infinity,
220
+ delay: i * 0.2,
221
+ ease: "easeInOut"
222
+ }
223
+ },
224
+ i
225
+ )) });
226
+ }
227
+ function PulseLoader() {
228
+ return /* @__PURE__ */ jsxRuntime.jsx(
229
+ framerMotion.motion.div,
230
+ {
231
+ className: "h-12 w-12 rounded-full bg-primary/20",
232
+ initial: { scale: 0.8 },
233
+ animate: { scale: 1, opacity: [1, 0.5, 1] },
234
+ transition: {
235
+ duration: 1.5,
236
+ repeat: Infinity,
237
+ ease: "easeInOut"
238
+ },
239
+ children: /* @__PURE__ */ jsxRuntime.jsx(
240
+ framerMotion.motion.div,
241
+ {
242
+ className: "h-full w-full rounded-full bg-primary/40",
243
+ initial: { scale: 0.8 },
244
+ animate: { scale: 1, opacity: [1, 0, 1] },
245
+ transition: {
246
+ duration: 1.5,
247
+ repeat: Infinity,
248
+ ease: "easeInOut",
249
+ delay: 0.2
250
+ }
251
+ }
252
+ )
253
+ }
254
+ );
255
+ }
256
+ function BarsLoader() {
257
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center space-x-1", children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ jsxRuntime.jsx(
258
+ framerMotion.motion.div,
259
+ {
260
+ className: "h-8 w-1 rounded-full bg-primary",
261
+ initial: { scaleY: 0.3 },
262
+ animate: { scaleY: [0.3, 1, 0.3] },
263
+ transition: {
264
+ duration: 0.8,
265
+ repeat: Infinity,
266
+ delay: i * 0.1,
267
+ ease: "easeInOut"
268
+ }
269
+ },
270
+ i
271
+ )) });
272
+ }
273
+ var Loader = React5__namespace.forwardRef(
274
+ ({
275
+ variant = "default",
276
+ message,
277
+ scope = "global",
278
+ isTransparentBg = true,
279
+ show = true,
280
+ ...props
281
+ }, ref) => {
282
+ const loaderComponents = {
283
+ default: /* @__PURE__ */ jsxRuntime.jsx(SpinnerLoader, {}),
284
+ spinner: /* @__PURE__ */ jsxRuntime.jsx(SpinnerLoader, {}),
285
+ dots: /* @__PURE__ */ jsxRuntime.jsx(DotsLoader, {}),
286
+ pulse: /* @__PURE__ */ jsxRuntime.jsx(PulseLoader, {}),
287
+ bars: /* @__PURE__ */ jsxRuntime.jsx(BarsLoader, {})
288
+ };
289
+ if (!show) return null;
290
+ return /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { children: /* @__PURE__ */ jsxRuntime.jsx(
291
+ framerMotion.motion.div,
292
+ {
293
+ ref,
294
+ className: cn(
295
+ loaderVariants({ variant, scope }),
296
+ isTransparentBg ? "bg-background/90" : "bg-background"
297
+ ),
298
+ initial: "initial",
299
+ animate: "animate",
300
+ exit: "exit",
301
+ variants: containerVariants,
302
+ transition: { duration: 0.2 },
303
+ ...props,
304
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-4", children: [
305
+ loaderComponents[variant || "default"],
306
+ message && /* @__PURE__ */ jsxRuntime.jsx(
307
+ framerMotion.motion.p,
308
+ {
309
+ className: "text-lg text-muted-foreground",
310
+ initial: { opacity: 0, y: 10 },
311
+ animate: { opacity: 1, y: 0 },
312
+ exit: { opacity: 0, y: -10 },
313
+ transition: { delay: 0.1 },
314
+ children: message
315
+ }
316
+ )
317
+ ] })
318
+ }
319
+ ) });
320
+ }
321
+ );
322
+ Loader.displayName = "Loader";
323
+ var LoaderContext = React5__namespace.createContext(
324
+ void 0
325
+ );
326
+ 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 = {}) => {
330
+ setLoaderOptions(options);
331
+ setIsLoading(true);
332
+ }, []);
333
+ const hide = React5__namespace.useCallback(() => {
334
+ setIsLoading(false);
335
+ setTimeout(() => setLoaderOptions({}), 300);
336
+ }, []);
337
+ const value = React5__namespace.useMemo(
338
+ () => ({ show, hide, isLoading }),
339
+ [show, hide, isLoading]
340
+ );
341
+ return /* @__PURE__ */ jsxRuntime.jsxs(LoaderContext.Provider, { value, children: [
342
+ children,
343
+ isLoading && /* @__PURE__ */ jsxRuntime.jsx(
344
+ Loader,
345
+ {
346
+ variant: loaderOptions.variant,
347
+ message: loaderOptions.message,
348
+ scope: loaderOptions.scope,
349
+ isTransparentBg: loaderOptions.isTransparentBg,
350
+ show: isLoading
351
+ }
352
+ )
353
+ ] });
354
+ }
355
+ function useLoader() {
356
+ const context = React5__namespace.useContext(LoaderContext);
357
+ if (context === void 0) {
358
+ throw new Error("useLoader must be used within a LoaderProvider");
359
+ }
360
+ return context;
361
+ }
362
+ var globalLoaderController = null;
363
+ function setGlobalLoader(controller) {
364
+ globalLoaderController = controller;
365
+ }
366
+ var loader = {
367
+ show: (options) => {
368
+ if (globalLoaderController) {
369
+ globalLoaderController.show(options);
370
+ } else {
371
+ console.warn(
372
+ "Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider."
373
+ );
374
+ }
375
+ },
376
+ hide: () => {
377
+ if (globalLoaderController) {
378
+ globalLoaderController.hide();
379
+ } else {
380
+ console.warn(
381
+ "Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider."
382
+ );
383
+ }
384
+ }
385
+ };
386
+ function GlobalLoaderController() {
387
+ const loaderController = useLoader();
388
+ React5__namespace.useEffect(() => {
389
+ setGlobalLoader(loaderController);
390
+ return () => {
391
+ setGlobalLoader(null);
392
+ };
393
+ }, [loaderController]);
394
+ return null;
395
+ }
396
+
397
+ exports.Badge = Badge;
398
+ exports.Button = Button;
399
+ exports.GlobalLoaderController = GlobalLoaderController;
400
+ exports.Input = Input;
401
+ exports.Loader = Loader;
402
+ exports.LoaderProvider = LoaderProvider;
403
+ exports.Spinner = Spinner;
404
+ exports.cn = cn;
405
+ exports.loader = loader;
406
+ exports.useLoader = useLoader;
407
+ //# sourceMappingURL=index.js.map
408
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,377 @@
1
+ import * as React5 from 'react';
2
+ import { cva } from 'class-variance-authority';
3
+ import { clsx } from 'clsx';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+ import { AnimatePresence, motion } from 'framer-motion';
7
+
8
+ // src/components/Button/Button.tsx
9
+ function cn(...inputs) {
10
+ return twMerge(clsx(inputs));
11
+ }
12
+ var buttonVariants = cva(
13
+ "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",
14
+ {
15
+ variants: {
16
+ variant: {
17
+ default: "bg-primary text-white hover:bg-primary/90",
18
+ destructive: "bg-red-600 text-white hover:bg-red-700",
19
+ outline: "border border-input hover:bg-accent hover:text-accent-foreground",
20
+ ghost: "hover:bg-accent hover:text-accent-foreground",
21
+ link: "text-primary underline-offset-4 hover:underline"
22
+ },
23
+ size: {
24
+ default: "h-10 px-4 py-2",
25
+ sm: "h-9 px-3",
26
+ lg: "h-11 px-8",
27
+ icon: "h-10 w-10"
28
+ }
29
+ },
30
+ defaultVariants: {
31
+ variant: "default",
32
+ size: "default"
33
+ }
34
+ }
35
+ );
36
+ var Button = React5.forwardRef(
37
+ ({ className, variant, size, ...props }, ref) => {
38
+ return /* @__PURE__ */ jsx(
39
+ "button",
40
+ {
41
+ className: cn(buttonVariants({ variant, size, className })),
42
+ ref,
43
+ ...props
44
+ }
45
+ );
46
+ }
47
+ );
48
+ Button.displayName = "Button";
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",
51
+ {
52
+ variants: {
53
+ variant: {
54
+ default: "border-gray-300 focus-visible:ring-primary",
55
+ error: "border-red-500 focus-visible:ring-red-500"
56
+ },
57
+ inputSize: {
58
+ default: "h-10",
59
+ sm: "h-9 text-xs",
60
+ lg: "h-11"
61
+ }
62
+ },
63
+ defaultVariants: {
64
+ variant: "default",
65
+ inputSize: "default"
66
+ }
67
+ }
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,
79
+ className
80
+ })
81
+ ),
82
+ ref,
83
+ ...props
84
+ }
85
+ );
86
+ }
87
+ );
88
+ Input.displayName = "Input";
89
+ var badgeVariants = cva(
90
+ "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",
91
+ {
92
+ variants: {
93
+ variant: {
94
+ default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
95
+ secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
96
+ success: "border-transparent bg-green-500 text-white hover:bg-green-600",
97
+ warning: "border-transparent bg-yellow-500 text-white hover:bg-yellow-600",
98
+ error: "border-transparent bg-red-500 text-white hover:bg-red-600",
99
+ info: "border-transparent bg-blue-500 text-white hover:bg-blue-600",
100
+ outline: "border-gray-300 text-foreground hover:bg-gray-100"
101
+ },
102
+ size: {
103
+ default: "px-2.5 py-0.5 text-xs",
104
+ sm: "px-2 py-0.5 text-[10px]",
105
+ lg: "px-3 py-1 text-sm"
106
+ }
107
+ },
108
+ defaultVariants: {
109
+ variant: "default",
110
+ size: "default"
111
+ }
112
+ }
113
+ );
114
+ function Badge({ className, variant, size, ...props }) {
115
+ return /* @__PURE__ */ jsx("div", { className: cn(badgeVariants({ variant, size }), className), ...props });
116
+ }
117
+ 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
+ var loaderVariants = cva("flex items-center justify-center backdrop-blur-sm", {
155
+ variants: {
156
+ variant: {
157
+ default: "",
158
+ spinner: "",
159
+ dots: "",
160
+ pulse: "",
161
+ bars: ""
162
+ },
163
+ scope: {
164
+ global: "fixed inset-0 z-[9999]",
165
+ local: "absolute inset-0 z-50"
166
+ }
167
+ },
168
+ defaultVariants: {
169
+ variant: "default",
170
+ scope: "global"
171
+ }
172
+ });
173
+ var containerVariants = {
174
+ initial: { opacity: 0, scale: 0.9 },
175
+ animate: { opacity: 1, scale: 1 },
176
+ exit: { opacity: 0, scale: 0.9 }
177
+ };
178
+ function SpinnerLoader() {
179
+ return /* @__PURE__ */ jsx(
180
+ motion.div,
181
+ {
182
+ className: "h-12 w-12 rounded-full border-4 border-primary border-t-transparent",
183
+ animate: { rotate: 360 },
184
+ transition: { duration: 1, repeat: Infinity, ease: "linear" }
185
+ }
186
+ );
187
+ }
188
+ function DotsLoader() {
189
+ return /* @__PURE__ */ jsx("div", { className: "flex space-x-2", children: [0, 1, 2].map((i) => /* @__PURE__ */ jsx(
190
+ motion.div,
191
+ {
192
+ className: "h-3 w-3 rounded-full bg-primary",
193
+ initial: { scale: 0 },
194
+ animate: { scale: [0, 1, 0] },
195
+ transition: {
196
+ duration: 1,
197
+ repeat: Infinity,
198
+ delay: i * 0.2,
199
+ ease: "easeInOut"
200
+ }
201
+ },
202
+ i
203
+ )) });
204
+ }
205
+ function PulseLoader() {
206
+ return /* @__PURE__ */ jsx(
207
+ motion.div,
208
+ {
209
+ className: "h-12 w-12 rounded-full bg-primary/20",
210
+ initial: { scale: 0.8 },
211
+ animate: { scale: 1, opacity: [1, 0.5, 1] },
212
+ transition: {
213
+ duration: 1.5,
214
+ repeat: Infinity,
215
+ ease: "easeInOut"
216
+ },
217
+ children: /* @__PURE__ */ jsx(
218
+ motion.div,
219
+ {
220
+ className: "h-full w-full rounded-full bg-primary/40",
221
+ initial: { scale: 0.8 },
222
+ animate: { scale: 1, opacity: [1, 0, 1] },
223
+ transition: {
224
+ duration: 1.5,
225
+ repeat: Infinity,
226
+ ease: "easeInOut",
227
+ delay: 0.2
228
+ }
229
+ }
230
+ )
231
+ }
232
+ );
233
+ }
234
+ function BarsLoader() {
235
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center space-x-1", children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ jsx(
236
+ motion.div,
237
+ {
238
+ className: "h-8 w-1 rounded-full bg-primary",
239
+ initial: { scaleY: 0.3 },
240
+ animate: { scaleY: [0.3, 1, 0.3] },
241
+ transition: {
242
+ duration: 0.8,
243
+ repeat: Infinity,
244
+ delay: i * 0.1,
245
+ ease: "easeInOut"
246
+ }
247
+ },
248
+ i
249
+ )) });
250
+ }
251
+ var Loader = React5.forwardRef(
252
+ ({
253
+ variant = "default",
254
+ message,
255
+ scope = "global",
256
+ isTransparentBg = true,
257
+ show = true,
258
+ ...props
259
+ }, ref) => {
260
+ const loaderComponents = {
261
+ default: /* @__PURE__ */ jsx(SpinnerLoader, {}),
262
+ spinner: /* @__PURE__ */ jsx(SpinnerLoader, {}),
263
+ dots: /* @__PURE__ */ jsx(DotsLoader, {}),
264
+ pulse: /* @__PURE__ */ jsx(PulseLoader, {}),
265
+ bars: /* @__PURE__ */ jsx(BarsLoader, {})
266
+ };
267
+ if (!show) return null;
268
+ return /* @__PURE__ */ jsx(AnimatePresence, { children: /* @__PURE__ */ jsx(
269
+ motion.div,
270
+ {
271
+ ref,
272
+ className: cn(
273
+ loaderVariants({ variant, scope }),
274
+ isTransparentBg ? "bg-background/90" : "bg-background"
275
+ ),
276
+ initial: "initial",
277
+ animate: "animate",
278
+ exit: "exit",
279
+ variants: containerVariants,
280
+ transition: { duration: 0.2 },
281
+ ...props,
282
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-4", children: [
283
+ loaderComponents[variant || "default"],
284
+ message && /* @__PURE__ */ jsx(
285
+ motion.p,
286
+ {
287
+ className: "text-lg text-muted-foreground",
288
+ initial: { opacity: 0, y: 10 },
289
+ animate: { opacity: 1, y: 0 },
290
+ exit: { opacity: 0, y: -10 },
291
+ transition: { delay: 0.1 },
292
+ children: message
293
+ }
294
+ )
295
+ ] })
296
+ }
297
+ ) });
298
+ }
299
+ );
300
+ Loader.displayName = "Loader";
301
+ var LoaderContext = React5.createContext(
302
+ void 0
303
+ );
304
+ function LoaderProvider({ children }) {
305
+ const [isLoading, setIsLoading] = React5.useState(false);
306
+ const [loaderOptions, setLoaderOptions] = React5.useState({});
307
+ const show = React5.useCallback((options = {}) => {
308
+ setLoaderOptions(options);
309
+ setIsLoading(true);
310
+ }, []);
311
+ const hide = React5.useCallback(() => {
312
+ setIsLoading(false);
313
+ setTimeout(() => setLoaderOptions({}), 300);
314
+ }, []);
315
+ const value = React5.useMemo(
316
+ () => ({ show, hide, isLoading }),
317
+ [show, hide, isLoading]
318
+ );
319
+ return /* @__PURE__ */ jsxs(LoaderContext.Provider, { value, children: [
320
+ children,
321
+ isLoading && /* @__PURE__ */ jsx(
322
+ Loader,
323
+ {
324
+ variant: loaderOptions.variant,
325
+ message: loaderOptions.message,
326
+ scope: loaderOptions.scope,
327
+ isTransparentBg: loaderOptions.isTransparentBg,
328
+ show: isLoading
329
+ }
330
+ )
331
+ ] });
332
+ }
333
+ function useLoader() {
334
+ const context = React5.useContext(LoaderContext);
335
+ if (context === void 0) {
336
+ throw new Error("useLoader must be used within a LoaderProvider");
337
+ }
338
+ return context;
339
+ }
340
+ var globalLoaderController = null;
341
+ function setGlobalLoader(controller) {
342
+ globalLoaderController = controller;
343
+ }
344
+ var loader = {
345
+ show: (options) => {
346
+ if (globalLoaderController) {
347
+ globalLoaderController.show(options);
348
+ } else {
349
+ console.warn(
350
+ "Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider."
351
+ );
352
+ }
353
+ },
354
+ hide: () => {
355
+ if (globalLoaderController) {
356
+ globalLoaderController.hide();
357
+ } else {
358
+ console.warn(
359
+ "Loader: GlobalLoaderController not initialized. Wrap your app with LoaderProvider."
360
+ );
361
+ }
362
+ }
363
+ };
364
+ function GlobalLoaderController() {
365
+ const loaderController = useLoader();
366
+ React5.useEffect(() => {
367
+ setGlobalLoader(loaderController);
368
+ return () => {
369
+ setGlobalLoader(null);
370
+ };
371
+ }, [loaderController]);
372
+ return null;
373
+ }
374
+
375
+ export { Badge, Button, GlobalLoaderController, Input, Loader, LoaderProvider, Spinner, cn, loader, useLoader };
376
+ //# sourceMappingURL=index.mjs.map
377
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "@facter/ds-core",
3
+ "version": "1.0.0",
4
+ "description": "Facter Design System - Core components (Button, Input, Badge, Spinner, Loader)",
5
+ "author": "Facter",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "react",
9
+ "components",
10
+ "design-system",
11
+ "ui",
12
+ "tailwind",
13
+ "typescript"
14
+ ],
15
+ "main": "./dist/index.js",
16
+ "module": "./dist/index.mjs",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "import": "./dist/index.mjs",
21
+ "require": "./dist/index.js",
22
+ "types": "./dist/index.d.ts"
23
+ },
24
+ "./button": {
25
+ "import": "./dist/components/Button/index.mjs",
26
+ "require": "./dist/components/Button/index.js",
27
+ "types": "./dist/components/Button/index.d.ts"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md"
33
+ ],
34
+ "sideEffects": false,
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/tamicaires/facter-design-system.git",
41
+ "directory": "packages/core"
42
+ },
43
+ "bugs": {
44
+ "url": "https://github.com/tamicaires/facter-design-system/issues"
45
+ },
46
+ "homepage": "https://github.com/tamicaires/facter-design-system#readme",
47
+ "peerDependencies": {
48
+ "react": "^18.0.0",
49
+ "react-dom": "^18.0.0"
50
+ },
51
+ "devDependencies": {
52
+ "@testing-library/jest-dom": "^6.1.5",
53
+ "@testing-library/react": "^14.1.2",
54
+ "@types/react": "^18.2.45",
55
+ "@types/react-dom": "^18.2.18",
56
+ "@vitejs/plugin-react": "^4.2.1",
57
+ "eslint": "^8.56.0",
58
+ "jsdom": "^23.0.1",
59
+ "react": "^18.2.0",
60
+ "react-dom": "^18.2.0",
61
+ "tsup": "^8.0.1",
62
+ "typescript": "^5.3.3",
63
+ "vitest": "^1.1.0"
64
+ },
65
+ "dependencies": {
66
+ "class-variance-authority": "^0.7.0",
67
+ "clsx": "^2.1.0",
68
+ "framer-motion": "^12.23.24",
69
+ "tailwind-merge": "^2.2.0"
70
+ },
71
+ "scripts": {
72
+ "build": "tsup",
73
+ "dev": "tsup --watch",
74
+ "lint": "eslint src",
75
+ "test": "vitest",
76
+ "test:coverage": "vitest --coverage",
77
+ "clean": "rm -rf dist"
78
+ }
79
+ }