neogestify-ui-components 1.0.0 → 1.0.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/package.json +3 -2
- package/src/components/alerts/alerta.ts +91 -0
- package/src/components/alerts/index.ts +1 -0
- package/src/components/html/Button.tsx +72 -0
- package/src/components/html/Form.tsx +40 -0
- package/src/components/html/Input.tsx +91 -0
- package/src/components/html/Modal.tsx +80 -0
- package/src/components/html/Select.tsx +77 -0
- package/src/components/html/Table.tsx +62 -0
- package/src/components/html/index.ts +6 -0
- package/src/components/icons/icons.tsx +547 -0
- package/src/components/icons/index.ts +1 -0
- package/src/index.ts +4 -0
- package/src/types/types.ts +3 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "neogestify-ui-components",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Biblioteca de componentes UI reutilizables con React, Tailwind y SweetAlert",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
"files": [
|
|
32
|
-
"dist"
|
|
32
|
+
"dist",
|
|
33
|
+
"src"
|
|
33
34
|
],
|
|
34
35
|
"scripts": {
|
|
35
36
|
"build": "tsup",
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import Swal from "sweetalert2";
|
|
2
|
+
|
|
3
|
+
interface AlertaOptions {
|
|
4
|
+
title: string;
|
|
5
|
+
text: string;
|
|
6
|
+
icon: 'success' | 'error' | 'warning' | 'info' | 'question';
|
|
7
|
+
confirmButtonText?: string;
|
|
8
|
+
showCancelButton?: boolean;
|
|
9
|
+
cancelButtonText?: string;
|
|
10
|
+
showDenyButton?: boolean;
|
|
11
|
+
denyButtonText?: string;
|
|
12
|
+
onConfirm?: () => void;
|
|
13
|
+
onCancel?: () => void;
|
|
14
|
+
onDeny?: () => void;
|
|
15
|
+
toast?: boolean;
|
|
16
|
+
timer?: number;
|
|
17
|
+
position?: 'top' | 'top-start' | 'top-end' | 'center' | 'center-start' | 'center-end' | 'bottom' | 'bottom-start' | 'bottom-end';
|
|
18
|
+
allowOutsideClick?: boolean;
|
|
19
|
+
allowEscapeKey?: boolean;
|
|
20
|
+
input?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'range' | 'textarea' | 'select' | 'radio' | 'checkbox' | 'file' | 'url';
|
|
21
|
+
inputLabel?: string;
|
|
22
|
+
inputPlaceholder?: string;
|
|
23
|
+
inputValue?: string;
|
|
24
|
+
inputValidator?: (value: unknown) => string | null | Promise<string | null>;
|
|
25
|
+
inputAttributes?: Record<string, string>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function Alerta(options: AlertaOptions) {
|
|
29
|
+
const theme = localStorage.getItem('theme');
|
|
30
|
+
|
|
31
|
+
const isDark = theme === 'dark';
|
|
32
|
+
|
|
33
|
+
const result = await Swal.fire({
|
|
34
|
+
title: options.title,
|
|
35
|
+
text: options.text,
|
|
36
|
+
icon: options.icon,
|
|
37
|
+
confirmButtonText: options.confirmButtonText || 'Aceptar',
|
|
38
|
+
showCancelButton: options.showCancelButton || false,
|
|
39
|
+
cancelButtonText: options.cancelButtonText || 'Cancelar',
|
|
40
|
+
showDenyButton: options.showDenyButton || false,
|
|
41
|
+
denyButtonText: options.denyButtonText || 'No',
|
|
42
|
+
background: isDark ? '#1f2937' : '#f9fafb',
|
|
43
|
+
color: isDark ? '#f9fafb' : '#1f2937',
|
|
44
|
+
customClass: {
|
|
45
|
+
popup: isDark ? 'swal-dark-popup' : 'swal-light-popup',
|
|
46
|
+
title: isDark ? 'swal-dark-title' : 'swal-light-title',
|
|
47
|
+
confirmButton: isDark ? 'swal-dark-confirm' : 'swal-light-confirm',
|
|
48
|
+
cancelButton: isDark ? 'swal-dark-cancel' : 'swal-light-cancel',
|
|
49
|
+
denyButton: isDark ? 'swal-dark-deny' : 'swal-light-deny'
|
|
50
|
+
},
|
|
51
|
+
toast: options.toast || false,
|
|
52
|
+
timer: options.timer,
|
|
53
|
+
position: options.position || 'center',
|
|
54
|
+
showConfirmButton: !options.toast && !options.timer,
|
|
55
|
+
timerProgressBar: options.toast || !!options.timer,
|
|
56
|
+
allowOutsideClick: options.allowOutsideClick !== false, // Por defecto true
|
|
57
|
+
allowEscapeKey: options.allowEscapeKey !== false, // Por defecto true
|
|
58
|
+
input: options.input,
|
|
59
|
+
inputLabel: options.inputLabel,
|
|
60
|
+
inputPlaceholder: options.inputPlaceholder,
|
|
61
|
+
inputValue: options.inputValue,
|
|
62
|
+
inputValidator: options.inputValidator,
|
|
63
|
+
inputAttributes: options.inputAttributes
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
if (result.isConfirmed && options.onConfirm) {
|
|
67
|
+
options.onConfirm();
|
|
68
|
+
} else if (result.isDenied && options.onDeny) {
|
|
69
|
+
options.onDeny();
|
|
70
|
+
} else if (result.isDismissed && options.onCancel) {
|
|
71
|
+
options.onCancel();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Funciones de conveniencia para casos comunes
|
|
78
|
+
export const AlertaExito = (title: string, text: string, onConfirm?: () => void, options?: { allowOutsideClick?: boolean; allowEscapeKey?: boolean }) =>
|
|
79
|
+
Alerta({ title, text, icon: 'success', confirmButtonText: 'Aceptar', onConfirm, ...options });
|
|
80
|
+
|
|
81
|
+
export const AlertaError = (title: string, text: string, onConfirm?: () => void, options?: { allowOutsideClick?: boolean; allowEscapeKey?: boolean }) =>
|
|
82
|
+
Alerta({ title, text, icon: 'error', confirmButtonText: 'Aceptar', onConfirm, ...options });
|
|
83
|
+
|
|
84
|
+
export const AlertaAdvertencia = (title: string, text: string, onConfirm?: () => void, onCancel?: () => void, options?: { allowOutsideClick?: boolean; allowEscapeKey?: boolean }) =>
|
|
85
|
+
Alerta({ title, text, icon: 'warning', confirmButtonText: 'Sí, continuar', cancelButtonText: 'Cancelar', showCancelButton: true, onConfirm, onCancel, ...options });
|
|
86
|
+
|
|
87
|
+
export const AlertaConfirmacion = (title: string, text: string, onConfirm?: () => void, onCancel?: () => void, options?: { allowOutsideClick?: boolean; allowEscapeKey?: boolean }) =>
|
|
88
|
+
Alerta({ title, text, icon: 'question', confirmButtonText: 'Sí', cancelButtonText: 'No', showCancelButton: true, onConfirm, onCancel, ...options });
|
|
89
|
+
|
|
90
|
+
export const AlertaToast = (title: string, text: string, icon: 'success' | 'error' | 'warning' | 'info' = 'info', timer: number = 3000, position: 'top' | 'top-start' | 'top-end' | 'center' | 'center-start' | 'center-end' | 'bottom' | 'bottom-start' | 'bottom-end' = 'top-end') =>
|
|
91
|
+
Alerta({ title, text, icon, toast: true, timer, position });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './alerta';
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { AnimateSpin } from '../icons/icons';
|
|
2
|
+
import { type ButtonHTMLAttributes, type FC, type ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
5
|
+
variant?: 'primary' | 'secondary' | 'icon' | 'danger' | 'success' | 'outline' | 'nav' | 'custom' | 'link' | 'warning' | 'toggle';
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
isLoading?: boolean;
|
|
8
|
+
loadingText?: string;
|
|
9
|
+
isActive?: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const Button: FC<ButtonProps> = ({
|
|
13
|
+
variant = 'primary',
|
|
14
|
+
children,
|
|
15
|
+
isLoading = false,
|
|
16
|
+
loadingText,
|
|
17
|
+
isActive = false,
|
|
18
|
+
className = '',
|
|
19
|
+
disabled,
|
|
20
|
+
...props
|
|
21
|
+
}) => {
|
|
22
|
+
const baseClasses = 'transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed hover:cursor-pointer';
|
|
23
|
+
|
|
24
|
+
const variantClasses = {
|
|
25
|
+
primary: 'py-2 px-2 border border-transparent text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',
|
|
26
|
+
secondary: 'p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-200 dark:hover:bg-gray-800 rounded-md border border-gray-300 dark:border-gray-600 shadow-sm hover:shadow-md focus:ring-indigo-500 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',
|
|
27
|
+
icon: 'p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-200 dark:hover:bg-gray-800 rounded-full focus:ring-indigo-500 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',
|
|
28
|
+
danger: 'py-2 px-2 border border-transparent text-sm font-medium rounded-md text-white bg-red-600 hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600 focus:ring-red-500 dark:focus:ring-red-400 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',
|
|
29
|
+
success: 'py-2 px-2 border border-transparent text-sm font-medium rounded-md text-white bg-green-600 hover:bg-green-700 dark:bg-green-500 dark:hover:bg-green-600 focus:ring-green-500 dark:focus:ring-green-400 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',
|
|
30
|
+
outline: 'py-2 px-2 border border-gray-300 dark:border-gray-600 text-sm font-medium rounded-md text-gray-700 dark:text-gray-300 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-700 focus:ring-indigo-500 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',
|
|
31
|
+
nav: 'w-full flex items-center px-4 py-2 text-sm font-medium rounded-md transition-all duration-200 hover:scale-105 text-gray-700 dark:text-gray-300 dark:hover:text-white hover:shadow-lg',
|
|
32
|
+
custom: "",
|
|
33
|
+
link: 'text-sm text-indigo-600 dark:text-indigo-400 hover:text-indigo-700 dark:hover:text-indigo-300 transition-colors duration-200',
|
|
34
|
+
warning: 'py-2 px-2 border border-transparent text-sm font-medium rounded-md text-white bg-yellow-600 hover:bg-yellow-700 dark:bg-yellow-500 dark:hover:bg-yellow-600 focus:ring-yellow-500 dark:focus:ring-yellow-400 focus:ring-offset-gray-50 dark:focus:ring-offset-gray-900',
|
|
35
|
+
toggle: 'px-2 py-2 rounded-lg font-medium transition-all duration-200 disabled:cursor-not-allowed border-2 focus:outline-none focus:ring-2 focus:ring-indigo-500'
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
let classes = `${baseClasses} ${variantClasses[variant]} ${className}`;
|
|
39
|
+
|
|
40
|
+
if (variant === 'nav' && isActive) {
|
|
41
|
+
classes += ' bg-indigo-600 dark:bg-indigo-500 hover:bg-indigo-700 dark:hover:bg-indigo-600 text-white shadow-lg scale-105';
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (variant === 'nav' && !isActive) {
|
|
45
|
+
classes += ' hover:bg-white dark:hover:bg-gray-700 hover:shadow-lg';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (variant === 'toggle') {
|
|
49
|
+
if (isActive) {
|
|
50
|
+
classes += ' bg-indigo-600 text-white border-indigo-500 hover:bg-indigo-700';
|
|
51
|
+
} else {
|
|
52
|
+
classes += ' bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600 hover:bg-gray-300 dark:hover:bg-gray-600 hover:border-gray-400 dark:hover:border-gray-500';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<button
|
|
58
|
+
className={classes}
|
|
59
|
+
disabled={disabled || isLoading}
|
|
60
|
+
{...props}
|
|
61
|
+
>
|
|
62
|
+
{isLoading ? (
|
|
63
|
+
<>
|
|
64
|
+
<AnimateSpin className="h-5 w-5 mr-2 inline-block text-current" />
|
|
65
|
+
{loadingText || 'Cargando...'}
|
|
66
|
+
</>
|
|
67
|
+
) : (
|
|
68
|
+
children
|
|
69
|
+
)}
|
|
70
|
+
</button>
|
|
71
|
+
);
|
|
72
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type FormHTMLAttributes, type FC, type FormEvent, type ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
interface FormProps extends FormHTMLAttributes<HTMLFormElement> {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
onSubmit?: (e: FormEvent<HTMLFormElement>) => void;
|
|
6
|
+
variant?: 'default' | 'modal' | 'card' | 'inline' | 'compact';
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const Form: FC<FormProps> = ({ onSubmit, children, variant = 'default', className = '', ...props }) => {
|
|
10
|
+
const handleSubmit = (e: FormEvent<HTMLFormElement>) => {
|
|
11
|
+
e.preventDefault();
|
|
12
|
+
if (onSubmit) {
|
|
13
|
+
onSubmit(e);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const getVariantClasses = () => {
|
|
18
|
+
switch (variant) {
|
|
19
|
+
case 'modal':
|
|
20
|
+
return 'flex-1 px-6 py-4 overflow-y-auto';
|
|
21
|
+
case 'card':
|
|
22
|
+
return 'p-6 space-y-6';
|
|
23
|
+
case 'inline':
|
|
24
|
+
return 'flex flex-wrap gap-4 items-end';
|
|
25
|
+
case 'compact':
|
|
26
|
+
return 'space-y-3';
|
|
27
|
+
case 'default':
|
|
28
|
+
default:
|
|
29
|
+
return 'space-y-4';
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const combinedClassName = `${getVariantClasses()} ${className}`.trim();
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<form onSubmit={handleSubmit} className={combinedClassName} {...props}>
|
|
37
|
+
{children}
|
|
38
|
+
</form>
|
|
39
|
+
);
|
|
40
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type InputHTMLAttributes, type FC, type ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
|
|
4
|
+
label?: string | ReactNode;
|
|
5
|
+
error?: string;
|
|
6
|
+
helperText?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const Input: FC<InputProps> = ({
|
|
10
|
+
label,
|
|
11
|
+
error,
|
|
12
|
+
helperText,
|
|
13
|
+
className = '',
|
|
14
|
+
id,
|
|
15
|
+
type,
|
|
16
|
+
...props
|
|
17
|
+
}) => {
|
|
18
|
+
const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;
|
|
19
|
+
|
|
20
|
+
const baseClasses = 'appearance-none relative block w-full px-3 py-2 border placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-white bg-white dark:bg-gray-800 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 focus:border-indigo-500 focus:z-10 sm:text-sm disabled:opacity-50 disabled:cursor-not-allowed transition-colors duration-200';
|
|
21
|
+
|
|
22
|
+
const errorClasses = error ? 'border-red-300 dark:border-red-600 focus:ring-red-500 dark:focus:ring-red-400 focus:border-red-500' : 'border-gray-300 dark:border-gray-600';
|
|
23
|
+
|
|
24
|
+
const classes = `${baseClasses} ${errorClasses} ${className}`;
|
|
25
|
+
|
|
26
|
+
if (type === 'checkbox') {
|
|
27
|
+
return (
|
|
28
|
+
<div className="space-y-1 w-full">
|
|
29
|
+
<div className="flex items-center space-x-2">
|
|
30
|
+
<input
|
|
31
|
+
id={inputId}
|
|
32
|
+
type="checkbox"
|
|
33
|
+
className="h-4 w-4 text-indigo-600 focus:ring-indigo-500 border-gray-300 rounded"
|
|
34
|
+
{...props}
|
|
35
|
+
/>
|
|
36
|
+
{label && typeof label === 'string' ? (
|
|
37
|
+
<label
|
|
38
|
+
htmlFor={inputId}
|
|
39
|
+
className="block text-sm font-medium text-gray-700 dark:text-gray-300"
|
|
40
|
+
>
|
|
41
|
+
{label}
|
|
42
|
+
</label>
|
|
43
|
+
) : (
|
|
44
|
+
label
|
|
45
|
+
)}
|
|
46
|
+
</div>
|
|
47
|
+
{error && (
|
|
48
|
+
<p className="text-sm text-red-600 dark:text-red-400" role="alert">
|
|
49
|
+
{error}
|
|
50
|
+
</p>
|
|
51
|
+
)}
|
|
52
|
+
{helperText && !error && (
|
|
53
|
+
<p className="text-sm text-gray-500 dark:text-gray-400">
|
|
54
|
+
{helperText}
|
|
55
|
+
</p>
|
|
56
|
+
)}
|
|
57
|
+
</div>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<div className="space-y-1 w-full">
|
|
63
|
+
{label && typeof label === 'string' ? (
|
|
64
|
+
<label
|
|
65
|
+
htmlFor={inputId}
|
|
66
|
+
className="block text-sm font-medium text-gray-700 dark:text-gray-300"
|
|
67
|
+
>
|
|
68
|
+
{label}
|
|
69
|
+
</label>
|
|
70
|
+
) : (
|
|
71
|
+
label
|
|
72
|
+
)}
|
|
73
|
+
<input
|
|
74
|
+
id={inputId}
|
|
75
|
+
className={classes}
|
|
76
|
+
type={type}
|
|
77
|
+
{...props}
|
|
78
|
+
/>
|
|
79
|
+
{error && (
|
|
80
|
+
<p className="text-sm text-red-600 dark:text-red-400" role="alert">
|
|
81
|
+
{error}
|
|
82
|
+
</p>
|
|
83
|
+
)}
|
|
84
|
+
{helperText && !error && (
|
|
85
|
+
<p className="text-sm text-gray-500 dark:text-gray-400">
|
|
86
|
+
{helperText}
|
|
87
|
+
</p>
|
|
88
|
+
)}
|
|
89
|
+
</div>
|
|
90
|
+
);
|
|
91
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Button } from './Button';
|
|
2
|
+
import { CloseIcon } from '../icons/icons';
|
|
3
|
+
import React, { useEffect, useState, forwardRef, useImperativeHandle } from 'react';
|
|
4
|
+
|
|
5
|
+
interface ModalProps {
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
title: string;
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
footer?: React.ReactNode;
|
|
10
|
+
maxWidth?: string;
|
|
11
|
+
showCloseButton?: boolean;
|
|
12
|
+
zIndex?: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ModalRef {
|
|
16
|
+
handleClose: () => void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const Modal = forwardRef<ModalRef, ModalProps>(({
|
|
20
|
+
onClose,
|
|
21
|
+
title,
|
|
22
|
+
children,
|
|
23
|
+
footer,
|
|
24
|
+
maxWidth = 'max-w-2xl',
|
|
25
|
+
showCloseButton = true,
|
|
26
|
+
zIndex = 50
|
|
27
|
+
}, ref) => {
|
|
28
|
+
const [show, setShow] = useState(false);
|
|
29
|
+
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
setShow(true);
|
|
32
|
+
}, []);
|
|
33
|
+
|
|
34
|
+
const handleClose = () => {
|
|
35
|
+
setShow(false);
|
|
36
|
+
setTimeout(() => {
|
|
37
|
+
onClose();
|
|
38
|
+
}, 300);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
useImperativeHandle(ref, () => ({
|
|
42
|
+
handleClose
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<dialog
|
|
47
|
+
open={show}
|
|
48
|
+
className={`fixed inset-0 w-full h-full flex items-center justify-center p-4 ${show && 'opacity-100'} transition-opacity opacity-0 duration-300 bg-gray-900/60 backdrop-blur-sm`}
|
|
49
|
+
style={{ zIndex: zIndex - 10 }}
|
|
50
|
+
>
|
|
51
|
+
<article
|
|
52
|
+
className={`relative bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-2xl w-full ${maxWidth} max-h-[90vh] flex flex-col overflow-hidden`}
|
|
53
|
+
style={{ zIndex }}
|
|
54
|
+
>
|
|
55
|
+
<header className="shrink-0 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 px-6 py-4 flex items-center justify-between">
|
|
56
|
+
<h2 className="text-2xl font-bold text-gray-900 dark:text-white">{title}</h2>
|
|
57
|
+
{showCloseButton && (
|
|
58
|
+
<Button
|
|
59
|
+
variant='icon'
|
|
60
|
+
onClick={handleClose}
|
|
61
|
+
className="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
|
|
62
|
+
>
|
|
63
|
+
<CloseIcon className="w-5 h-5" />
|
|
64
|
+
</Button>
|
|
65
|
+
)}
|
|
66
|
+
</header>
|
|
67
|
+
<div className="flex-1 overflow-y-auto p-6">
|
|
68
|
+
{children}
|
|
69
|
+
</div>
|
|
70
|
+
{footer && (
|
|
71
|
+
<footer className="shrink-0 bg-gray-50 dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700 px-6 py-4 flex justify-end gap-3">
|
|
72
|
+
{footer}
|
|
73
|
+
</footer>
|
|
74
|
+
)}
|
|
75
|
+
</article>
|
|
76
|
+
</dialog>
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
Modal.displayName = 'Modal';
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { type SelectHTMLAttributes, type FC, type ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
interface Option {
|
|
4
|
+
value: string | number;
|
|
5
|
+
label: string;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
selected?: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'> {
|
|
11
|
+
options: Option[];
|
|
12
|
+
placeholder?: string;
|
|
13
|
+
variant?: 'default' | 'small';
|
|
14
|
+
error?: boolean;
|
|
15
|
+
helperText?: string;
|
|
16
|
+
label?: string | ReactNode;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const Select: FC<SelectProps> = ({
|
|
20
|
+
options,
|
|
21
|
+
placeholder,
|
|
22
|
+
variant = 'default',
|
|
23
|
+
error = false,
|
|
24
|
+
helperText,
|
|
25
|
+
label,
|
|
26
|
+
className = '',
|
|
27
|
+
id,
|
|
28
|
+
...props
|
|
29
|
+
}) => {
|
|
30
|
+
const selectId = id || `select-${Math.random().toString(36).substring(2, 9)}`;
|
|
31
|
+
|
|
32
|
+
const getVariantClasses = () => {
|
|
33
|
+
const baseClasses = 'w-full bg-white dark:bg-gray-700 border rounded-lg text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed transition-colors';
|
|
34
|
+
|
|
35
|
+
if (variant === 'small') {
|
|
36
|
+
return `${baseClasses} px-2.5 py-1.5 text-sm border-gray-300 dark:border-gray-600`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return `${baseClasses} px-3 py-2 border-gray-300 dark:border-gray-600 ${error ? 'border-red-300 dark:border-red-600 focus:ring-red-500' : ''}`;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const combinedClassName = `${getVariantClasses()} ${className}`.trim();
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<div className="space-y-1 w-full">
|
|
46
|
+
{label && typeof label === 'string' ? (
|
|
47
|
+
<label htmlFor={selectId} className="block text-xs font-normal text-gray-700 dark:text-gray-300">
|
|
48
|
+
{label}
|
|
49
|
+
</label>
|
|
50
|
+
) : (
|
|
51
|
+
label
|
|
52
|
+
)}
|
|
53
|
+
<select id={selectId} className={combinedClassName} {...props}>
|
|
54
|
+
{placeholder && placeholder.trim() && (
|
|
55
|
+
<option value="" disabled>
|
|
56
|
+
{placeholder}
|
|
57
|
+
</option>
|
|
58
|
+
)}
|
|
59
|
+
{options.map((option) => (
|
|
60
|
+
<option
|
|
61
|
+
key={option.value}
|
|
62
|
+
value={option.value}
|
|
63
|
+
disabled={option.disabled}
|
|
64
|
+
selected={option.selected}
|
|
65
|
+
>
|
|
66
|
+
{option.label}
|
|
67
|
+
</option>
|
|
68
|
+
))}
|
|
69
|
+
</select>
|
|
70
|
+
{helperText && (
|
|
71
|
+
<p className={`mt-1 text-sm ${error ? 'text-red-600 dark:text-red-400' : 'text-gray-600 dark:text-gray-400'}`}>
|
|
72
|
+
{helperText}
|
|
73
|
+
</p>
|
|
74
|
+
)}
|
|
75
|
+
</div>
|
|
76
|
+
);
|
|
77
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
interface TableProps {
|
|
4
|
+
headers: ReactNode[];
|
|
5
|
+
rows: ReactNode[][];
|
|
6
|
+
variant?: 'default' | 'custom';
|
|
7
|
+
className?: string;
|
|
8
|
+
thClassName?: string;
|
|
9
|
+
tdClassName?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function Table({
|
|
13
|
+
headers,
|
|
14
|
+
rows,
|
|
15
|
+
variant = 'default',
|
|
16
|
+
className = '',
|
|
17
|
+
thClassName = '',
|
|
18
|
+
tdClassName = ''
|
|
19
|
+
}: TableProps) {
|
|
20
|
+
const baseTableClass = variant === 'default'
|
|
21
|
+
? 'w-full table-auto border-collapse border border-gray-300 dark:border-gray-600 min-w-full'
|
|
22
|
+
: '';
|
|
23
|
+
|
|
24
|
+
const baseThClass = variant === 'default'
|
|
25
|
+
? 'border border-gray-300 dark:border-gray-600 px-4 py-2 text-left text-gray-900 dark:text-white'
|
|
26
|
+
: '';
|
|
27
|
+
|
|
28
|
+
const baseTdClass = variant === 'default'
|
|
29
|
+
? 'border border-gray-300 dark:border-gray-600 px-4 py-2 text-gray-900 dark:text-white'
|
|
30
|
+
: '';
|
|
31
|
+
|
|
32
|
+
const tableClass = `${baseTableClass} ${className}`.trim();
|
|
33
|
+
const thClass = `${baseThClass} ${thClassName}`.trim();
|
|
34
|
+
const tdClass = `${baseTdClass} ${tdClassName}`.trim();
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<div className="overflow-x-auto w-full">
|
|
38
|
+
<table className={tableClass}>
|
|
39
|
+
<thead>
|
|
40
|
+
<tr className={variant === 'default' ? 'bg-gray-100 dark:bg-gray-700' : ''}>
|
|
41
|
+
{headers.map((header, index) => (
|
|
42
|
+
<th key={index} className={thClass}>
|
|
43
|
+
{header}
|
|
44
|
+
</th>
|
|
45
|
+
))}
|
|
46
|
+
</tr>
|
|
47
|
+
</thead>
|
|
48
|
+
<tbody>
|
|
49
|
+
{rows.map((row, rowIndex) => (
|
|
50
|
+
<tr key={rowIndex} className={variant === 'default' ? 'hover:bg-gray-50 dark:hover:bg-gray-600' : ''}>
|
|
51
|
+
{row.map((cell, cellIndex) => (
|
|
52
|
+
<td key={cellIndex} className={tdClass}>
|
|
53
|
+
{cell}
|
|
54
|
+
</td>
|
|
55
|
+
))}
|
|
56
|
+
</tr>
|
|
57
|
+
))}
|
|
58
|
+
</tbody>
|
|
59
|
+
</table>
|
|
60
|
+
</div>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
import type { Props } from "../../types/types";
|
|
2
|
+
|
|
3
|
+
// Spinner de carga animado
|
|
4
|
+
export function SpinnerIcon({ className = "" }: { className?: string }) {
|
|
5
|
+
return (
|
|
6
|
+
<svg className={`animate-spin h-8 w-8 text-indigo-600 mx-auto mb-4 ${className}`} xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
|
|
7
|
+
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
|
|
8
|
+
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z"></path>
|
|
9
|
+
</svg>
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function AnimateSpin({ className }: Props) {
|
|
14
|
+
return (
|
|
15
|
+
<svg
|
|
16
|
+
className={`animate-spin ${className}`} xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" aria-hidden="true"
|
|
17
|
+
>
|
|
18
|
+
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
|
|
19
|
+
<path className="opacity-75" fill="currentColor"
|
|
20
|
+
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
|
|
21
|
+
/>
|
|
22
|
+
</svg>
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
export function GearIcon({ className }: Props) {
|
|
26
|
+
return (
|
|
27
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"
|
|
28
|
+
>
|
|
29
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
|
|
30
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
|
31
|
+
</svg>
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function CheckIcon({ className }: Props) {
|
|
36
|
+
return (
|
|
37
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
38
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
|
|
39
|
+
</svg>
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function BackIcon({ className }: Props) {
|
|
44
|
+
return (
|
|
45
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
46
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 19l-7-7m0 0l7-7m-7 7h18" />
|
|
47
|
+
</svg>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function NotFoundIcon({ className }: Props) {
|
|
52
|
+
return (
|
|
53
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
54
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
|
|
55
|
+
</svg>
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function BoxIcon({ className }: Props) {
|
|
60
|
+
return (
|
|
61
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
62
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" />
|
|
63
|
+
</svg>
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function ChartIcon({ className }: Props) {
|
|
68
|
+
return (
|
|
69
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
70
|
+
<path
|
|
71
|
+
strokeLinecap="round"
|
|
72
|
+
strokeLinejoin="round"
|
|
73
|
+
strokeWidth={2}
|
|
74
|
+
d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"
|
|
75
|
+
/>
|
|
76
|
+
</svg>
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function UsersIcon({ className }: Props) {
|
|
81
|
+
return (
|
|
82
|
+
<svg className={className} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
|
83
|
+
<path fill="currentColor" d="M12 2a5 5 0 1 0 5 5a5 5 0 0 0-5-5m0 8a3 3 0 1 1 3-3a3 3 0 0 1-3 3m9 11v-1a7 7 0 0 0-7-7h-4a7 7 0 0 0-7 7v1h2v-1a5 5 0 0 1 5-5h4a5 5 0 0 1 5 5v1z" />
|
|
84
|
+
</svg>
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function DocumentIcon({ className }: Props) {
|
|
89
|
+
return (
|
|
90
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
91
|
+
<path
|
|
92
|
+
strokeLinecap="round"
|
|
93
|
+
strokeLinejoin="round"
|
|
94
|
+
strokeWidth={2}
|
|
95
|
+
d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"
|
|
96
|
+
/>
|
|
97
|
+
</svg>
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function LogoutIcon({ className }: Props) {
|
|
102
|
+
return (
|
|
103
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
104
|
+
<path
|
|
105
|
+
strokeLinecap="round"
|
|
106
|
+
strokeLinejoin="round"
|
|
107
|
+
strokeWidth={2}
|
|
108
|
+
d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"
|
|
109
|
+
/>
|
|
110
|
+
</svg>
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function TruckIcon({ className }: Props) {
|
|
115
|
+
return (
|
|
116
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
117
|
+
<path
|
|
118
|
+
strokeLinecap="round"
|
|
119
|
+
strokeLinejoin="round"
|
|
120
|
+
strokeWidth={2}
|
|
121
|
+
d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"
|
|
122
|
+
/>
|
|
123
|
+
</svg>
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function HomeIcon({ className }: Props) {
|
|
128
|
+
return (
|
|
129
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
130
|
+
<path
|
|
131
|
+
strokeLinecap="round"
|
|
132
|
+
strokeLinejoin="round"
|
|
133
|
+
strokeWidth={2}
|
|
134
|
+
d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"
|
|
135
|
+
/>
|
|
136
|
+
</svg>
|
|
137
|
+
)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function BuildingIcon({ className }: Props) {
|
|
141
|
+
return (
|
|
142
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
143
|
+
<path
|
|
144
|
+
strokeLinecap="round"
|
|
145
|
+
strokeLinejoin="round"
|
|
146
|
+
strokeWidth={2}
|
|
147
|
+
d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"
|
|
148
|
+
/>
|
|
149
|
+
</svg>
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function CashIcon({ className }: Props) {
|
|
154
|
+
return (
|
|
155
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
156
|
+
<path
|
|
157
|
+
strokeLinecap="round"
|
|
158
|
+
strokeLinejoin="round"
|
|
159
|
+
strokeWidth={2}
|
|
160
|
+
d="M17 9V7a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2m2 4h10a2 2 0 002-2v-6a2 2 0 00-2-2H9a2 2 0 00-2 2v6a2 2 0 002 2zm7-5a2 2 0 11-4 0 2 2 0 014 0z"
|
|
161
|
+
/>
|
|
162
|
+
</svg>
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export function MenuIcon({ className }: Props) {
|
|
167
|
+
return (
|
|
168
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
169
|
+
<path
|
|
170
|
+
strokeLinecap="round"
|
|
171
|
+
strokeLinejoin="round"
|
|
172
|
+
strokeWidth={2}
|
|
173
|
+
d="M4 6h16M4 12h16M4 18h16"
|
|
174
|
+
/>
|
|
175
|
+
</svg>
|
|
176
|
+
)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function CloseIcon({ className }: Props) {
|
|
180
|
+
return (
|
|
181
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
182
|
+
<path
|
|
183
|
+
strokeLinecap="round"
|
|
184
|
+
strokeLinejoin="round"
|
|
185
|
+
strokeWidth={2}
|
|
186
|
+
d="M6 18L18 6M6 6l12 12"
|
|
187
|
+
/>
|
|
188
|
+
</svg>
|
|
189
|
+
)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export function AddIcon({ className }: Props) {
|
|
193
|
+
return (
|
|
194
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
195
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" />
|
|
196
|
+
</svg>
|
|
197
|
+
)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function SearchIcon({ className }: Props) {
|
|
201
|
+
return (
|
|
202
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
203
|
+
<path
|
|
204
|
+
strokeLinecap="round"
|
|
205
|
+
strokeLinejoin="round"
|
|
206
|
+
strokeWidth={2}
|
|
207
|
+
d="m21 21-6-6m2-5a7 7 0 1 1-14 0 7 7 0 0 1 14 0Z"
|
|
208
|
+
/>
|
|
209
|
+
</svg>
|
|
210
|
+
)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export function SaveIcon({ className }: Props) {
|
|
214
|
+
return (
|
|
215
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
216
|
+
<path
|
|
217
|
+
strokeLinecap="round"
|
|
218
|
+
strokeLinejoin="round"
|
|
219
|
+
strokeWidth={2}
|
|
220
|
+
d="M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4"
|
|
221
|
+
/>
|
|
222
|
+
</svg>
|
|
223
|
+
)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export function CancelIcon({ className }: Props) {
|
|
227
|
+
return (
|
|
228
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
229
|
+
<path
|
|
230
|
+
strokeLinecap="round"
|
|
231
|
+
strokeLinejoin="round"
|
|
232
|
+
strokeWidth={2}
|
|
233
|
+
d="M6 18L18 6M6 6l12 12"
|
|
234
|
+
/>
|
|
235
|
+
</svg>
|
|
236
|
+
)
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export function DeleteIcon({ className }: Props) {
|
|
240
|
+
return (
|
|
241
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
242
|
+
<path
|
|
243
|
+
strokeLinecap="round"
|
|
244
|
+
strokeLinejoin="round"
|
|
245
|
+
strokeWidth={2}
|
|
246
|
+
d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"
|
|
247
|
+
/>
|
|
248
|
+
</svg>
|
|
249
|
+
)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export function EditIcon({ className }: Props) {
|
|
253
|
+
return (
|
|
254
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
255
|
+
<path
|
|
256
|
+
strokeLinecap="round"
|
|
257
|
+
strokeLinejoin="round"
|
|
258
|
+
strokeWidth={2}
|
|
259
|
+
d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"
|
|
260
|
+
/>
|
|
261
|
+
</svg>
|
|
262
|
+
)
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export function CategorieIcon({ className }: Props) {
|
|
266
|
+
return (
|
|
267
|
+
<svg xmlns="http://www.w3.org/2000/svg" className={className} viewBox="0 0 24 24"><path fill="currentColor" d="M11.15 3.4L7.43 9.48c-.41.66.07 1.52.85 1.52h7.43c.78 0 1.26-.86.85-1.52L12.85 3.4a.993.993 0 0 0-1.7 0" /><circle cx="17.5" cy="17.5" r="4.5" fill="currentColor" /><path fill="currentColor" d="M4 21.5h6c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1" /></svg>
|
|
268
|
+
)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function FolderIcon({ className }: Props) {
|
|
272
|
+
return (
|
|
273
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
274
|
+
<path
|
|
275
|
+
strokeLinecap="round"
|
|
276
|
+
strokeLinejoin="round"
|
|
277
|
+
strokeWidth={2}
|
|
278
|
+
d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"
|
|
279
|
+
/>
|
|
280
|
+
</svg>
|
|
281
|
+
)
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export function ArrowIcon({ className }: Props) {
|
|
285
|
+
return (
|
|
286
|
+
<svg xmlns="http://www.w3.org/2000/svg" className={className} viewBox="0 0 24 24"><path fill="currentColor" d="M17.77 3.77L16 2L6 12l10 10l1.77-1.77L9.54 12z" /></svg>
|
|
287
|
+
)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export function FilterIcon({ className }: Props) {
|
|
291
|
+
return (
|
|
292
|
+
<svg xmlns="http://www.w3.org/2000/svg" className={className} viewBox="0 0 24 24"><path fill="none" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M11.36 20.213L9 21v-8.5L4.52 7.572A2 2 0 0 1 4 6.227V4h16v2.172a2 2 0 0 1-.586 1.414L15 12m0 6a3 3 0 1 0 6 0a3 3 0 1 0-6 0m5.2 2.2L22 22" /></svg>
|
|
293
|
+
)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export function QuestionIcon({ className }: Props) {
|
|
297
|
+
return (
|
|
298
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
299
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
300
|
+
</svg>
|
|
301
|
+
)
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export function LocationIcon({ className }: Props) {
|
|
305
|
+
return (
|
|
306
|
+
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
307
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" />
|
|
308
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 11a3 3 0 11-6 0 3 3 0 016 0z" />
|
|
309
|
+
</svg>
|
|
310
|
+
)
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export function CalendarIcon({ className }: Props) {
|
|
314
|
+
return (
|
|
315
|
+
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
316
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
|
|
317
|
+
</svg>
|
|
318
|
+
)
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export function InfoIcon({ className }: Props) {
|
|
322
|
+
return (
|
|
323
|
+
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
324
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
325
|
+
</svg>
|
|
326
|
+
)
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
export function MoonIcon({ className }: Props) {
|
|
330
|
+
return (
|
|
331
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
332
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z" />
|
|
333
|
+
</svg>
|
|
334
|
+
)
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export function SunIcon({ className }: Props) {
|
|
338
|
+
return (
|
|
339
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
340
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z" />
|
|
341
|
+
</svg>
|
|
342
|
+
)
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export function CamaraIcon({ className }: Props) {
|
|
346
|
+
return (
|
|
347
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
348
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" />
|
|
349
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 13a3 3 0 11-6 0 3 3 0 016 0z" />
|
|
350
|
+
</svg>
|
|
351
|
+
)
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
export function ArrowLeftIcon({ className }: Props) {
|
|
355
|
+
return (
|
|
356
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
357
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
|
|
358
|
+
</svg>
|
|
359
|
+
)
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export function ArrowRightIcon({ className }: Props) {
|
|
363
|
+
return (
|
|
364
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
365
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
|
|
366
|
+
</svg>
|
|
367
|
+
)
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
export function TrashIcon({ className }: Props) {
|
|
371
|
+
return (
|
|
372
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
373
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
|
|
374
|
+
</svg>
|
|
375
|
+
)
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export function MinusIcon({ className }: { className?: string }) {
|
|
379
|
+
return (
|
|
380
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
381
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M20 12H4" />
|
|
382
|
+
</svg>
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
export function MoneyIcon({ className }: Props) {
|
|
387
|
+
return (
|
|
388
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
389
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
390
|
+
</svg>
|
|
391
|
+
)
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
export function PercentIcon({ className }: Props) {
|
|
395
|
+
return (
|
|
396
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
397
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 7h6m0 10v-3m-3 3h.01M9 17h.01M9 14h.01M12 14h.01M15 11h.01M12 11h.01M9 11h.01M7 21h10a2 2 0 002-2V5a2 2 0 00-2-2H7a2 2 0 00-2 2v14a2 2 0 002 2z" />
|
|
398
|
+
</svg>
|
|
399
|
+
)
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
export function StackIcon({ className }: Props) {
|
|
403
|
+
return (
|
|
404
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
405
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 7h16M4 12h16M4 17h16" />
|
|
406
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M7 3v18M17 3v18" />
|
|
407
|
+
</svg>
|
|
408
|
+
)
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
export function ClockIcon({ className }: Props) {
|
|
412
|
+
return (
|
|
413
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
414
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
415
|
+
</svg>
|
|
416
|
+
)
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
export function CheckCircleIcon({ className }: Props) {
|
|
420
|
+
return (
|
|
421
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
422
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
423
|
+
</svg>
|
|
424
|
+
)
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
export function CajasIcon({ className }: Props) {
|
|
428
|
+
return (
|
|
429
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
430
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z" />
|
|
431
|
+
</svg>
|
|
432
|
+
)
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
export function PrinterIcon({ className }: Props) {
|
|
436
|
+
return (
|
|
437
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
438
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z" />
|
|
439
|
+
</svg>
|
|
440
|
+
)
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
export function NetworkIcon({ className }: Props) {
|
|
444
|
+
return (
|
|
445
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
446
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01" />
|
|
447
|
+
</svg>
|
|
448
|
+
)
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
export function TestIcon({ className }: Props) {
|
|
452
|
+
return (
|
|
453
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
454
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z" />
|
|
455
|
+
</svg>
|
|
456
|
+
)
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
export function FacturacionIcon({ className }: Props) {
|
|
460
|
+
return (
|
|
461
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
462
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
|
|
463
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 6l4 4" />
|
|
464
|
+
<text x="12" y="16" fontSize="8" fill="currentColor" textAnchor="middle">$</text>
|
|
465
|
+
</svg>
|
|
466
|
+
)
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
export function WhatsAppIcon({ className }: Props) {
|
|
470
|
+
return (
|
|
471
|
+
<svg className={className} viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
472
|
+
<path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893A11.821 11.821 0 0020.465 3.488" />
|
|
473
|
+
</svg>
|
|
474
|
+
)
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
export function ArchiveIcon({ className }: Props) {
|
|
478
|
+
return (
|
|
479
|
+
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
480
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4" />
|
|
481
|
+
</svg>
|
|
482
|
+
)
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
export function CopyIcon({ className }: Props) {
|
|
486
|
+
return (
|
|
487
|
+
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
488
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" />
|
|
489
|
+
</svg>
|
|
490
|
+
)
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
export function PasteIcon({ className }: Props) {
|
|
494
|
+
return (
|
|
495
|
+
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
496
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
|
|
497
|
+
</svg>
|
|
498
|
+
)
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
export function RestaurantMenuIcon({ className }: Props) {
|
|
502
|
+
return (
|
|
503
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
504
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 3v18h18V3H3zm16 16H5V5h14v14zM7 8h10v2H7V8zm0 4h10v2H7v-2zm0 4h7v2H7v-2z" />
|
|
505
|
+
</svg>
|
|
506
|
+
)
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
export function CloudIcon({ className }: Props) {
|
|
510
|
+
return (
|
|
511
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
512
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z" />
|
|
513
|
+
</svg>
|
|
514
|
+
)
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
export function ShieldIcon({ className }: Props) {
|
|
518
|
+
return (
|
|
519
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
520
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" />
|
|
521
|
+
</svg>
|
|
522
|
+
)
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
export function BarsChartsIcon({ className }: Props) {
|
|
526
|
+
return (
|
|
527
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
528
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" />
|
|
529
|
+
</svg>
|
|
530
|
+
)
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
export function LightingIcon({ className }: Props) {
|
|
534
|
+
return (
|
|
535
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
536
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z" />
|
|
537
|
+
</svg>
|
|
538
|
+
)
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
export function LifeGuardIcon({ className }: Props) {
|
|
542
|
+
return (
|
|
543
|
+
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
544
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M18.364 5.636l-3.536 3.536m0 5.656l3.536 3.536M9.172 9.172L5.636 5.636m3.536 9.192l-3.536 3.536M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-5 0a4 4 0 11-8 0 4 4 0 018 0z" />
|
|
545
|
+
</svg>
|
|
546
|
+
)
|
|
547
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './icons';
|
package/src/index.ts
ADDED