@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 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.replace(/\D/g, "");
2906
- if (result.length > 11) result = result.substring(0, 11);
2907
- if (result.length > 10)
2908
- result = result.replace(/(\d{2})(\d{5})(\d+)/, "($1) $2-$3");
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
- valid = /^\(\d{2}\) \d{5}-\d{4}$/.test(value2);
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-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",
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.jsx)(
3043
- "input",
3044
- {
3045
- type: getInputType(),
3046
- required,
3047
- disabled,
3048
- ref,
3049
- id,
3050
- className: inputClasses,
3051
- onClick,
3052
- onFocus: handleFocus,
3053
- onChange: handleInput,
3054
- onBlur: handleBlur,
3055
- placeholder,
3056
- value: inputValue,
3057
- "aria-invalid": error,
3058
- "aria-describedby": error ? `${id}-error` : helperText ? `${id}-helper` : void 0,
3059
- ...rest
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 = __toESM(require("react"), 1);
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)({ current: null });
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 = { current: container };
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 ToastContext = import_react8.default.createContext(void 0);
3750
- var ToastProvider = ({ position = "top-right", children }) => {
3751
- const [toasts, setToasts] = (0, import_react8.useState)([]);
3752
- const showToast = (toast) => {
3753
- const id = `toast-${Date.now()}`;
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
- const hideToast = (id) => setToasts((prev) => prev.filter((toast) => toast.id !== id));
3758
- const clearToasts = () => setToasts([]);
3759
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(ToastContext.Provider, { value: { showToast, hideToast, clearToasts }, children: [
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, children: toasts.map((toast) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Toast, { ...toast, onDismiss: hideToast }, toast.id)) })
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 React$1 from 'react';
3
- import React__default, { DetailedHTMLProps, HTMLAttributes, ReactNode, ButtonHTMLAttributes, AnchorHTMLAttributes, InputHTMLAttributes, ChangeEvent, TextareaHTMLAttributes, FormHTMLAttributes } from 'react';
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: React$1.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & React$1.RefAttributes<HTMLButtonElement>>;
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: React$1.ForwardRefExoticComponent<Omit<InputProps, "ref"> & React$1.RefAttributes<HTMLInputElement>>;
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: React$1.ForwardRefExoticComponent<Omit<TextInputProps, "ref"> & React$1.RefAttributes<HTMLInputElement>>;
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: React__default.FC<SkeletonProps>;
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: React__default.FC<LoadingProps>;
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 const Toast: React__default.FC<ToastProps>;
224
- declare const ToastContainer: React__default.FC<ToastContainerProps & {
225
- children?: React__default.ReactNode;
226
- }>;
227
- type ToastItem = Omit<ToastProps, 'onDismiss'>;
228
- interface ToastContextType {
229
- showToast: (toast: Omit<ToastItem, 'id'>) => string;
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 ToastContext: React__default.Context<ToastContextType | undefined>;
234
- declare const ToastProvider: React__default.FC<{
248
+ };
249
+ declare const ToastProvider: react__default.FC<{
235
250
  position?: ToastPosition;
236
- children: React__default.ReactNode;
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, ToastContext, type ToastPosition, type ToastProps, ToastProvider, type ToastVariant, Toggle, type ToggleProps, useToast };
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 React$1 from 'react';
3
- import React__default, { DetailedHTMLProps, HTMLAttributes, ReactNode, ButtonHTMLAttributes, AnchorHTMLAttributes, InputHTMLAttributes, ChangeEvent, TextareaHTMLAttributes, FormHTMLAttributes } from 'react';
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: React$1.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & React$1.RefAttributes<HTMLButtonElement>>;
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: React$1.ForwardRefExoticComponent<Omit<InputProps, "ref"> & React$1.RefAttributes<HTMLInputElement>>;
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: React$1.ForwardRefExoticComponent<Omit<TextInputProps, "ref"> & React$1.RefAttributes<HTMLInputElement>>;
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: React__default.FC<SkeletonProps>;
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: React__default.FC<LoadingProps>;
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 const Toast: React__default.FC<ToastProps>;
224
- declare const ToastContainer: React__default.FC<ToastContainerProps & {
225
- children?: React__default.ReactNode;
226
- }>;
227
- type ToastItem = Omit<ToastProps, 'onDismiss'>;
228
- interface ToastContextType {
229
- showToast: (toast: Omit<ToastItem, 'id'>) => string;
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 ToastContext: React__default.Context<ToastContextType | undefined>;
234
- declare const ToastProvider: React__default.FC<{
248
+ };
249
+ declare const ToastProvider: react__default.FC<{
235
250
  position?: ToastPosition;
236
- children: React__default.ReactNode;
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, ToastContext, type ToastPosition, type ToastProps, ToastProvider, type ToastVariant, Toggle, type ToggleProps, useToast };
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.replace(/\D/g, "");
2852
- if (result.length > 11) result = result.substring(0, 11);
2853
- if (result.length > 10)
2854
- result = result.replace(/(\d{2})(\d{5})(\d+)/, "($1) $2-$3");
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
- valid = /^\(\d{2}\) \d{5}-\d{4}$/.test(value2);
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-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",
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__ */ jsx6(
2989
- "input",
2990
- {
2991
- type: getInputType(),
2992
- required,
2993
- disabled,
2994
- ref,
2995
- id,
2996
- className: inputClasses,
2997
- onClick,
2998
- onFocus: handleFocus,
2999
- onChange: handleInput,
3000
- onBlur: handleBlur,
3001
- placeholder,
3002
- value: inputValue,
3003
- "aria-invalid": error,
3004
- "aria-describedby": error ? `${id}-error` : helperText ? `${id}-helper` : void 0,
3005
- ...rest
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 React, { useEffect as useEffect5, useState as useState7, useRef as useRef2 } from "react";
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({ current: null });
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 = { current: container };
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 ToastContext = React.createContext(void 0);
3703
- var ToastProvider = ({ position = "top-right", children }) => {
3704
- const [toasts, setToasts] = useState7([]);
3705
- const showToast = (toast) => {
3706
- const id = `toast-${Date.now()}`;
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
- const hideToast = (id) => setToasts((prev) => prev.filter((toast) => toast.id !== id));
3711
- const clearToasts = () => setToasts([]);
3712
- return /* @__PURE__ */ jsxs11(ToastContext.Provider, { value: { showToast, hideToast, clearToasts }, children: [
3814
+ };
3815
+ var ToastProvider = ({ position = "top-right", children }) => {
3816
+ return /* @__PURE__ */ jsxs11(Fragment, { children: [
3713
3817
  children,
3714
- /* @__PURE__ */ jsx19(ToastContainer, { position, children: toasts.map((toast) => /* @__PURE__ */ jsx19(Toast, { ...toast, onDismiss: hideToast }, toast.id)) })
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koaris/bloom-ui",
3
- "version": "1.2.3",
3
+ "version": "1.2.5",
4
4
  "description": "Bloom-ui is a public design system from the Koaris Project developed with React, Typescript, and Tailwind.",
5
5
  "source": "./src/index.ts",
6
6
  "type": "module",
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))}}