@koaris/bloom-ui 1.2.3 → 1.2.4
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 -65
- package/dist/index.d.cts +35 -21
- package/dist/index.d.ts +35 -21
- package/dist/index.mjs +155 -55
- 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,14 @@ 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
|
+
// Add more countries as needed
|
|
2835
|
+
};
|
|
2838
2836
|
var Input = (0, import_react4.forwardRef)(
|
|
2839
2837
|
({
|
|
2840
2838
|
className,
|
|
@@ -2851,6 +2849,8 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
2851
2849
|
label,
|
|
2852
2850
|
helperText,
|
|
2853
2851
|
id,
|
|
2852
|
+
countryCode = "BR",
|
|
2853
|
+
// Default to Brazil
|
|
2854
2854
|
...rest
|
|
2855
2855
|
}, ref) => {
|
|
2856
2856
|
const [selected, setSelected] = (0, import_react4.useState)(false);
|
|
@@ -2902,20 +2902,52 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
2902
2902
|
if (result.length > 5) result = result.replace(/(\d{5})(\d+)/, "$1-$2");
|
|
2903
2903
|
break;
|
|
2904
2904
|
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");
|
|
2905
|
+
result = applyPhoneMask(value2, countryCode);
|
|
2906
|
+
break;
|
|
2907
|
+
case "email":
|
|
2908
|
+
result = value2.trim();
|
|
2913
2909
|
break;
|
|
2914
2910
|
default:
|
|
2915
2911
|
break;
|
|
2916
2912
|
}
|
|
2917
2913
|
return result;
|
|
2918
2914
|
};
|
|
2915
|
+
const applyPhoneMask = (value2, countryCode2) => {
|
|
2916
|
+
let digits = value2.replace(/\D/g, "");
|
|
2917
|
+
const format = phoneFormats[countryCode2] || phoneFormats["BR"];
|
|
2918
|
+
switch (countryCode2) {
|
|
2919
|
+
case "BR":
|
|
2920
|
+
if (digits.length > 11) digits = digits.substring(0, 11);
|
|
2921
|
+
if (digits.length > 10)
|
|
2922
|
+
return digits.replace(/(\d{2})(\d{5})(\d+)/, "($1) $2-$3");
|
|
2923
|
+
else if (digits.length > 6)
|
|
2924
|
+
return digits.replace(/(\d{2})(\d{4})(\d+)/, "($1) $2-$3");
|
|
2925
|
+
else if (digits.length > 2)
|
|
2926
|
+
return digits.replace(/(\d{2})(\d+)/, "($1) $2");
|
|
2927
|
+
return digits;
|
|
2928
|
+
case "US":
|
|
2929
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2930
|
+
if (digits.length > 6)
|
|
2931
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "($1) $2-$3");
|
|
2932
|
+
else if (digits.length > 3)
|
|
2933
|
+
return digits.replace(/(\d{3})(\d+)/, "($1) $2");
|
|
2934
|
+
return digits;
|
|
2935
|
+
case "UK":
|
|
2936
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2937
|
+
if (digits.length > 7)
|
|
2938
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "$1 $2 $3");
|
|
2939
|
+
else if (digits.length > 3)
|
|
2940
|
+
return digits.replace(/(\d{3})(\d+)/, "$1 $2");
|
|
2941
|
+
return digits;
|
|
2942
|
+
default:
|
|
2943
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2944
|
+
if (digits.length > 6)
|
|
2945
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "$1 $2 $3");
|
|
2946
|
+
else if (digits.length > 3)
|
|
2947
|
+
return digits.replace(/(\d{3})(\d+)/, "$1 $2");
|
|
2948
|
+
return digits;
|
|
2949
|
+
}
|
|
2950
|
+
};
|
|
2919
2951
|
const validateInput = (value2) => {
|
|
2920
2952
|
if (!value2) return false;
|
|
2921
2953
|
let valid = false;
|
|
@@ -2936,7 +2968,16 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
2936
2968
|
valid = /^\d{5}-\d{3}$/.test(value2);
|
|
2937
2969
|
break;
|
|
2938
2970
|
case "phone":
|
|
2939
|
-
|
|
2971
|
+
if (countryCode === "BR") {
|
|
2972
|
+
valid = /^\(\d{2}\) \d{5}-\d{4}$/.test(value2) || /^\(\d{2}\) \d{4}-\d{4}$/.test(value2);
|
|
2973
|
+
} else if (countryCode === "US") {
|
|
2974
|
+
valid = /^\(\d{3}\) \d{3}-\d{4}$/.test(value2);
|
|
2975
|
+
} else {
|
|
2976
|
+
valid = /^[\d\s()-]{8,}$/.test(value2);
|
|
2977
|
+
}
|
|
2978
|
+
break;
|
|
2979
|
+
case "email":
|
|
2980
|
+
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
2981
|
break;
|
|
2941
2982
|
default:
|
|
2942
2983
|
valid = value2.length > 0;
|
|
@@ -2947,7 +2988,7 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
2947
2988
|
};
|
|
2948
2989
|
const handleInput = (event) => {
|
|
2949
2990
|
let newValue = event.currentTarget.value;
|
|
2950
|
-
if (["date", "cpf", "phone", "cnpj", "cep"].includes(type)) {
|
|
2991
|
+
if (["date", "cpf", "phone", "cnpj", "cep", "email"].includes(type)) {
|
|
2951
2992
|
newValue = applyMask(newValue, type);
|
|
2952
2993
|
}
|
|
2953
2994
|
const newEvent = {
|
|
@@ -2992,6 +3033,8 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
2992
3033
|
switch (type) {
|
|
2993
3034
|
case "password":
|
|
2994
3035
|
return "password";
|
|
3036
|
+
case "email":
|
|
3037
|
+
return "email";
|
|
2995
3038
|
case "date":
|
|
2996
3039
|
case "cpf":
|
|
2997
3040
|
case "phone":
|
|
@@ -3002,13 +3045,19 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
3002
3045
|
return "text";
|
|
3003
3046
|
}
|
|
3004
3047
|
};
|
|
3048
|
+
const renderPhonePrefix = () => {
|
|
3049
|
+
if (type !== "phone") return null;
|
|
3050
|
+
const format = phoneFormats[countryCode] || phoneFormats["BR"];
|
|
3051
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "absolute left-2 top-2.5 text-gray-500", children: format.countryCode });
|
|
3052
|
+
};
|
|
3005
3053
|
const inputClasses = twMerge(
|
|
3006
3054
|
"flex items-center justify-center border-2 border-neutral rounded-sm w-full px-3 py-2 text-md hover:shadow-md hover:shadow-neutral-500 focus:outline-none transition-all duration-200",
|
|
3007
3055
|
className,
|
|
3008
3056
|
disabled && "opacity-50 cursor-not-allowed",
|
|
3009
3057
|
selected && "border-2 border-orange-500",
|
|
3010
3058
|
validated && isValid && "border-2 border-green-900",
|
|
3011
|
-
error && "border-2 border-red-900"
|
|
3059
|
+
error && "border-2 border-red-900",
|
|
3060
|
+
type === "phone" && "pl-10"
|
|
3012
3061
|
);
|
|
3013
3062
|
const renderPasswordValidation = () => {
|
|
3014
3063
|
if (type !== "password") return null;
|
|
@@ -3039,26 +3088,29 @@ var Input = (0, import_react4.forwardRef)(
|
|
|
3039
3088
|
]
|
|
3040
3089
|
}
|
|
3041
3090
|
),
|
|
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
|
-
|
|
3091
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "relative", children: [
|
|
3092
|
+
renderPhonePrefix(),
|
|
3093
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3094
|
+
"input",
|
|
3095
|
+
{
|
|
3096
|
+
type: getInputType(),
|
|
3097
|
+
required,
|
|
3098
|
+
disabled,
|
|
3099
|
+
ref,
|
|
3100
|
+
id,
|
|
3101
|
+
className: inputClasses,
|
|
3102
|
+
onClick,
|
|
3103
|
+
onFocus: handleFocus,
|
|
3104
|
+
onChange: handleInput,
|
|
3105
|
+
onBlur: handleBlur,
|
|
3106
|
+
placeholder,
|
|
3107
|
+
value: inputValue,
|
|
3108
|
+
"aria-invalid": error,
|
|
3109
|
+
"aria-describedby": error ? `${id}-error` : helperText ? `${id}-helper` : void 0,
|
|
3110
|
+
...rest
|
|
3111
|
+
}
|
|
3112
|
+
)
|
|
3113
|
+
] }),
|
|
3062
3114
|
renderPasswordValidation(),
|
|
3063
3115
|
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
3116
|
helperText && !error && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { id: `${id}-helper`, className: "mt-1 text-sm text-gray-500", children: helperText })
|
|
@@ -3641,8 +3693,51 @@ var Modal = ({
|
|
|
3641
3693
|
};
|
|
3642
3694
|
|
|
3643
3695
|
// src/components/Toast/index.tsx
|
|
3644
|
-
var import_react8 =
|
|
3696
|
+
var import_react8 = require("react");
|
|
3645
3697
|
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
3698
|
+
var ToastService = class _ToastService {
|
|
3699
|
+
constructor() {
|
|
3700
|
+
this.listeners = /* @__PURE__ */ new Set();
|
|
3701
|
+
this.toasts = [];
|
|
3702
|
+
}
|
|
3703
|
+
static getInstance() {
|
|
3704
|
+
if (!_ToastService.instance) {
|
|
3705
|
+
_ToastService.instance = new _ToastService();
|
|
3706
|
+
}
|
|
3707
|
+
return _ToastService.instance;
|
|
3708
|
+
}
|
|
3709
|
+
subscribe(listener) {
|
|
3710
|
+
this.listeners.add(listener);
|
|
3711
|
+
return () => {
|
|
3712
|
+
this.listeners.delete(listener);
|
|
3713
|
+
};
|
|
3714
|
+
}
|
|
3715
|
+
notify() {
|
|
3716
|
+
this.listeners.forEach((listener) => listener([...this.toasts]));
|
|
3717
|
+
}
|
|
3718
|
+
showToast(toast) {
|
|
3719
|
+
const id = `toast-${Date.now()}`;
|
|
3720
|
+
this.toasts.push({
|
|
3721
|
+
...toast,
|
|
3722
|
+
id,
|
|
3723
|
+
onDismiss: (toastId) => this.hideToast(toastId)
|
|
3724
|
+
});
|
|
3725
|
+
this.notify();
|
|
3726
|
+
return id;
|
|
3727
|
+
}
|
|
3728
|
+
hideToast(id) {
|
|
3729
|
+
this.toasts = this.toasts.filter((toast) => toast.id !== id);
|
|
3730
|
+
this.notify();
|
|
3731
|
+
}
|
|
3732
|
+
clearToasts() {
|
|
3733
|
+
this.toasts = [];
|
|
3734
|
+
this.notify();
|
|
3735
|
+
}
|
|
3736
|
+
getToasts() {
|
|
3737
|
+
return [...this.toasts];
|
|
3738
|
+
}
|
|
3739
|
+
};
|
|
3740
|
+
var toastService = ToastService.getInstance();
|
|
3646
3741
|
var Toast = ({
|
|
3647
3742
|
id,
|
|
3648
3743
|
message,
|
|
@@ -3709,19 +3804,21 @@ var Toast = ({
|
|
|
3709
3804
|
};
|
|
3710
3805
|
var ToastContainer = ({
|
|
3711
3806
|
position = "top-right",
|
|
3712
|
-
className
|
|
3713
|
-
children
|
|
3807
|
+
className
|
|
3714
3808
|
}) => {
|
|
3715
|
-
const containerRef = (0, import_react8.useRef)(
|
|
3809
|
+
const containerRef = (0, import_react8.useRef)(null);
|
|
3716
3810
|
const [isMounted, setIsMounted] = (0, import_react8.useState)(false);
|
|
3811
|
+
const [toasts, setToasts] = (0, import_react8.useState)([]);
|
|
3717
3812
|
(0, import_react8.useEffect)(() => {
|
|
3718
3813
|
const container = document.createElement("div");
|
|
3719
3814
|
container.id = "toast-root";
|
|
3720
3815
|
container.className = "fixed z-50 p-4";
|
|
3721
3816
|
document.body.appendChild(container);
|
|
3722
|
-
containerRef.current =
|
|
3817
|
+
containerRef.current = container;
|
|
3723
3818
|
setIsMounted(true);
|
|
3819
|
+
const unsubscribe = toastService.subscribe(setToasts);
|
|
3724
3820
|
return () => {
|
|
3821
|
+
unsubscribe();
|
|
3725
3822
|
container.remove();
|
|
3726
3823
|
};
|
|
3727
3824
|
}, []);
|
|
@@ -3742,30 +3839,23 @@ var ToastContainer = ({
|
|
|
3742
3839
|
positionClasses[position],
|
|
3743
3840
|
className
|
|
3744
3841
|
),
|
|
3745
|
-
children
|
|
3842
|
+
children: toasts.map((toast) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Toast, { ...toast }, toast.id))
|
|
3746
3843
|
}
|
|
3747
3844
|
);
|
|
3748
3845
|
};
|
|
3749
|
-
var
|
|
3750
|
-
|
|
3751
|
-
|
|
3752
|
-
|
|
3753
|
-
|
|
3754
|
-
setToasts((prev) => [...prev, { ...toast, id }]);
|
|
3755
|
-
return id;
|
|
3846
|
+
var useToast = () => {
|
|
3847
|
+
return {
|
|
3848
|
+
showToast: (toast) => toastService.showToast(toast),
|
|
3849
|
+
hideToast: (id) => toastService.hideToast(id),
|
|
3850
|
+
clearToasts: () => toastService.clearToasts()
|
|
3756
3851
|
};
|
|
3757
|
-
|
|
3758
|
-
|
|
3759
|
-
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
3852
|
+
};
|
|
3853
|
+
var ToastProvider = ({ position = "top-right", children }) => {
|
|
3854
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
|
|
3760
3855
|
children,
|
|
3761
|
-
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ToastContainer, { position
|
|
3856
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ToastContainer, { position })
|
|
3762
3857
|
] });
|
|
3763
3858
|
};
|
|
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
3859
|
Toast.displayName = "Toast";
|
|
3770
3860
|
ToastContainer.displayName = "ToastContainer";
|
|
3771
3861
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -3789,8 +3879,8 @@ ToastContainer.displayName = "ToastContainer";
|
|
|
3789
3879
|
TextInput,
|
|
3790
3880
|
Toast,
|
|
3791
3881
|
ToastContainer,
|
|
3792
|
-
ToastContext,
|
|
3793
3882
|
ToastProvider,
|
|
3794
3883
|
Toggle,
|
|
3884
|
+
toastService,
|
|
3795
3885
|
useToast
|
|
3796
3886
|
});
|
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,14 @@ 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
|
+
// Add more countries as needed
|
|
2791
|
+
};
|
|
2784
2792
|
var Input = forwardRef2(
|
|
2785
2793
|
({
|
|
2786
2794
|
className,
|
|
@@ -2797,6 +2805,8 @@ var Input = forwardRef2(
|
|
|
2797
2805
|
label,
|
|
2798
2806
|
helperText,
|
|
2799
2807
|
id,
|
|
2808
|
+
countryCode = "BR",
|
|
2809
|
+
// Default to Brazil
|
|
2800
2810
|
...rest
|
|
2801
2811
|
}, ref) => {
|
|
2802
2812
|
const [selected, setSelected] = useState3(false);
|
|
@@ -2848,20 +2858,52 @@ var Input = forwardRef2(
|
|
|
2848
2858
|
if (result.length > 5) result = result.replace(/(\d{5})(\d+)/, "$1-$2");
|
|
2849
2859
|
break;
|
|
2850
2860
|
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");
|
|
2861
|
+
result = applyPhoneMask(value2, countryCode);
|
|
2862
|
+
break;
|
|
2863
|
+
case "email":
|
|
2864
|
+
result = value2.trim();
|
|
2859
2865
|
break;
|
|
2860
2866
|
default:
|
|
2861
2867
|
break;
|
|
2862
2868
|
}
|
|
2863
2869
|
return result;
|
|
2864
2870
|
};
|
|
2871
|
+
const applyPhoneMask = (value2, countryCode2) => {
|
|
2872
|
+
let digits = value2.replace(/\D/g, "");
|
|
2873
|
+
const format = phoneFormats[countryCode2] || phoneFormats["BR"];
|
|
2874
|
+
switch (countryCode2) {
|
|
2875
|
+
case "BR":
|
|
2876
|
+
if (digits.length > 11) digits = digits.substring(0, 11);
|
|
2877
|
+
if (digits.length > 10)
|
|
2878
|
+
return digits.replace(/(\d{2})(\d{5})(\d+)/, "($1) $2-$3");
|
|
2879
|
+
else if (digits.length > 6)
|
|
2880
|
+
return digits.replace(/(\d{2})(\d{4})(\d+)/, "($1) $2-$3");
|
|
2881
|
+
else if (digits.length > 2)
|
|
2882
|
+
return digits.replace(/(\d{2})(\d+)/, "($1) $2");
|
|
2883
|
+
return digits;
|
|
2884
|
+
case "US":
|
|
2885
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2886
|
+
if (digits.length > 6)
|
|
2887
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "($1) $2-$3");
|
|
2888
|
+
else if (digits.length > 3)
|
|
2889
|
+
return digits.replace(/(\d{3})(\d+)/, "($1) $2");
|
|
2890
|
+
return digits;
|
|
2891
|
+
case "UK":
|
|
2892
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2893
|
+
if (digits.length > 7)
|
|
2894
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "$1 $2 $3");
|
|
2895
|
+
else if (digits.length > 3)
|
|
2896
|
+
return digits.replace(/(\d{3})(\d+)/, "$1 $2");
|
|
2897
|
+
return digits;
|
|
2898
|
+
default:
|
|
2899
|
+
if (digits.length > 10) digits = digits.substring(0, 10);
|
|
2900
|
+
if (digits.length > 6)
|
|
2901
|
+
return digits.replace(/(\d{3})(\d{3})(\d+)/, "$1 $2 $3");
|
|
2902
|
+
else if (digits.length > 3)
|
|
2903
|
+
return digits.replace(/(\d{3})(\d+)/, "$1 $2");
|
|
2904
|
+
return digits;
|
|
2905
|
+
}
|
|
2906
|
+
};
|
|
2865
2907
|
const validateInput = (value2) => {
|
|
2866
2908
|
if (!value2) return false;
|
|
2867
2909
|
let valid = false;
|
|
@@ -2882,7 +2924,16 @@ var Input = forwardRef2(
|
|
|
2882
2924
|
valid = /^\d{5}-\d{3}$/.test(value2);
|
|
2883
2925
|
break;
|
|
2884
2926
|
case "phone":
|
|
2885
|
-
|
|
2927
|
+
if (countryCode === "BR") {
|
|
2928
|
+
valid = /^\(\d{2}\) \d{5}-\d{4}$/.test(value2) || /^\(\d{2}\) \d{4}-\d{4}$/.test(value2);
|
|
2929
|
+
} else if (countryCode === "US") {
|
|
2930
|
+
valid = /^\(\d{3}\) \d{3}-\d{4}$/.test(value2);
|
|
2931
|
+
} else {
|
|
2932
|
+
valid = /^[\d\s()-]{8,}$/.test(value2);
|
|
2933
|
+
}
|
|
2934
|
+
break;
|
|
2935
|
+
case "email":
|
|
2936
|
+
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
2937
|
break;
|
|
2887
2938
|
default:
|
|
2888
2939
|
valid = value2.length > 0;
|
|
@@ -2893,7 +2944,7 @@ var Input = forwardRef2(
|
|
|
2893
2944
|
};
|
|
2894
2945
|
const handleInput = (event) => {
|
|
2895
2946
|
let newValue = event.currentTarget.value;
|
|
2896
|
-
if (["date", "cpf", "phone", "cnpj", "cep"].includes(type)) {
|
|
2947
|
+
if (["date", "cpf", "phone", "cnpj", "cep", "email"].includes(type)) {
|
|
2897
2948
|
newValue = applyMask(newValue, type);
|
|
2898
2949
|
}
|
|
2899
2950
|
const newEvent = {
|
|
@@ -2938,6 +2989,8 @@ var Input = forwardRef2(
|
|
|
2938
2989
|
switch (type) {
|
|
2939
2990
|
case "password":
|
|
2940
2991
|
return "password";
|
|
2992
|
+
case "email":
|
|
2993
|
+
return "email";
|
|
2941
2994
|
case "date":
|
|
2942
2995
|
case "cpf":
|
|
2943
2996
|
case "phone":
|
|
@@ -2948,13 +3001,19 @@ var Input = forwardRef2(
|
|
|
2948
3001
|
return "text";
|
|
2949
3002
|
}
|
|
2950
3003
|
};
|
|
3004
|
+
const renderPhonePrefix = () => {
|
|
3005
|
+
if (type !== "phone") return null;
|
|
3006
|
+
const format = phoneFormats[countryCode] || phoneFormats["BR"];
|
|
3007
|
+
return /* @__PURE__ */ jsx6("span", { className: "absolute left-2 top-2.5 text-gray-500", children: format.countryCode });
|
|
3008
|
+
};
|
|
2951
3009
|
const inputClasses = twMerge(
|
|
2952
3010
|
"flex items-center justify-center border-2 border-neutral rounded-sm w-full px-3 py-2 text-md hover:shadow-md hover:shadow-neutral-500 focus:outline-none transition-all duration-200",
|
|
2953
3011
|
className,
|
|
2954
3012
|
disabled && "opacity-50 cursor-not-allowed",
|
|
2955
3013
|
selected && "border-2 border-orange-500",
|
|
2956
3014
|
validated && isValid && "border-2 border-green-900",
|
|
2957
|
-
error && "border-2 border-red-900"
|
|
3015
|
+
error && "border-2 border-red-900",
|
|
3016
|
+
type === "phone" && "pl-10"
|
|
2958
3017
|
);
|
|
2959
3018
|
const renderPasswordValidation = () => {
|
|
2960
3019
|
if (type !== "password") return null;
|
|
@@ -2985,26 +3044,29 @@ var Input = forwardRef2(
|
|
|
2985
3044
|
]
|
|
2986
3045
|
}
|
|
2987
3046
|
),
|
|
2988
|
-
/* @__PURE__ */
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
2997
|
-
|
|
2998
|
-
|
|
2999
|
-
|
|
3000
|
-
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
|
|
3006
|
-
|
|
3007
|
-
|
|
3047
|
+
/* @__PURE__ */ jsxs5("div", { className: "relative", children: [
|
|
3048
|
+
renderPhonePrefix(),
|
|
3049
|
+
/* @__PURE__ */ jsx6(
|
|
3050
|
+
"input",
|
|
3051
|
+
{
|
|
3052
|
+
type: getInputType(),
|
|
3053
|
+
required,
|
|
3054
|
+
disabled,
|
|
3055
|
+
ref,
|
|
3056
|
+
id,
|
|
3057
|
+
className: inputClasses,
|
|
3058
|
+
onClick,
|
|
3059
|
+
onFocus: handleFocus,
|
|
3060
|
+
onChange: handleInput,
|
|
3061
|
+
onBlur: handleBlur,
|
|
3062
|
+
placeholder,
|
|
3063
|
+
value: inputValue,
|
|
3064
|
+
"aria-invalid": error,
|
|
3065
|
+
"aria-describedby": error ? `${id}-error` : helperText ? `${id}-helper` : void 0,
|
|
3066
|
+
...rest
|
|
3067
|
+
}
|
|
3068
|
+
)
|
|
3069
|
+
] }),
|
|
3008
3070
|
renderPasswordValidation(),
|
|
3009
3071
|
error && /* @__PURE__ */ jsx6("p", { id: `${id}-error`, className: "mt-1 text-sm text-red-900", role: "alert", children: errorMessage || "Invalid field." }),
|
|
3010
3072
|
helperText && !error && /* @__PURE__ */ jsx6("p", { id: `${id}-helper`, className: "mt-1 text-sm text-gray-500", children: helperText })
|
|
@@ -3594,8 +3656,51 @@ var Modal = ({
|
|
|
3594
3656
|
};
|
|
3595
3657
|
|
|
3596
3658
|
// src/components/Toast/index.tsx
|
|
3597
|
-
import
|
|
3598
|
-
import { jsx as jsx19, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3659
|
+
import { useEffect as useEffect5, useState as useState7, useRef as useRef2 } from "react";
|
|
3660
|
+
import { Fragment, jsx as jsx19, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3661
|
+
var ToastService = class _ToastService {
|
|
3662
|
+
constructor() {
|
|
3663
|
+
this.listeners = /* @__PURE__ */ new Set();
|
|
3664
|
+
this.toasts = [];
|
|
3665
|
+
}
|
|
3666
|
+
static getInstance() {
|
|
3667
|
+
if (!_ToastService.instance) {
|
|
3668
|
+
_ToastService.instance = new _ToastService();
|
|
3669
|
+
}
|
|
3670
|
+
return _ToastService.instance;
|
|
3671
|
+
}
|
|
3672
|
+
subscribe(listener) {
|
|
3673
|
+
this.listeners.add(listener);
|
|
3674
|
+
return () => {
|
|
3675
|
+
this.listeners.delete(listener);
|
|
3676
|
+
};
|
|
3677
|
+
}
|
|
3678
|
+
notify() {
|
|
3679
|
+
this.listeners.forEach((listener) => listener([...this.toasts]));
|
|
3680
|
+
}
|
|
3681
|
+
showToast(toast) {
|
|
3682
|
+
const id = `toast-${Date.now()}`;
|
|
3683
|
+
this.toasts.push({
|
|
3684
|
+
...toast,
|
|
3685
|
+
id,
|
|
3686
|
+
onDismiss: (toastId) => this.hideToast(toastId)
|
|
3687
|
+
});
|
|
3688
|
+
this.notify();
|
|
3689
|
+
return id;
|
|
3690
|
+
}
|
|
3691
|
+
hideToast(id) {
|
|
3692
|
+
this.toasts = this.toasts.filter((toast) => toast.id !== id);
|
|
3693
|
+
this.notify();
|
|
3694
|
+
}
|
|
3695
|
+
clearToasts() {
|
|
3696
|
+
this.toasts = [];
|
|
3697
|
+
this.notify();
|
|
3698
|
+
}
|
|
3699
|
+
getToasts() {
|
|
3700
|
+
return [...this.toasts];
|
|
3701
|
+
}
|
|
3702
|
+
};
|
|
3703
|
+
var toastService = ToastService.getInstance();
|
|
3599
3704
|
var Toast = ({
|
|
3600
3705
|
id,
|
|
3601
3706
|
message,
|
|
@@ -3662,19 +3767,21 @@ var Toast = ({
|
|
|
3662
3767
|
};
|
|
3663
3768
|
var ToastContainer = ({
|
|
3664
3769
|
position = "top-right",
|
|
3665
|
-
className
|
|
3666
|
-
children
|
|
3770
|
+
className
|
|
3667
3771
|
}) => {
|
|
3668
|
-
const containerRef = useRef2(
|
|
3772
|
+
const containerRef = useRef2(null);
|
|
3669
3773
|
const [isMounted, setIsMounted] = useState7(false);
|
|
3774
|
+
const [toasts, setToasts] = useState7([]);
|
|
3670
3775
|
useEffect5(() => {
|
|
3671
3776
|
const container = document.createElement("div");
|
|
3672
3777
|
container.id = "toast-root";
|
|
3673
3778
|
container.className = "fixed z-50 p-4";
|
|
3674
3779
|
document.body.appendChild(container);
|
|
3675
|
-
containerRef.current =
|
|
3780
|
+
containerRef.current = container;
|
|
3676
3781
|
setIsMounted(true);
|
|
3782
|
+
const unsubscribe = toastService.subscribe(setToasts);
|
|
3677
3783
|
return () => {
|
|
3784
|
+
unsubscribe();
|
|
3678
3785
|
container.remove();
|
|
3679
3786
|
};
|
|
3680
3787
|
}, []);
|
|
@@ -3695,30 +3802,23 @@ var ToastContainer = ({
|
|
|
3695
3802
|
positionClasses[position],
|
|
3696
3803
|
className
|
|
3697
3804
|
),
|
|
3698
|
-
children
|
|
3805
|
+
children: toasts.map((toast) => /* @__PURE__ */ jsx19(Toast, { ...toast }, toast.id))
|
|
3699
3806
|
}
|
|
3700
3807
|
);
|
|
3701
3808
|
};
|
|
3702
|
-
var
|
|
3703
|
-
|
|
3704
|
-
|
|
3705
|
-
|
|
3706
|
-
|
|
3707
|
-
setToasts((prev) => [...prev, { ...toast, id }]);
|
|
3708
|
-
return id;
|
|
3809
|
+
var useToast = () => {
|
|
3810
|
+
return {
|
|
3811
|
+
showToast: (toast) => toastService.showToast(toast),
|
|
3812
|
+
hideToast: (id) => toastService.hideToast(id),
|
|
3813
|
+
clearToasts: () => toastService.clearToasts()
|
|
3709
3814
|
};
|
|
3710
|
-
|
|
3711
|
-
|
|
3712
|
-
return /* @__PURE__ */ jsxs11(
|
|
3815
|
+
};
|
|
3816
|
+
var ToastProvider = ({ position = "top-right", children }) => {
|
|
3817
|
+
return /* @__PURE__ */ jsxs11(Fragment, { children: [
|
|
3713
3818
|
children,
|
|
3714
|
-
/* @__PURE__ */ jsx19(ToastContainer, { position
|
|
3819
|
+
/* @__PURE__ */ jsx19(ToastContainer, { position })
|
|
3715
3820
|
] });
|
|
3716
3821
|
};
|
|
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
3822
|
Toast.displayName = "Toast";
|
|
3723
3823
|
ToastContainer.displayName = "ToastContainer";
|
|
3724
3824
|
export {
|
|
@@ -3741,8 +3841,8 @@ export {
|
|
|
3741
3841
|
TextInput,
|
|
3742
3842
|
Toast,
|
|
3743
3843
|
ToastContainer,
|
|
3744
|
-
ToastContext,
|
|
3745
3844
|
ToastProvider,
|
|
3746
3845
|
Toggle,
|
|
3846
|
+
toastService,
|
|
3747
3847
|
useToast
|
|
3748
3848
|
};
|
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-2{left:.5rem}.right-0{right:0}.top-0{top:0}.top-2\.5{top:.625rem}.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}.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))}}
|