@koaris/bloom-ui 1.2.3 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +155 -66
- package/dist/index.d.cts +35 -21
- package/dist/index.d.ts +35 -21
- package/dist/index.mjs +155 -56
- package/package.json +1 -1
- package/tailwind.css +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
6
|
var __export = (target, all) => {
|
|
9
7
|
for (var name in all)
|
|
@@ -17,14 +15,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
15
|
}
|
|
18
16
|
return to;
|
|
19
17
|
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
19
|
|
|
30
20
|
// src/index.tsx
|
|
@@ -49,9 +39,9 @@ __export(index_exports, {
|
|
|
49
39
|
TextInput: () => TextInput,
|
|
50
40
|
Toast: () => Toast,
|
|
51
41
|
ToastContainer: () => ToastContainer,
|
|
52
|
-
ToastContext: () => ToastContext,
|
|
53
42
|
ToastProvider: () => ToastProvider,
|
|
54
43
|
Toggle: () => Toggle,
|
|
44
|
+
toastService: () => toastService,
|
|
55
45
|
useToast: () => useToast
|
|
56
46
|
});
|
|
57
47
|
module.exports = __toCommonJS(index_exports);
|
|
@@ -2835,6 +2825,13 @@ var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
|
2835
2825
|
var passwordMask = {
|
|
2836
2826
|
password: [/^(?=.*[!@#$%^&*])/, /(?=.*[0-9])/, /.{8,}$/]
|
|
2837
2827
|
};
|
|
2828
|
+
var phoneFormats = {
|
|
2829
|
+
"BR": { countryCode: "+55", format: "($1) $2-$3" },
|
|
2830
|
+
"US": { countryCode: "+1", format: "($1) $2-$3" },
|
|
2831
|
+
"UK": { countryCode: "+44", format: "$1 $2 $3" },
|
|
2832
|
+
"DE": { countryCode: "+49", format: "$1 $2 $3" },
|
|
2833
|
+
"FR": { countryCode: "+33", format: "$1 $2 $3 $4" }
|
|
2834
|
+
};
|
|
2838
2835
|
var Input = (0, import_react4.forwardRef)(
|
|
2839
2836
|
({
|
|
2840
2837
|
className,
|
|
@@ -2851,6 +2848,8 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
2851
2848
|
label,
|
|
2852
2849
|
helperText,
|
|
2853
2850
|
id,
|
|
2851
|
+
countryCode = "BR",
|
|
2852
|
+
// Default to Brazil
|
|
2854
2853
|
...rest
|
|
2855
2854
|
}, ref) => {
|
|
2856
2855
|
const [selected, setSelected] = (0, import_react4.useState)(false);
|
|
@@ -2902,20 +2901,52 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
2902
2901
|
if (result.length > 5) result = result.replace(/(\d{5})(\d+)/, "$1-$2");
|
|
2903
2902
|
break;
|
|
2904
2903
|
case "phone":
|
|
2905
|
-
result = value2
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
else if (result.length > 6)
|
|
2910
|
-
result = result.replace(/(\d{2})(\d{4})(\d+)/, "($1) $2-$3");
|
|
2911
|
-
else if (result.length > 2)
|
|
2912
|
-
result = result.replace(/(\d{2})(\d+)/, "($1) $2");
|
|
2904
|
+
result = applyPhoneMask(value2, countryCode);
|
|
2905
|
+
break;
|
|
2906
|
+
case "email":
|
|
2907
|
+
result = value2.trim();
|
|
2913
2908
|
break;
|
|
2914
2909
|
default:
|
|
2915
2910
|
break;
|
|
2916
2911
|
}
|
|
2917
2912
|
return result;
|
|
2918
2913
|
};
|
|
2914
|
+
const applyPhoneMask = (value2, countryCode2) => {
|
|
2915
|
+
let digits = value2.replace(/\D/g, "");
|
|
2916
|
+
const format = phoneFormats[countryCode2] || phoneFormats["BR"];
|
|
2917
|
+
switch (countryCode2) {
|
|
2918
|
+
case "BR":
|
|
2919
|
+
if (digits.length > 11) digits = digits.substring(0, 11);
|
|
2920
|
+
if (digits.length > 10)
|
|
2921
|
+
return digits.replace(/(\d{2})(\d{5})(\d+)/, "($1) $2-$3");
|
|
2922
|
+
else if (digits.length > 6)
|
|
2923
|
+
return digits.replace(/(\d{2})(\d{4})(\d+)/, "($1) $2-$3");
|
|
2924
|
+
else if (digits.length > 2)
|
|
2925
|
+
return digits.replace(/(\d{2})(\d+)/, "($1) $2");
|
|
2926
|
+
return digits;
|
|
2927
|
+
case "US":
|
|
2928
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2929
|
+
if (digits.length > 6)
|
|
2930
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "($1) $2-$3");
|
|
2931
|
+
else if (digits.length > 3)
|
|
2932
|
+
return digits.replace(/(\d{3})(\d+)/, "($1) $2");
|
|
2933
|
+
return digits;
|
|
2934
|
+
case "UK":
|
|
2935
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2936
|
+
if (digits.length > 7)
|
|
2937
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "$1 $2 $3");
|
|
2938
|
+
else if (digits.length > 3)
|
|
2939
|
+
return digits.replace(/(\d{3})(\d+)/, "$1 $2");
|
|
2940
|
+
return digits;
|
|
2941
|
+
default:
|
|
2942
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2943
|
+
if (digits.length > 6)
|
|
2944
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "$1 $2 $3");
|
|
2945
|
+
else if (digits.length > 3)
|
|
2946
|
+
return digits.replace(/(\d{3})(\d+)/, "$1 $2");
|
|
2947
|
+
return digits;
|
|
2948
|
+
}
|
|
2949
|
+
};
|
|
2919
2950
|
const validateInput = (value2) => {
|
|
2920
2951
|
if (!value2) return false;
|
|
2921
2952
|
let valid = false;
|
|
@@ -2936,7 +2967,16 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
2936
2967
|
valid = /^\d{5}-\d{3}$/.test(value2);
|
|
2937
2968
|
break;
|
|
2938
2969
|
case "phone":
|
|
2939
|
-
|
|
2970
|
+
if (countryCode === "BR") {
|
|
2971
|
+
valid = /^\(\d{2}\) \d{5}-\d{4}$/.test(value2) || /^\(\d{2}\) \d{4}-\d{4}$/.test(value2);
|
|
2972
|
+
} else if (countryCode === "US") {
|
|
2973
|
+
valid = /^\(\d{3}\) \d{3}-\d{4}$/.test(value2);
|
|
2974
|
+
} else {
|
|
2975
|
+
valid = /^[\d\s()-]{8,}$/.test(value2);
|
|
2976
|
+
}
|
|
2977
|
+
break;
|
|
2978
|
+
case "email":
|
|
2979
|
+
valid = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value2);
|
|
2940
2980
|
break;
|
|
2941
2981
|
default:
|
|
2942
2982
|
valid = value2.length > 0;
|
|
@@ -2947,7 +2987,7 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
2947
2987
|
};
|
|
2948
2988
|
const handleInput = (event) => {
|
|
2949
2989
|
let newValue = event.currentTarget.value;
|
|
2950
|
-
if (["date", "cpf", "phone", "cnpj", "cep"].includes(type)) {
|
|
2990
|
+
if (["date", "cpf", "phone", "cnpj", "cep", "email"].includes(type)) {
|
|
2951
2991
|
newValue = applyMask(newValue, type);
|
|
2952
2992
|
}
|
|
2953
2993
|
const newEvent = {
|
|
@@ -2992,6 +3032,8 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
2992
3032
|
switch (type) {
|
|
2993
3033
|
case "password":
|
|
2994
3034
|
return "password";
|
|
3035
|
+
case "email":
|
|
3036
|
+
return "email";
|
|
2995
3037
|
case "date":
|
|
2996
3038
|
case "cpf":
|
|
2997
3039
|
case "phone":
|
|
@@ -3002,13 +3044,19 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
3002
3044
|
return "text";
|
|
3003
3045
|
}
|
|
3004
3046
|
};
|
|
3047
|
+
const renderPhonePrefix = () => {
|
|
3048
|
+
if (type !== "phone") return null;
|
|
3049
|
+
const format = phoneFormats[countryCode] || phoneFormats["BR"];
|
|
3050
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "absolute left-3 top-1.5 text-gray-500", children: format.countryCode });
|
|
3051
|
+
};
|
|
3005
3052
|
const inputClasses = twMerge(
|
|
3006
|
-
"flex items-center justify-center border-2 border-
|
|
3053
|
+
"flex items-center justify-center border-2 border-gray-400 rounded-sm w-full px-3 py-1 text-md hover:shadow-md hover:shadow-neutral-500 focus:outline-none transition-all duration-200",
|
|
3007
3054
|
className,
|
|
3008
3055
|
disabled && "opacity-50 cursor-not-allowed",
|
|
3009
3056
|
selected && "border-2 border-orange-500",
|
|
3010
3057
|
validated && isValid && "border-2 border-green-900",
|
|
3011
|
-
error && "border-2 border-red-900"
|
|
3058
|
+
(error || !isValid && inputValue != "") && "border-2 border-red-900",
|
|
3059
|
+
type === "phone" && "pl-10"
|
|
3012
3060
|
);
|
|
3013
3061
|
const renderPasswordValidation = () => {
|
|
3014
3062
|
if (type !== "password") return null;
|
|
@@ -3039,26 +3087,29 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
3039
3087
|
]
|
|
3040
3088
|
}
|
|
3041
3089
|
),
|
|
3042
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.
|
|
3043
|
-
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
|
-
|
|
3047
|
-
|
|
3048
|
-
|
|
3049
|
-
|
|
3050
|
-
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
|
|
3054
|
-
|
|
3055
|
-
|
|
3056
|
-
|
|
3057
|
-
|
|
3058
|
-
|
|
3059
|
-
|
|
3060
|
-
|
|
3061
|
-
|
|
3090
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "relative", children: [
|
|
3091
|
+
renderPhonePrefix(),
|
|
3092
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3093
|
+
"input",
|
|
3094
|
+
{
|
|
3095
|
+
type: getInputType(),
|
|
3096
|
+
required,
|
|
3097
|
+
disabled,
|
|
3098
|
+
ref,
|
|
3099
|
+
id,
|
|
3100
|
+
className: inputClasses,
|
|
3101
|
+
onClick,
|
|
3102
|
+
onFocus: handleFocus,
|
|
3103
|
+
onChange: handleInput,
|
|
3104
|
+
onBlur: handleBlur,
|
|
3105
|
+
placeholder,
|
|
3106
|
+
value: inputValue,
|
|
3107
|
+
"aria-invalid": error,
|
|
3108
|
+
"aria-describedby": error ? `${id}-error` : helperText ? `${id}-helper` : void 0,
|
|
3109
|
+
...rest
|
|
3110
|
+
}
|
|
3111
|
+
)
|
|
3112
|
+
] }),
|
|
3062
3113
|
renderPasswordValidation(),
|
|
3063
3114
|
error && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { id: `${id}-error`, className: "mt-1 text-sm text-red-900", role: "alert", children: errorMessage || "Invalid field." }),
|
|
3064
3115
|
helperText && !error && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { id: `${id}-helper`, className: "mt-1 text-sm text-gray-500", children: helperText })
|
|
@@ -3641,8 +3692,51 @@ var Modal = ({
|
|
|
3641
3692
|
};
|
|
3642
3693
|
|
|
3643
3694
|
// src/components/Toast/index.tsx
|
|
3644
|
-
var import_react8 =
|
|
3695
|
+
var import_react8 = require("react");
|
|
3645
3696
|
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
3697
|
+
var ToastService = class _ToastService {
|
|
3698
|
+
constructor() {
|
|
3699
|
+
this.listeners = /* @__PURE__ */ new Set();
|
|
3700
|
+
this.toasts = [];
|
|
3701
|
+
}
|
|
3702
|
+
static getInstance() {
|
|
3703
|
+
if (!_ToastService.instance) {
|
|
3704
|
+
_ToastService.instance = new _ToastService();
|
|
3705
|
+
}
|
|
3706
|
+
return _ToastService.instance;
|
|
3707
|
+
}
|
|
3708
|
+
subscribe(listener) {
|
|
3709
|
+
this.listeners.add(listener);
|
|
3710
|
+
return () => {
|
|
3711
|
+
this.listeners.delete(listener);
|
|
3712
|
+
};
|
|
3713
|
+
}
|
|
3714
|
+
notify() {
|
|
3715
|
+
this.listeners.forEach((listener) => listener([...this.toasts]));
|
|
3716
|
+
}
|
|
3717
|
+
showToast(toast) {
|
|
3718
|
+
const id = `toast-${Date.now()}`;
|
|
3719
|
+
this.toasts.push({
|
|
3720
|
+
...toast,
|
|
3721
|
+
id,
|
|
3722
|
+
onDismiss: (toastId) => this.hideToast(toastId)
|
|
3723
|
+
});
|
|
3724
|
+
this.notify();
|
|
3725
|
+
return id;
|
|
3726
|
+
}
|
|
3727
|
+
hideToast(id) {
|
|
3728
|
+
this.toasts = this.toasts.filter((toast) => toast.id !== id);
|
|
3729
|
+
this.notify();
|
|
3730
|
+
}
|
|
3731
|
+
clearToasts() {
|
|
3732
|
+
this.toasts = [];
|
|
3733
|
+
this.notify();
|
|
3734
|
+
}
|
|
3735
|
+
getToasts() {
|
|
3736
|
+
return [...this.toasts];
|
|
3737
|
+
}
|
|
3738
|
+
};
|
|
3739
|
+
var toastService = ToastService.getInstance();
|
|
3646
3740
|
var Toast = ({
|
|
3647
3741
|
id,
|
|
3648
3742
|
message,
|
|
@@ -3709,19 +3803,21 @@ var Toast = ({
|
|
|
3709
3803
|
};
|
|
3710
3804
|
var ToastContainer = ({
|
|
3711
3805
|
position = "top-right",
|
|
3712
|
-
className
|
|
3713
|
-
children
|
|
3806
|
+
className
|
|
3714
3807
|
}) => {
|
|
3715
|
-
const containerRef = (0, import_react8.useRef)(
|
|
3808
|
+
const containerRef = (0, import_react8.useRef)(null);
|
|
3716
3809
|
const [isMounted, setIsMounted] = (0, import_react8.useState)(false);
|
|
3810
|
+
const [toasts, setToasts] = (0, import_react8.useState)([]);
|
|
3717
3811
|
(0, import_react8.useEffect)(() => {
|
|
3718
3812
|
const container = document.createElement("div");
|
|
3719
3813
|
container.id = "toast-root";
|
|
3720
3814
|
container.className = "fixed z-50 p-4";
|
|
3721
3815
|
document.body.appendChild(container);
|
|
3722
|
-
containerRef.current =
|
|
3816
|
+
containerRef.current = container;
|
|
3723
3817
|
setIsMounted(true);
|
|
3818
|
+
const unsubscribe = toastService.subscribe(setToasts);
|
|
3724
3819
|
return () => {
|
|
3820
|
+
unsubscribe();
|
|
3725
3821
|
container.remove();
|
|
3726
3822
|
};
|
|
3727
3823
|
}, []);
|
|
@@ -3742,30 +3838,23 @@ var ToastContainer = ({
|
|
|
3742
3838
|
positionClasses[position],
|
|
3743
3839
|
className
|
|
3744
3840
|
),
|
|
3745
|
-
children
|
|
3841
|
+
children: toasts.map((toast) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Toast, { ...toast }, toast.id))
|
|
3746
3842
|
}
|
|
3747
3843
|
);
|
|
3748
3844
|
};
|
|
3749
|
-
var
|
|
3750
|
-
|
|
3751
|
-
|
|
3752
|
-
|
|
3753
|
-
|
|
3754
|
-
setToasts((prev) => [...prev, { ...toast, id }]);
|
|
3755
|
-
return id;
|
|
3845
|
+
var useToast = () => {
|
|
3846
|
+
return {
|
|
3847
|
+
showToast: (toast) => toastService.showToast(toast),
|
|
3848
|
+
hideToast: (id) => toastService.hideToast(id),
|
|
3849
|
+
clearToasts: () => toastService.clearToasts()
|
|
3756
3850
|
};
|
|
3757
|
-
|
|
3758
|
-
|
|
3759
|
-
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
3851
|
+
};
|
|
3852
|
+
var ToastProvider = ({ position = "top-right", children }) => {
|
|
3853
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
|
|
3760
3854
|
children,
|
|
3761
|
-
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ToastContainer, { position
|
|
3855
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ToastContainer, { position })
|
|
3762
3856
|
] });
|
|
3763
3857
|
};
|
|
3764
|
-
var useToast = () => {
|
|
3765
|
-
const context = import_react8.default.useContext(ToastContext);
|
|
3766
|
-
if (!context) throw new Error("useToast must be used within ToastProvider");
|
|
3767
|
-
return context;
|
|
3768
|
-
};
|
|
3769
3858
|
Toast.displayName = "Toast";
|
|
3770
3859
|
ToastContainer.displayName = "ToastContainer";
|
|
3771
3860
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -3789,8 +3878,8 @@ ToastContainer.displayName = "ToastContainer";
|
|
|
3789
3878
|
TextInput,
|
|
3790
3879
|
Toast,
|
|
3791
3880
|
ToastContainer,
|
|
3792
|
-
ToastContext,
|
|
3793
3881
|
ToastProvider,
|
|
3794
3882
|
Toggle,
|
|
3883
|
+
toastService,
|
|
3795
3884
|
useToast
|
|
3796
3885
|
});
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import * as
|
|
3
|
-
import
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import react__default, { DetailedHTMLProps, HTMLAttributes, ReactNode, ButtonHTMLAttributes, AnchorHTMLAttributes, InputHTMLAttributes, ChangeEvent, TextareaHTMLAttributes, FormHTMLAttributes } from 'react';
|
|
4
4
|
|
|
5
5
|
type CardSize = 'small' | 'medium' | 'large' | 'full';
|
|
6
6
|
type CardDirection = 'row' | 'col';
|
|
@@ -35,7 +35,7 @@ interface ButtonProps extends DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonE
|
|
|
35
35
|
fullWidth?: boolean;
|
|
36
36
|
children: ReactNode;
|
|
37
37
|
}
|
|
38
|
-
declare const Button:
|
|
38
|
+
declare const Button: react.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Primary UI component for user interaction
|
|
@@ -66,12 +66,16 @@ interface CheckboxProps extends DetailedHTMLProps<HTMLAttributes<HTMLDivElement>
|
|
|
66
66
|
}
|
|
67
67
|
declare const Checkbox: ({ className, required, disabled }: CheckboxProps) => react_jsx_runtime.JSX.Element;
|
|
68
68
|
|
|
69
|
-
type InputType = 'text' | 'password' | 'date' | 'cpf' | 'phone' | 'cnpj' | 'cep';
|
|
69
|
+
type InputType = 'text' | 'password' | 'date' | 'cpf' | 'phone' | 'cnpj' | 'cep' | 'email';
|
|
70
70
|
interface PasswordValidation {
|
|
71
71
|
hasEightCharacters: boolean;
|
|
72
72
|
hasSpecialCharacters: boolean;
|
|
73
73
|
hasNumber: boolean;
|
|
74
74
|
}
|
|
75
|
+
interface PhoneFormat {
|
|
76
|
+
countryCode: string;
|
|
77
|
+
format: string;
|
|
78
|
+
}
|
|
75
79
|
interface InputProps extends Omit<DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, 'type'> {
|
|
76
80
|
disabled?: boolean;
|
|
77
81
|
placeholder?: string;
|
|
@@ -84,8 +88,9 @@ interface InputProps extends Omit<DetailedHTMLProps<InputHTMLAttributes<HTMLInpu
|
|
|
84
88
|
onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
85
89
|
label?: string;
|
|
86
90
|
helperText?: string;
|
|
91
|
+
countryCode?: string;
|
|
87
92
|
}
|
|
88
|
-
declare const Input:
|
|
93
|
+
declare const Input: react.ForwardRefExoticComponent<Omit<InputProps, "ref"> & react.RefAttributes<HTMLInputElement>>;
|
|
89
94
|
|
|
90
95
|
interface TextInputProps extends DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> {
|
|
91
96
|
disabled?: boolean;
|
|
@@ -98,7 +103,7 @@ interface TextInputProps extends DetailedHTMLProps<InputHTMLAttributes<HTMLInput
|
|
|
98
103
|
required?: boolean;
|
|
99
104
|
type: 'text' | 'password' | 'date' | 'cpf' | 'phone' | 'cnpj' | 'cep';
|
|
100
105
|
}
|
|
101
|
-
declare const TextInput:
|
|
106
|
+
declare const TextInput: react.ForwardRefExoticComponent<Omit<TextInputProps, "ref"> & react.RefAttributes<HTMLInputElement>>;
|
|
102
107
|
|
|
103
108
|
interface TextAreaProps extends DetailedHTMLProps<TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement> {
|
|
104
109
|
disabled?: boolean;
|
|
@@ -177,7 +182,7 @@ interface SkeletonProps {
|
|
|
177
182
|
animate?: boolean;
|
|
178
183
|
className?: string;
|
|
179
184
|
}
|
|
180
|
-
declare const Skeleton:
|
|
185
|
+
declare const Skeleton: react__default.FC<SkeletonProps>;
|
|
181
186
|
|
|
182
187
|
type LoadingSize = 'xs' | 'sm' | 'md' | 'lg';
|
|
183
188
|
type LoadingColor = 'primary' | 'secondary' | 'white' | 'black' | 'gray';
|
|
@@ -189,7 +194,7 @@ interface LoadingProps {
|
|
|
189
194
|
centered?: boolean;
|
|
190
195
|
className?: string;
|
|
191
196
|
}
|
|
192
|
-
declare const Loading:
|
|
197
|
+
declare const Loading: react__default.FC<LoadingProps>;
|
|
193
198
|
|
|
194
199
|
interface ModalProps extends DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement> {
|
|
195
200
|
isOpen: boolean;
|
|
@@ -220,21 +225,30 @@ interface ToastContainerProps {
|
|
|
220
225
|
position?: ToastPosition;
|
|
221
226
|
className?: string;
|
|
222
227
|
}
|
|
223
|
-
declare
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
228
|
+
declare class ToastService {
|
|
229
|
+
private static instance;
|
|
230
|
+
private listeners;
|
|
231
|
+
private toasts;
|
|
232
|
+
private constructor();
|
|
233
|
+
static getInstance(): ToastService;
|
|
234
|
+
subscribe(listener: (toasts: ToastProps[]) => void): () => void;
|
|
235
|
+
private notify;
|
|
236
|
+
showToast(toast: Omit<ToastProps, 'id' | 'onDismiss'>): string;
|
|
237
|
+
hideToast(id: string): void;
|
|
238
|
+
clearToasts(): void;
|
|
239
|
+
getToasts(): ToastProps[];
|
|
240
|
+
}
|
|
241
|
+
declare const toastService: ToastService;
|
|
242
|
+
declare const Toast: react__default.FC<ToastProps>;
|
|
243
|
+
declare const ToastContainer: react__default.FC<ToastContainerProps>;
|
|
244
|
+
declare const useToast: () => {
|
|
245
|
+
showToast: (toast: Omit<ToastProps, "id" | "onDismiss">) => string;
|
|
230
246
|
hideToast: (id: string) => void;
|
|
231
247
|
clearToasts: () => void;
|
|
232
|
-
}
|
|
233
|
-
declare const
|
|
234
|
-
declare const ToastProvider: React__default.FC<{
|
|
248
|
+
};
|
|
249
|
+
declare const ToastProvider: react__default.FC<{
|
|
235
250
|
position?: ToastPosition;
|
|
236
|
-
children:
|
|
251
|
+
children: react__default.ReactNode;
|
|
237
252
|
}>;
|
|
238
|
-
declare const useToast: () => ToastContextType;
|
|
239
253
|
|
|
240
|
-
export { Avatar, type AvatarProps, Box, type BoxProps, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Card, type CardDirection, type CardProps, type CardSize, Checkbox, type CheckboxProps, Form, type FormProps, Heading, type HeadingProps, Input, type InputProps, type InputType, Link, type LinkProps, Loading, type LoadingColor, type LoadingProps, type LoadingSize, Modal, type ModalProps, MultiStep, type MultiStepProps, type PasswordValidation, RadioGroup, type RadioGroupProps, Skeleton, type SkeletonProps, Text, TextArea, type TextAreaProps, TextInput, type TextInputProps, type TextProps, Toast, ToastContainer, type ToastContainerProps,
|
|
254
|
+
export { Avatar, type AvatarProps, Box, type BoxProps, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Card, type CardDirection, type CardProps, type CardSize, Checkbox, type CheckboxProps, Form, type FormProps, Heading, type HeadingProps, Input, type InputProps, type InputType, Link, type LinkProps, Loading, type LoadingColor, type LoadingProps, type LoadingSize, Modal, type ModalProps, MultiStep, type MultiStepProps, type PasswordValidation, type PhoneFormat, RadioGroup, type RadioGroupProps, Skeleton, type SkeletonProps, Text, TextArea, type TextAreaProps, TextInput, type TextInputProps, type TextProps, Toast, ToastContainer, type ToastContainerProps, type ToastPosition, type ToastProps, ToastProvider, type ToastVariant, Toggle, type ToggleProps, toastService, useToast };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import * as
|
|
3
|
-
import
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import react__default, { DetailedHTMLProps, HTMLAttributes, ReactNode, ButtonHTMLAttributes, AnchorHTMLAttributes, InputHTMLAttributes, ChangeEvent, TextareaHTMLAttributes, FormHTMLAttributes } from 'react';
|
|
4
4
|
|
|
5
5
|
type CardSize = 'small' | 'medium' | 'large' | 'full';
|
|
6
6
|
type CardDirection = 'row' | 'col';
|
|
@@ -35,7 +35,7 @@ interface ButtonProps extends DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonE
|
|
|
35
35
|
fullWidth?: boolean;
|
|
36
36
|
children: ReactNode;
|
|
37
37
|
}
|
|
38
|
-
declare const Button:
|
|
38
|
+
declare const Button: react.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Primary UI component for user interaction
|
|
@@ -66,12 +66,16 @@ interface CheckboxProps extends DetailedHTMLProps<HTMLAttributes<HTMLDivElement>
|
|
|
66
66
|
}
|
|
67
67
|
declare const Checkbox: ({ className, required, disabled }: CheckboxProps) => react_jsx_runtime.JSX.Element;
|
|
68
68
|
|
|
69
|
-
type InputType = 'text' | 'password' | 'date' | 'cpf' | 'phone' | 'cnpj' | 'cep';
|
|
69
|
+
type InputType = 'text' | 'password' | 'date' | 'cpf' | 'phone' | 'cnpj' | 'cep' | 'email';
|
|
70
70
|
interface PasswordValidation {
|
|
71
71
|
hasEightCharacters: boolean;
|
|
72
72
|
hasSpecialCharacters: boolean;
|
|
73
73
|
hasNumber: boolean;
|
|
74
74
|
}
|
|
75
|
+
interface PhoneFormat {
|
|
76
|
+
countryCode: string;
|
|
77
|
+
format: string;
|
|
78
|
+
}
|
|
75
79
|
interface InputProps extends Omit<DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, 'type'> {
|
|
76
80
|
disabled?: boolean;
|
|
77
81
|
placeholder?: string;
|
|
@@ -84,8 +88,9 @@ interface InputProps extends Omit<DetailedHTMLProps<InputHTMLAttributes<HTMLInpu
|
|
|
84
88
|
onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
85
89
|
label?: string;
|
|
86
90
|
helperText?: string;
|
|
91
|
+
countryCode?: string;
|
|
87
92
|
}
|
|
88
|
-
declare const Input:
|
|
93
|
+
declare const Input: react.ForwardRefExoticComponent<Omit<InputProps, "ref"> & react.RefAttributes<HTMLInputElement>>;
|
|
89
94
|
|
|
90
95
|
interface TextInputProps extends DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> {
|
|
91
96
|
disabled?: boolean;
|
|
@@ -98,7 +103,7 @@ interface TextInputProps extends DetailedHTMLProps<InputHTMLAttributes<HTMLInput
|
|
|
98
103
|
required?: boolean;
|
|
99
104
|
type: 'text' | 'password' | 'date' | 'cpf' | 'phone' | 'cnpj' | 'cep';
|
|
100
105
|
}
|
|
101
|
-
declare const TextInput:
|
|
106
|
+
declare const TextInput: react.ForwardRefExoticComponent<Omit<TextInputProps, "ref"> & react.RefAttributes<HTMLInputElement>>;
|
|
102
107
|
|
|
103
108
|
interface TextAreaProps extends DetailedHTMLProps<TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement> {
|
|
104
109
|
disabled?: boolean;
|
|
@@ -177,7 +182,7 @@ interface SkeletonProps {
|
|
|
177
182
|
animate?: boolean;
|
|
178
183
|
className?: string;
|
|
179
184
|
}
|
|
180
|
-
declare const Skeleton:
|
|
185
|
+
declare const Skeleton: react__default.FC<SkeletonProps>;
|
|
181
186
|
|
|
182
187
|
type LoadingSize = 'xs' | 'sm' | 'md' | 'lg';
|
|
183
188
|
type LoadingColor = 'primary' | 'secondary' | 'white' | 'black' | 'gray';
|
|
@@ -189,7 +194,7 @@ interface LoadingProps {
|
|
|
189
194
|
centered?: boolean;
|
|
190
195
|
className?: string;
|
|
191
196
|
}
|
|
192
|
-
declare const Loading:
|
|
197
|
+
declare const Loading: react__default.FC<LoadingProps>;
|
|
193
198
|
|
|
194
199
|
interface ModalProps extends DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement> {
|
|
195
200
|
isOpen: boolean;
|
|
@@ -220,21 +225,30 @@ interface ToastContainerProps {
|
|
|
220
225
|
position?: ToastPosition;
|
|
221
226
|
className?: string;
|
|
222
227
|
}
|
|
223
|
-
declare
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
228
|
+
declare class ToastService {
|
|
229
|
+
private static instance;
|
|
230
|
+
private listeners;
|
|
231
|
+
private toasts;
|
|
232
|
+
private constructor();
|
|
233
|
+
static getInstance(): ToastService;
|
|
234
|
+
subscribe(listener: (toasts: ToastProps[]) => void): () => void;
|
|
235
|
+
private notify;
|
|
236
|
+
showToast(toast: Omit<ToastProps, 'id' | 'onDismiss'>): string;
|
|
237
|
+
hideToast(id: string): void;
|
|
238
|
+
clearToasts(): void;
|
|
239
|
+
getToasts(): ToastProps[];
|
|
240
|
+
}
|
|
241
|
+
declare const toastService: ToastService;
|
|
242
|
+
declare const Toast: react__default.FC<ToastProps>;
|
|
243
|
+
declare const ToastContainer: react__default.FC<ToastContainerProps>;
|
|
244
|
+
declare const useToast: () => {
|
|
245
|
+
showToast: (toast: Omit<ToastProps, "id" | "onDismiss">) => string;
|
|
230
246
|
hideToast: (id: string) => void;
|
|
231
247
|
clearToasts: () => void;
|
|
232
|
-
}
|
|
233
|
-
declare const
|
|
234
|
-
declare const ToastProvider: React__default.FC<{
|
|
248
|
+
};
|
|
249
|
+
declare const ToastProvider: react__default.FC<{
|
|
235
250
|
position?: ToastPosition;
|
|
236
|
-
children:
|
|
251
|
+
children: react__default.ReactNode;
|
|
237
252
|
}>;
|
|
238
|
-
declare const useToast: () => ToastContextType;
|
|
239
253
|
|
|
240
|
-
export { Avatar, type AvatarProps, Box, type BoxProps, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Card, type CardDirection, type CardProps, type CardSize, Checkbox, type CheckboxProps, Form, type FormProps, Heading, type HeadingProps, Input, type InputProps, type InputType, Link, type LinkProps, Loading, type LoadingColor, type LoadingProps, type LoadingSize, Modal, type ModalProps, MultiStep, type MultiStepProps, type PasswordValidation, RadioGroup, type RadioGroupProps, Skeleton, type SkeletonProps, Text, TextArea, type TextAreaProps, TextInput, type TextInputProps, type TextProps, Toast, ToastContainer, type ToastContainerProps,
|
|
254
|
+
export { Avatar, type AvatarProps, Box, type BoxProps, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Card, type CardDirection, type CardProps, type CardSize, Checkbox, type CheckboxProps, Form, type FormProps, Heading, type HeadingProps, Input, type InputProps, type InputType, Link, type LinkProps, Loading, type LoadingColor, type LoadingProps, type LoadingSize, Modal, type ModalProps, MultiStep, type MultiStepProps, type PasswordValidation, type PhoneFormat, RadioGroup, type RadioGroupProps, Skeleton, type SkeletonProps, Text, TextArea, type TextAreaProps, TextInput, type TextInputProps, type TextProps, Toast, ToastContainer, type ToastContainerProps, type ToastPosition, type ToastProps, ToastProvider, type ToastVariant, Toggle, type ToggleProps, toastService, useToast };
|
package/dist/index.mjs
CHANGED
|
@@ -2781,6 +2781,13 @@ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
|
2781
2781
|
var passwordMask = {
|
|
2782
2782
|
password: [/^(?=.*[!@#$%^&*])/, /(?=.*[0-9])/, /.{8,}$/]
|
|
2783
2783
|
};
|
|
2784
|
+
var phoneFormats = {
|
|
2785
|
+
"BR": { countryCode: "+55", format: "($1) $2-$3" },
|
|
2786
|
+
"US": { countryCode: "+1", format: "($1) $2-$3" },
|
|
2787
|
+
"UK": { countryCode: "+44", format: "$1 $2 $3" },
|
|
2788
|
+
"DE": { countryCode: "+49", format: "$1 $2 $3" },
|
|
2789
|
+
"FR": { countryCode: "+33", format: "$1 $2 $3 $4" }
|
|
2790
|
+
};
|
|
2784
2791
|
var Input = forwardRef2(
|
|
2785
2792
|
({
|
|
2786
2793
|
className,
|
|
@@ -2797,6 +2804,8 @@ var Input = forwardRef2(
|
|
|
2797
2804
|
label,
|
|
2798
2805
|
helperText,
|
|
2799
2806
|
id,
|
|
2807
|
+
countryCode = "BR",
|
|
2808
|
+
// Default to Brazil
|
|
2800
2809
|
...rest
|
|
2801
2810
|
}, ref) => {
|
|
2802
2811
|
const [selected, setSelected] = useState3(false);
|
|
@@ -2848,20 +2857,52 @@ var Input = forwardRef2(
|
|
|
2848
2857
|
if (result.length > 5) result = result.replace(/(\d{5})(\d+)/, "$1-$2");
|
|
2849
2858
|
break;
|
|
2850
2859
|
case "phone":
|
|
2851
|
-
result = value2
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
else if (result.length > 6)
|
|
2856
|
-
result = result.replace(/(\d{2})(\d{4})(\d+)/, "($1) $2-$3");
|
|
2857
|
-
else if (result.length > 2)
|
|
2858
|
-
result = result.replace(/(\d{2})(\d+)/, "($1) $2");
|
|
2860
|
+
result = applyPhoneMask(value2, countryCode);
|
|
2861
|
+
break;
|
|
2862
|
+
case "email":
|
|
2863
|
+
result = value2.trim();
|
|
2859
2864
|
break;
|
|
2860
2865
|
default:
|
|
2861
2866
|
break;
|
|
2862
2867
|
}
|
|
2863
2868
|
return result;
|
|
2864
2869
|
};
|
|
2870
|
+
const applyPhoneMask = (value2, countryCode2) => {
|
|
2871
|
+
let digits = value2.replace(/\D/g, "");
|
|
2872
|
+
const format = phoneFormats[countryCode2] || phoneFormats["BR"];
|
|
2873
|
+
switch (countryCode2) {
|
|
2874
|
+
case "BR":
|
|
2875
|
+
if (digits.length > 11) digits = digits.substring(0, 11);
|
|
2876
|
+
if (digits.length > 10)
|
|
2877
|
+
return digits.replace(/(\d{2})(\d{5})(\d+)/, "($1) $2-$3");
|
|
2878
|
+
else if (digits.length > 6)
|
|
2879
|
+
return digits.replace(/(\d{2})(\d{4})(\d+)/, "($1) $2-$3");
|
|
2880
|
+
else if (digits.length > 2)
|
|
2881
|
+
return digits.replace(/(\d{2})(\d+)/, "($1) $2");
|
|
2882
|
+
return digits;
|
|
2883
|
+
case "US":
|
|
2884
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2885
|
+
if (digits.length > 6)
|
|
2886
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "($1) $2-$3");
|
|
2887
|
+
else if (digits.length > 3)
|
|
2888
|
+
return digits.replace(/(\d{3})(\d+)/, "($1) $2");
|
|
2889
|
+
return digits;
|
|
2890
|
+
case "UK":
|
|
2891
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2892
|
+
if (digits.length > 7)
|
|
2893
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "$1 $2 $3");
|
|
2894
|
+
else if (digits.length > 3)
|
|
2895
|
+
return digits.replace(/(\d{3})(\d+)/, "$1 $2");
|
|
2896
|
+
return digits;
|
|
2897
|
+
default:
|
|
2898
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2899
|
+
if (digits.length > 6)
|
|
2900
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "$1 $2 $3");
|
|
2901
|
+
else if (digits.length > 3)
|
|
2902
|
+
return digits.replace(/(\d{3})(\d+)/, "$1 $2");
|
|
2903
|
+
return digits;
|
|
2904
|
+
}
|
|
2905
|
+
};
|
|
2865
2906
|
const validateInput = (value2) => {
|
|
2866
2907
|
if (!value2) return false;
|
|
2867
2908
|
let valid = false;
|
|
@@ -2882,7 +2923,16 @@ var Input = forwardRef2(
|
|
|
2882
2923
|
valid = /^\d{5}-\d{3}$/.test(value2);
|
|
2883
2924
|
break;
|
|
2884
2925
|
case "phone":
|
|
2885
|
-
|
|
2926
|
+
if (countryCode === "BR") {
|
|
2927
|
+
valid = /^\(\d{2}\) \d{5}-\d{4}$/.test(value2) || /^\(\d{2}\) \d{4}-\d{4}$/.test(value2);
|
|
2928
|
+
} else if (countryCode === "US") {
|
|
2929
|
+
valid = /^\(\d{3}\) \d{3}-\d{4}$/.test(value2);
|
|
2930
|
+
} else {
|
|
2931
|
+
valid = /^[\d\s()-]{8,}$/.test(value2);
|
|
2932
|
+
}
|
|
2933
|
+
break;
|
|
2934
|
+
case "email":
|
|
2935
|
+
valid = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value2);
|
|
2886
2936
|
break;
|
|
2887
2937
|
default:
|
|
2888
2938
|
valid = value2.length > 0;
|
|
@@ -2893,7 +2943,7 @@ var Input = forwardRef2(
|
|
|
2893
2943
|
};
|
|
2894
2944
|
const handleInput = (event) => {
|
|
2895
2945
|
let newValue = event.currentTarget.value;
|
|
2896
|
-
if (["date", "cpf", "phone", "cnpj", "cep"].includes(type)) {
|
|
2946
|
+
if (["date", "cpf", "phone", "cnpj", "cep", "email"].includes(type)) {
|
|
2897
2947
|
newValue = applyMask(newValue, type);
|
|
2898
2948
|
}
|
|
2899
2949
|
const newEvent = {
|
|
@@ -2938,6 +2988,8 @@ var Input = forwardRef2(
|
|
|
2938
2988
|
switch (type) {
|
|
2939
2989
|
case "password":
|
|
2940
2990
|
return "password";
|
|
2991
|
+
case "email":
|
|
2992
|
+
return "email";
|
|
2941
2993
|
case "date":
|
|
2942
2994
|
case "cpf":
|
|
2943
2995
|
case "phone":
|
|
@@ -2948,13 +3000,19 @@ var Input = forwardRef2(
|
|
|
2948
3000
|
return "text";
|
|
2949
3001
|
}
|
|
2950
3002
|
};
|
|
3003
|
+
const renderPhonePrefix = () => {
|
|
3004
|
+
if (type !== "phone") return null;
|
|
3005
|
+
const format = phoneFormats[countryCode] || phoneFormats["BR"];
|
|
3006
|
+
return /* @__PURE__ */ jsx6("span", { className: "absolute left-3 top-1.5 text-gray-500", children: format.countryCode });
|
|
3007
|
+
};
|
|
2951
3008
|
const inputClasses = twMerge(
|
|
2952
|
-
"flex items-center justify-center border-2 border-
|
|
3009
|
+
"flex items-center justify-center border-2 border-gray-400 rounded-sm w-full px-3 py-1 text-md hover:shadow-md hover:shadow-neutral-500 focus:outline-none transition-all duration-200",
|
|
2953
3010
|
className,
|
|
2954
3011
|
disabled && "opacity-50 cursor-not-allowed",
|
|
2955
3012
|
selected && "border-2 border-orange-500",
|
|
2956
3013
|
validated && isValid && "border-2 border-green-900",
|
|
2957
|
-
error && "border-2 border-red-900"
|
|
3014
|
+
(error || !isValid && inputValue != "") && "border-2 border-red-900",
|
|
3015
|
+
type === "phone" && "pl-10"
|
|
2958
3016
|
);
|
|
2959
3017
|
const renderPasswordValidation = () => {
|
|
2960
3018
|
if (type !== "password") return null;
|
|
@@ -2985,26 +3043,29 @@ var Input = forwardRef2(
|
|
|
2985
3043
|
]
|
|
2986
3044
|
}
|
|
2987
3045
|
),
|
|
2988
|
-
/* @__PURE__ */
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
2997
|
-
|
|
2998
|
-
|
|
2999
|
-
|
|
3000
|
-
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
|
|
3006
|
-
|
|
3007
|
-
|
|
3046
|
+
/* @__PURE__ */ jsxs5("div", { className: "relative", children: [
|
|
3047
|
+
renderPhonePrefix(),
|
|
3048
|
+
/* @__PURE__ */ jsx6(
|
|
3049
|
+
"input",
|
|
3050
|
+
{
|
|
3051
|
+
type: getInputType(),
|
|
3052
|
+
required,
|
|
3053
|
+
disabled,
|
|
3054
|
+
ref,
|
|
3055
|
+
id,
|
|
3056
|
+
className: inputClasses,
|
|
3057
|
+
onClick,
|
|
3058
|
+
onFocus: handleFocus,
|
|
3059
|
+
onChange: handleInput,
|
|
3060
|
+
onBlur: handleBlur,
|
|
3061
|
+
placeholder,
|
|
3062
|
+
value: inputValue,
|
|
3063
|
+
"aria-invalid": error,
|
|
3064
|
+
"aria-describedby": error ? `${id}-error` : helperText ? `${id}-helper` : void 0,
|
|
3065
|
+
...rest
|
|
3066
|
+
}
|
|
3067
|
+
)
|
|
3068
|
+
] }),
|
|
3008
3069
|
renderPasswordValidation(),
|
|
3009
3070
|
error && /* @__PURE__ */ jsx6("p", { id: `${id}-error`, className: "mt-1 text-sm text-red-900", role: "alert", children: errorMessage || "Invalid field." }),
|
|
3010
3071
|
helperText && !error && /* @__PURE__ */ jsx6("p", { id: `${id}-helper`, className: "mt-1 text-sm text-gray-500", children: helperText })
|
|
@@ -3594,8 +3655,51 @@ var Modal = ({
|
|
|
3594
3655
|
};
|
|
3595
3656
|
|
|
3596
3657
|
// src/components/Toast/index.tsx
|
|
3597
|
-
import
|
|
3598
|
-
import { jsx as jsx19, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3658
|
+
import { useEffect as useEffect5, useState as useState7, useRef as useRef2 } from "react";
|
|
3659
|
+
import { Fragment, jsx as jsx19, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3660
|
+
var ToastService = class _ToastService {
|
|
3661
|
+
constructor() {
|
|
3662
|
+
this.listeners = /* @__PURE__ */ new Set();
|
|
3663
|
+
this.toasts = [];
|
|
3664
|
+
}
|
|
3665
|
+
static getInstance() {
|
|
3666
|
+
if (!_ToastService.instance) {
|
|
3667
|
+
_ToastService.instance = new _ToastService();
|
|
3668
|
+
}
|
|
3669
|
+
return _ToastService.instance;
|
|
3670
|
+
}
|
|
3671
|
+
subscribe(listener) {
|
|
3672
|
+
this.listeners.add(listener);
|
|
3673
|
+
return () => {
|
|
3674
|
+
this.listeners.delete(listener);
|
|
3675
|
+
};
|
|
3676
|
+
}
|
|
3677
|
+
notify() {
|
|
3678
|
+
this.listeners.forEach((listener) => listener([...this.toasts]));
|
|
3679
|
+
}
|
|
3680
|
+
showToast(toast) {
|
|
3681
|
+
const id = `toast-${Date.now()}`;
|
|
3682
|
+
this.toasts.push({
|
|
3683
|
+
...toast,
|
|
3684
|
+
id,
|
|
3685
|
+
onDismiss: (toastId) => this.hideToast(toastId)
|
|
3686
|
+
});
|
|
3687
|
+
this.notify();
|
|
3688
|
+
return id;
|
|
3689
|
+
}
|
|
3690
|
+
hideToast(id) {
|
|
3691
|
+
this.toasts = this.toasts.filter((toast) => toast.id !== id);
|
|
3692
|
+
this.notify();
|
|
3693
|
+
}
|
|
3694
|
+
clearToasts() {
|
|
3695
|
+
this.toasts = [];
|
|
3696
|
+
this.notify();
|
|
3697
|
+
}
|
|
3698
|
+
getToasts() {
|
|
3699
|
+
return [...this.toasts];
|
|
3700
|
+
}
|
|
3701
|
+
};
|
|
3702
|
+
var toastService = ToastService.getInstance();
|
|
3599
3703
|
var Toast = ({
|
|
3600
3704
|
id,
|
|
3601
3705
|
message,
|
|
@@ -3662,19 +3766,21 @@ var Toast = ({
|
|
|
3662
3766
|
};
|
|
3663
3767
|
var ToastContainer = ({
|
|
3664
3768
|
position = "top-right",
|
|
3665
|
-
className
|
|
3666
|
-
children
|
|
3769
|
+
className
|
|
3667
3770
|
}) => {
|
|
3668
|
-
const containerRef = useRef2(
|
|
3771
|
+
const containerRef = useRef2(null);
|
|
3669
3772
|
const [isMounted, setIsMounted] = useState7(false);
|
|
3773
|
+
const [toasts, setToasts] = useState7([]);
|
|
3670
3774
|
useEffect5(() => {
|
|
3671
3775
|
const container = document.createElement("div");
|
|
3672
3776
|
container.id = "toast-root";
|
|
3673
3777
|
container.className = "fixed z-50 p-4";
|
|
3674
3778
|
document.body.appendChild(container);
|
|
3675
|
-
containerRef.current =
|
|
3779
|
+
containerRef.current = container;
|
|
3676
3780
|
setIsMounted(true);
|
|
3781
|
+
const unsubscribe = toastService.subscribe(setToasts);
|
|
3677
3782
|
return () => {
|
|
3783
|
+
unsubscribe();
|
|
3678
3784
|
container.remove();
|
|
3679
3785
|
};
|
|
3680
3786
|
}, []);
|
|
@@ -3695,30 +3801,23 @@ var ToastContainer = ({
|
|
|
3695
3801
|
positionClasses[position],
|
|
3696
3802
|
className
|
|
3697
3803
|
),
|
|
3698
|
-
children
|
|
3804
|
+
children: toasts.map((toast) => /* @__PURE__ */ jsx19(Toast, { ...toast }, toast.id))
|
|
3699
3805
|
}
|
|
3700
3806
|
);
|
|
3701
3807
|
};
|
|
3702
|
-
var
|
|
3703
|
-
|
|
3704
|
-
|
|
3705
|
-
|
|
3706
|
-
|
|
3707
|
-
setToasts((prev) => [...prev, { ...toast, id }]);
|
|
3708
|
-
return id;
|
|
3808
|
+
var useToast = () => {
|
|
3809
|
+
return {
|
|
3810
|
+
showToast: (toast) => toastService.showToast(toast),
|
|
3811
|
+
hideToast: (id) => toastService.hideToast(id),
|
|
3812
|
+
clearToasts: () => toastService.clearToasts()
|
|
3709
3813
|
};
|
|
3710
|
-
|
|
3711
|
-
|
|
3712
|
-
return /* @__PURE__ */ jsxs11(
|
|
3814
|
+
};
|
|
3815
|
+
var ToastProvider = ({ position = "top-right", children }) => {
|
|
3816
|
+
return /* @__PURE__ */ jsxs11(Fragment, { children: [
|
|
3713
3817
|
children,
|
|
3714
|
-
/* @__PURE__ */ jsx19(ToastContainer, { position
|
|
3818
|
+
/* @__PURE__ */ jsx19(ToastContainer, { position })
|
|
3715
3819
|
] });
|
|
3716
3820
|
};
|
|
3717
|
-
var useToast = () => {
|
|
3718
|
-
const context = React.useContext(ToastContext);
|
|
3719
|
-
if (!context) throw new Error("useToast must be used within ToastProvider");
|
|
3720
|
-
return context;
|
|
3721
|
-
};
|
|
3722
3821
|
Toast.displayName = "Toast";
|
|
3723
3822
|
ToastContainer.displayName = "ToastContainer";
|
|
3724
3823
|
export {
|
|
@@ -3741,8 +3840,8 @@ export {
|
|
|
3741
3840
|
TextInput,
|
|
3742
3841
|
Toast,
|
|
3743
3842
|
ToastContainer,
|
|
3744
|
-
ToastContext,
|
|
3745
3843
|
ToastProvider,
|
|
3746
3844
|
Toggle,
|
|
3845
|
+
toastService,
|
|
3747
3846
|
useToast
|
|
3748
3847
|
};
|
package/package.json
CHANGED
package/tailwind.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.left-0{left:0}.left-1\/2{left:50%}.right-0{right:0}.top-0{top:0}.z-10{z-index:10}.z-50{z-index:50}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-3{margin-left:.75rem}.mr-1{margin-right:.25rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mt-1{margin-top:.25rem}.mt-4{margin-top:1rem}.box-border{box-sizing:border-box}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-12{height:3rem}.h-16{height:4rem}.h-3{height:.75rem}.h-32{height:8rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-auto{height:auto}.h-full{height:100%}.max-h-\[70vh\]{max-height:70vh}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-full{width:100%}.max-w-\[180px\]{max-width:180px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px}.translate-x-1{--tw-translate-x:0.25rem}.translate-x-1,.translate-x-5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-6{--tw-translate-x:1.5rem}.translate-x-6,.translate-x-8{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-8{--tw-translate-x:2rem}.translate-x-full{--tw-translate-x:100%}.scale-100,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.grid-flow-col{grid-auto-flow:column}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-blue-500{--tw-border-opacity:1;border-color:rgb(70 215 242/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-green-500{--tw-border-opacity:1;border-color:rgb(70 242 175/var(--tw-border-opacity,1))}.border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.border-neutral{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-neutral-300{--tw-border-opacity:1;border-color:rgb(227 227 226/var(--tw-border-opacity,1))}.border-neutral-500{--tw-border-opacity:1;border-color:rgb(157 157 157/var(--tw-border-opacity,1))}.border-neutral-800{--tw-border-opacity:1;border-color:rgb(28 33 38/var(--tw-border-opacity,1))}.border-orange-500{--tw-border-opacity:1;border-color:rgb(243 98 70/var(--tw-border-opacity,1))}.border-red-500{--tw-border-opacity:1;border-color:rgb(233 30 99/var(--tw-border-opacity,1))}.border-red-900{--tw-border-opacity:1;border-color:rgb(158 0 63/var(--tw-border-opacity,1))}.border-yellow-500{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity,1))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-neutral{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(246 246 246/var(--tw-bg-opacity,1))}.bg-neutral-500{--tw-bg-opacity:1;background-color:rgb(157 157 157/var(--tw-bg-opacity,1))}.bg-neutral-600{--tw-bg-opacity:1;background-color:rgb(50 60 69/var(--tw-bg-opacity,1))}.bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(28 33 38/var(--tw-bg-opacity,1))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(243 98 70/var(--tw-bg-opacity,1))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(247 176 200/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity,1))}.bg-opacity-50{--tw-bg-opacity:0.5}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-default{font-family:Open Sans,sans-serif}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.75rem}.text-4xl{font-size:2rem}.text-5xl{font-size:2.25rem}.text-6xl{font-size:3rem}.text-7xl{font-size:4rem}.text-8xl{font-size:4.5rem}.text-9xl{font-size:6rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem}.text-md{font-size:1rem}.text-sm{font-size:.875rem}.text-xl{font-size:1.25rem}.text-xs{font-size:.75rem}.text-xxs{font-size:.625rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.leading-tight{line-height:1.25}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-green-500{--tw-text-opacity:1;color:rgb(70 242 175/var(--tw-text-opacity,1))}.text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.text-neutral{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-neutral-1000{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-neutral-200{--tw-text-opacity:1;color:rgb(246 246 246/var(--tw-text-opacity,1))}.text-neutral-500{--tw-text-opacity:1;color:rgb(157 157 157/var(--tw-text-opacity,1))}.text-neutral-800{--tw-text-opacity:1;color:rgb(28 33 38/var(--tw-text-opacity,1))}.text-orange-500{--tw-text-opacity:1;color:rgb(243 98 70/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(233 30 99/var(--tw-text-opacity,1))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.text-red-900{--tw-text-opacity:1;color:rgb(158 0 63/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity,1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}html{font-family:Open Sans,sans-serif}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:border-orange-500:hover{--tw-border-opacity:1;border-color:rgb(243 98 70/var(--tw-border-opacity,1))}.hover\:bg-orange-50:hover{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.hover\:bg-orange-500:hover{--tw-bg-opacity:1;background-color:rgb(243 98 70/var(--tw-bg-opacity,1))}.hover\:bg-orange-700:hover{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity,1))}.hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:text-neutral:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.hover\:shadow-md:hover,.hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-none:hover{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.hover\:shadow-neutral-500:hover{--tw-shadow-color:#9d9d9d;--tw-shadow:var(--tw-shadow-colored)}.hover\:shadow-orange-500:hover{--tw-shadow-color:#f36246;--tw-shadow:var(--tw-shadow-colored)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(70 215 242/var(--tw-ring-opacity,1))}.focus\:ring-orange-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(243 98 70/var(--tw-ring-opacity,1))}.focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}@media (min-width:640px){.sm\:text-sm{font-size:.875rem}}@media (prefers-color-scheme:dark){.dark\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.dark\:bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}}
|
|
1
|
+
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.left-0{left:0}.left-1\/2{left:50%}.left-3{left:.75rem}.right-0{right:0}.top-0{top:0}.top-1\.5{top:.375rem}.z-10{z-index:10}.z-50{z-index:50}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-3{margin-left:.75rem}.mr-1{margin-right:.25rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mt-1{margin-top:.25rem}.mt-4{margin-top:1rem}.box-border{box-sizing:border-box}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-12{height:3rem}.h-16{height:4rem}.h-3{height:.75rem}.h-32{height:8rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-auto{height:auto}.h-full{height:100%}.max-h-\[70vh\]{max-height:70vh}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-full{width:100%}.max-w-\[180px\]{max-width:180px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px}.translate-x-1{--tw-translate-x:0.25rem}.translate-x-1,.translate-x-5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-6{--tw-translate-x:1.5rem}.translate-x-6,.translate-x-8{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-8{--tw-translate-x:2rem}.translate-x-full{--tw-translate-x:100%}.scale-100,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.grid-flow-col{grid-auto-flow:column}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-blue-500{--tw-border-opacity:1;border-color:rgb(70 215 242/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.border-green-500{--tw-border-opacity:1;border-color:rgb(70 242 175/var(--tw-border-opacity,1))}.border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.border-neutral{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-neutral-300{--tw-border-opacity:1;border-color:rgb(227 227 226/var(--tw-border-opacity,1))}.border-neutral-500{--tw-border-opacity:1;border-color:rgb(157 157 157/var(--tw-border-opacity,1))}.border-neutral-800{--tw-border-opacity:1;border-color:rgb(28 33 38/var(--tw-border-opacity,1))}.border-orange-500{--tw-border-opacity:1;border-color:rgb(243 98 70/var(--tw-border-opacity,1))}.border-red-500{--tw-border-opacity:1;border-color:rgb(233 30 99/var(--tw-border-opacity,1))}.border-red-900{--tw-border-opacity:1;border-color:rgb(158 0 63/var(--tw-border-opacity,1))}.border-yellow-500{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity,1))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-neutral{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(246 246 246/var(--tw-bg-opacity,1))}.bg-neutral-500{--tw-bg-opacity:1;background-color:rgb(157 157 157/var(--tw-bg-opacity,1))}.bg-neutral-600{--tw-bg-opacity:1;background-color:rgb(50 60 69/var(--tw-bg-opacity,1))}.bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(28 33 38/var(--tw-bg-opacity,1))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(243 98 70/var(--tw-bg-opacity,1))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(247 176 200/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity,1))}.bg-opacity-50{--tw-bg-opacity:0.5}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pl-10{padding-left:2.5rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-default{font-family:Open Sans,sans-serif}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.75rem}.text-4xl{font-size:2rem}.text-5xl{font-size:2.25rem}.text-6xl{font-size:3rem}.text-7xl{font-size:4rem}.text-8xl{font-size:4.5rem}.text-9xl{font-size:6rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem}.text-md{font-size:1rem}.text-sm{font-size:.875rem}.text-xl{font-size:1.25rem}.text-xs{font-size:.75rem}.text-xxs{font-size:.625rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.leading-tight{line-height:1.25}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-green-500{--tw-text-opacity:1;color:rgb(70 242 175/var(--tw-text-opacity,1))}.text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.text-neutral{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-neutral-1000{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-neutral-200{--tw-text-opacity:1;color:rgb(246 246 246/var(--tw-text-opacity,1))}.text-neutral-500{--tw-text-opacity:1;color:rgb(157 157 157/var(--tw-text-opacity,1))}.text-neutral-800{--tw-text-opacity:1;color:rgb(28 33 38/var(--tw-text-opacity,1))}.text-orange-500{--tw-text-opacity:1;color:rgb(243 98 70/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(233 30 99/var(--tw-text-opacity,1))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.text-red-900{--tw-text-opacity:1;color:rgb(158 0 63/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity,1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}html{font-family:Open Sans,sans-serif}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:border-orange-500:hover{--tw-border-opacity:1;border-color:rgb(243 98 70/var(--tw-border-opacity,1))}.hover\:bg-orange-50:hover{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.hover\:bg-orange-500:hover{--tw-bg-opacity:1;background-color:rgb(243 98 70/var(--tw-bg-opacity,1))}.hover\:bg-orange-700:hover{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity,1))}.hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:text-neutral:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.hover\:shadow-md:hover,.hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-none:hover{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.hover\:shadow-neutral-500:hover{--tw-shadow-color:#9d9d9d;--tw-shadow:var(--tw-shadow-colored)}.hover\:shadow-orange-500:hover{--tw-shadow-color:#f36246;--tw-shadow:var(--tw-shadow-colored)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(70 215 242/var(--tw-ring-opacity,1))}.focus\:ring-orange-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(243 98 70/var(--tw-ring-opacity,1))}.focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}@media (min-width:640px){.sm\:text-sm{font-size:.875rem}}@media (prefers-color-scheme:dark){.dark\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.dark\:bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}}
|