@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 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.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");
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
- valid = /^\(\d{2}\) \d{5}-\d{4}$/.test(value2);
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.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
- ),
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 = __toESM(require("react"), 1);
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)({ current: null });
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 = { current: container };
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 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;
3846
+ var useToast = () => {
3847
+ return {
3848
+ showToast: (toast) => toastService.showToast(toast),
3849
+ hideToast: (id) => toastService.hideToast(id),
3850
+ clearToasts: () => toastService.clearToasts()
3756
3851
  };
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: [
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, children: toasts.map((toast) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Toast, { ...toast, onDismiss: hideToast }, toast.id)) })
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 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,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.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");
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
- valid = /^\(\d{2}\) \d{5}-\d{4}$/.test(value2);
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__ */ 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
- ),
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 React, { useEffect as useEffect5, useState as useState7, useRef as useRef2 } from "react";
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({ current: null });
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 = { current: container };
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 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;
3809
+ var useToast = () => {
3810
+ return {
3811
+ showToast: (toast) => toastService.showToast(toast),
3812
+ hideToast: (id) => toastService.hideToast(id),
3813
+ clearToasts: () => toastService.clearToasts()
3709
3814
  };
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: [
3815
+ };
3816
+ var ToastProvider = ({ position = "top-right", children }) => {
3817
+ return /* @__PURE__ */ jsxs11(Fragment, { children: [
3713
3818
  children,
3714
- /* @__PURE__ */ jsx19(ToastContainer, { position, children: toasts.map((toast) => /* @__PURE__ */ jsx19(Toast, { ...toast, onDismiss: hideToast }, toast.id)) })
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koaris/bloom-ui",
3
- "version": "1.2.3",
3
+ "version": "1.2.4",
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-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))}}